using System.Security.Claims; using System.Text; using JobTrackerApi.Controllers; using JobTrackerApi.Models; using JobTrackerApi.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Moq; using Xunit; namespace JobTrackerApi.Tests; public sealed class ProfileCvControllerTests { [Fact] public async Task Upload_rejects_unsupported_extension() { var user = new ApplicationUser(); var userManager = CreateUserManager(); userManager.Setup(x => x.GetUserAsync(It.IsAny())).ReturnsAsync(user); var aiService = new Mock(); var controller = new ProfileCvController(userManager.Object, aiService.Object) { ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() } }; var file = new FormFile(new MemoryStream(Encoding.UTF8.GetBytes("hello")), 0, 5, "file", "resume.exe"); var result = await controller.Upload(file); var badRequest = Assert.IsType(result); Assert.True((badRequest.Value?.ToString() ?? string.Empty).Contains("supported", StringComparison.OrdinalIgnoreCase)); } [Fact] public async Task Upload_accepts_markdown_cv_and_saves_text() { var user = new ApplicationUser(); var userManager = CreateUserManager(); userManager.Setup(x => x.GetUserAsync(It.IsAny())).ReturnsAsync(user); userManager.Setup(x => x.UpdateAsync(user)).ReturnsAsync(IdentityResult.Success); var aiService = new Mock(); aiService .Setup(x => x.ExtractTextAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new AiTextExtractionResult("# CV\nBuilt APIs and UIs", false, "text/markdown", null, 22, "resume.md")); var controller = new ProfileCvController(userManager.Object, aiService.Object) { ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() } }; var file = new FormFile(new MemoryStream(Encoding.UTF8.GetBytes("# CV\nBuilt APIs and UIs")), 0, 23, "file", "resume.md"); var result = await controller.Upload(file); Assert.IsType(result); Assert.Contains("Built APIs", user.ProfileCvText); } private static Mock> CreateUserManager() { var store = new Mock>(); return new Mock>( store.Object, Options.Create(new IdentityOptions()), new PasswordHasher(), Array.Empty>(), Array.Empty>(), new UpperInvariantLookupNormalizer(), new IdentityErrorDescriber(), null!, new NullLogger>() ); } }