using Api.SeaHavenIndustries.Controllers; using Api.SeaHavenIndustries.DTOs; using Data.SeaHavenIndustries; using FluentAssertions; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Moq; using SeaHaven.DataServices.Interfaces; using SeaHaven.Services.DTOs; using SeaHaven.Services.Helpers; using SeaHaven.Services.Implementation; using SeaHaven.Services.Interfaces; using Xunit; namespace Api.SeaHavenIndustries.Tests; public class WorkOrderControllerSearchTests { private static ApplicationDbContext NewContext() { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(Guid.NewGuid().ToString()) .Options; return new ApplicationDbContext(options); } private static UserManager MockUserManager() { var store = new Mock>(); return new Mock>( store.Object, null!, null!, null!, null!, null!, null!, null!, null!).Object; } private static WorkOrderController NewController( ApplicationDbContext ctx, IWorkOrderAdvancedSearchService advancedSearch) { var controller = new WorkOrderController( MockUserManager(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), ctx, Mock.Of(), Mock.Of(), null!, null!, Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), advancedSearch); controller.ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext { User = new System.Security.Claims.ClaimsPrincipal( new System.Security.Claims.ClaimsIdentity( new[] { new System.Security.Claims.Claim( System.Security.Claims.ClaimTypes.NameIdentifier, "test-user") }, "Test")) } }; return controller; } [Fact] public async Task SearchBoard_WhenCustomPresetMissingDates_ReturnsBadRequest() { using var ctx = NewContext(); var advancedSearch = new WorkOrderAdvancedSearchService( Mock.Of()); var controller = NewController(ctx, advancedSearch); var result = await controller.SearchBoard(new WorkOrderAdvancedSearchQueryDto { DatePreset = WorkOrderAdvancedSearchDatePreset.Custom }); var badRequest = result.Should().BeOfType().Subject; var body = badRequest.Value.Should().BeOfType().Subject; body.Status.Should().Be("Error"); body.Message.Should().Contain("dateFrom"); } }