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.Implementation; 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, Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of()); 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"); } [Fact] public async Task GetBoard_WhenWeekEndBeforeWeekStart_ReturnsBadRequest() { using var ctx = NewContext(); var boardService = new WorkOrderBoardService(new WorkOrderBoardDataService(ctx)); var controller = NewController(ctx, Mock.Of()); // Replace board service - controller uses injected mock. Need different approach. // Use real board service via manual controller setup var advancedSearch = Mock.Of(); var controllerWithBoard = 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(), boardService, Mock.Of(), Mock.Of(), Mock.Of(), advancedSearch, Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of()); controllerWithBoard.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")) } }; var result = await controllerWithBoard.GetBoard( new DateOnly(2026, 6, 22), new DateOnly(2026, 6, 15)); var badRequest = result.Should().BeOfType().Subject; var body = badRequest.Value.Should().BeOfType().Subject; body.Status.Should().Be("Error"); body.Message.Should().Contain("weekEnd"); } }