using Data.SeaHavenIndustries; using Data.SeaHavenIndustries.Enums; using Microsoft.EntityFrameworkCore; using SeaHaven.DataServices.Implementation; using SeaHaven.DataServices.Interfaces; using SeaHaven.Services.DTOs; using SeaHaven.Services.Implementation; namespace SeaHavenIndustries.Tests; public class WorkOrderBoardDataServiceTests { private static ApplicationDbContext CreateContext() { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(Guid.NewGuid().ToString()) .Options; return new ApplicationDbContext(options); } [Fact] public async Task GetBoardRows_ReturnsScheduledInWeekAndUnscheduled() { await using var context = CreateContext(); var weekStart = new DateOnly(2026, 6, 22); context.Vendors.Add(new Vendor { Id = 1, CompanyName = "Acme HVAC", ContactName = "Tech", Phone = "555-0100" }); context.Dispatches.Add(new Dispatch { Id = 10, VendorId = 1, ScheduledDate = new DateTime(2026, 6, 24, 8, 0, 0) }); context.workOrders.AddRange( new WorkOrder { Id = 1, InternalWONumber = "10000000001", ScheduledDate = new DateTime(2026, 6, 23), LifecycleStatus = LifecycleStatus.Scheduled, PrimaryDispatchId = 10, SiteCode = "BK5" }, new WorkOrder { Id = 2, InternalWONumber = "10000000002", ScheduledDate = null, LifecycleStatus = LifecycleStatus.Incomplete, SiteCode = "BK6" }, new WorkOrder { Id = 3, InternalWONumber = "10000000003", ScheduledDate = new DateTime(2026, 7, 1), LifecycleStatus = LifecycleStatus.Scheduled }); await context.SaveChangesAsync(); var service = new WorkOrderBoardDataService(context); var result = await service.GetBoardRowsAsync(new WorkOrderBoardQuery( weekStart, weekStart.AddDays(4), null, false, null, false, null, null)); Assert.Single(result.ScheduledRows); Assert.Equal(1, result.ScheduledRows[0].Id); Assert.Equal("Acme HVAC", result.ScheduledRows[0].VendorName); Assert.Single(result.UnscheduledRows); Assert.Equal(2, result.UnscheduledRows[0].Id); Assert.Equal(1, result.ScheduledTotalBeforeSearch); } [Fact] public async Task GetBoardRows_FiltersByDispatcher() { await using var context = CreateContext(); var weekStart = new DateOnly(2026, 6, 22); context.workOrders.AddRange( new WorkOrder { Id = 1, AssignTo = "user-a", ScheduledDate = new DateTime(2026, 6, 23), LifecycleStatus = LifecycleStatus.Scheduled }, new WorkOrder { Id = 2, AssignTo = "user-b", ScheduledDate = new DateTime(2026, 6, 24), LifecycleStatus = LifecycleStatus.Scheduled }); await context.SaveChangesAsync(); var service = new WorkOrderBoardDataService(context); var result = await service.GetBoardRowsAsync(new WorkOrderBoardQuery( weekStart, weekStart.AddDays(4), new[] { "user-a" }, false, null, false, null, null)); Assert.Single(result.ScheduledRows); Assert.Equal("user-a", result.ScheduledRows[0].AssignTo); } [Fact] public async Task GetBoardRows_MyWorkOrders_FiltersCurrentUser() { await using var context = CreateContext(); var weekStart = new DateOnly(2026, 6, 22); context.workOrders.AddRange( new WorkOrder { Id = 1, AssignTo = "me", ScheduledDate = new DateTime(2026, 6, 23), LifecycleStatus = LifecycleStatus.Scheduled }, new WorkOrder { Id = 2, AssignTo = "other", ScheduledDate = new DateTime(2026, 6, 23), LifecycleStatus = LifecycleStatus.Scheduled }); await context.SaveChangesAsync(); var service = new WorkOrderBoardDataService(context); var result = await service.GetBoardRowsAsync(new WorkOrderBoardQuery( weekStart, weekStart.AddDays(4), null, true, null, false, null, "me")); Assert.Single(result.ScheduledRows); Assert.Equal(1, result.ScheduledRows[0].Id); } } public class WorkOrderBoardServiceTests { private static ApplicationDbContext CreateContext() { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(Guid.NewGuid().ToString()) .Options; return new ApplicationDbContext(options); } [Fact] public async Task GetBoardAsync_ComputesCountsAndPastDue() { await using var context = CreateContext(); var weekStart = new DateOnly(2026, 6, 22); context.workOrders.Add(new WorkOrder { Id = 1, InternalWONumber = "10000000001", ScheduledDate = new DateTime(2026, 6, 24, 12, 0, 0, DateTimeKind.Utc), LifecycleStatus = LifecycleStatus.Scheduled }); await context.SaveChangesAsync(); var dataService = new WorkOrderBoardDataService(context); var boardService = new WorkOrderBoardService(dataService); var response = await boardService.GetBoardAsync(new WorkOrderBoardQueryDto { WeekStart = weekStart }, null); Assert.Equal(1, response.Counts.Total); Assert.Single(response.Scheduled); Assert.True(response.Scheduled[0].IsPastDue); Assert.Equal("wednesday", response.Scheduled[0].DayGroup); } [Fact] public async Task GetBoardAsync_InvalidWeekWindow_Throws() { await using var context = CreateContext(); var boardService = new WorkOrderBoardService(new WorkOrderBoardDataService(context)); await Assert.ThrowsAsync(() => boardService.GetBoardAsync(new WorkOrderBoardQueryDto { WeekStart = new DateOnly(2026, 6, 22), WeekEnd = new DateOnly(2026, 6, 15) }, null)); } }