using System.Security.Claims; using JobTrackerApi.Controllers; using JobTrackerApi.Data; using JobTrackerApi.Models; using JobTrackerApi.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; 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 "), 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, 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 controller = new JobApplicationsController(db, summarizer.Object, Mock.Of()); controller.ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext { User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, userId) }, "test")) } }; return controller; } private static JobTrackerContext CreateDb() { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(Guid.NewGuid().ToString()) .Options; var currentUser = new Mock(); currentUser.SetupGet(x => x.UserId).Returns("user-1"); return new JobTrackerContext(options, currentUser.Object); } }