using System.Security.Claims; using JobTrackerApi.Controllers; using JobTrackerApi.Data; using JobTrackerApi.Models; using JobTrackerApi.Services; using JobTrackerApi.Tests.TestSupport; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging.Abstractions; using Moq; using Xunit; namespace JobTrackerApi.Tests; public sealed class JobApplicationsEndpointBehaviorTests { [Fact] public async Task Save_application_drafts_updates_cover_letter_and_notes() { await using var db = CreateDb(); var company = new Company { Name = "Acme", OwnerUserId = "user-1" }; db.Companies.Add(company); await db.SaveChangesAsync(); var job = new JobApplication { JobTitle = "Backend Dev", CompanyId = company.Id, OwnerUserId = "user-1" }; db.JobApplications.Add(job); await db.SaveChangesAsync(); var controller = CreateController(db, "user-1"); var result = await controller.SaveApplicationDrafts(job.Id, new JobApplicationsController.SaveApplicationDraftsRequest(" Cover letter body ", " Notes body ", null), CancellationToken.None); Assert.IsType(result); var saved = await db.JobApplications.FirstAsync(); Assert.Equal("Cover letter body", saved.CoverLetterText); Assert.Contains("Notes body", saved.Notes); } [Fact] public async Task Generate_application_package_rejects_missing_profile_cv() { await using var db = CreateDb(); var company = new Company { Name = "Acme", OwnerUserId = "user-1" }; db.Companies.Add(company); db.Users.Add(new ApplicationUser { Id = "user-1", UserName = "u", Email = "u@example.com" }); await db.SaveChangesAsync(); var job = new JobApplication { JobTitle = "Backend Dev", CompanyId = company.Id, OwnerUserId = "user-1", Description = "Need .NET and SQL" }; db.JobApplications.Add(job); await db.SaveChangesAsync(); var controller = CreateController(db, "user-1"); var result = await controller.GenerateApplicationPackage(job.Id, null, null, null, CancellationToken.None); var badRequest = Assert.IsType(result.Result); Assert.Contains("Profile page", badRequest.Value?.ToString()); } private static JobApplicationsController CreateController(JobTrackerContext db, string userId) { var summarizer = new Mock(); summarizer.Setup(x => x.SummarizeSectionAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync("generated text"); var users = CreateUserManager(); var controller = new JobApplicationsController(db, summarizer.Object, Mock.Of(), users.Object, NullLogger.Instance); controller.ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext { User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, userId) }, "test")) } }; return controller; } private static Mock> CreateUserManager() { return TestHostFactory.CreateUserManager(); } private static JobTrackerContext CreateDb() { return TestHostFactory.CreateInMemoryDb(); } }