From 12354f9bf7ef4eb4a9a1867f096118b94c95055b Mon Sep 17 00:00:00 2001 From: Arthur Bassi Date: Tue, 8 Sep 2026 16:24:45 -0300 Subject: [PATCH] test(work-orders): cover SH-186 schedule status derivation --- .../WorkOrderBoardCreateServiceTests.cs | 39 +++++++- .../WorkOrderBoardUpdateServiceTests.cs | 99 ++++++++++++++++++- 2 files changed, 136 insertions(+), 2 deletions(-) diff --git a/SeaHavenIndustries.Tests/WorkOrderBoardCreateServiceTests.cs b/SeaHavenIndustries.Tests/WorkOrderBoardCreateServiceTests.cs index cdf7559..0da2c56 100644 --- a/SeaHavenIndustries.Tests/WorkOrderBoardCreateServiceTests.cs +++ b/SeaHavenIndustries.Tests/WorkOrderBoardCreateServiceTests.cs @@ -106,6 +106,40 @@ public class WorkOrderBoardCreateServiceTests Assert.Equal("DuplicateWoNumber", ex.Code); } + [Fact] + public async Task Create_AutoSchedulesWhenDateWithoutAssignee() + { + var (_, service) = CreateSut(); + + var result = await service.CreateAsync(new WorkOrderBoardCreateRequestDto + { + WorkOrderType = WorkOrderType.PM, + SiteCode = "BK5", + LocationId = 1, + ScheduledDate = new DateTime(2026, 6, 25) + }, WorkOrderAccountTestHelpers.AccountUser(), "actor-1"); + + Assert.Equal(LifecycleStatus.Scheduled, result.LifecycleStatus); + Assert.Equal(new DateTime(2026, 6, 25), result.ScheduledDate); + } + + [Fact] + public async Task Create_PendingWithDate_PromotesToScheduled() + { + var (_, service) = CreateSut(); + + var result = await service.CreateAsync(new WorkOrderBoardCreateRequestDto + { + WorkOrderType = WorkOrderType.PM, + SiteCode = "BK5", + LocationId = 1, + LifecycleStatus = LifecycleStatus.Pending, + ScheduledDate = new DateTime(2026, 6, 25) + }, WorkOrderAccountTestHelpers.AccountUser(), "actor-1"); + + Assert.Equal(LifecycleStatus.Scheduled, result.LifecycleStatus); + } + [Fact] public async Task Create_AutoSchedulesWhenDateAndAssignee() { @@ -140,6 +174,7 @@ public class WorkOrderBoardCreateServiceTests Assert.True(result.ScheduleWeekOnly); Assert.Equal(new DateOnly(2026, 6, 22), result.TargetWeek); + Assert.Equal(LifecycleStatus.Incomplete, result.LifecycleStatus); } [Fact] @@ -695,7 +730,7 @@ public class WorkOrderBoardCreateServiceTests { var (_, service) = CreateSut(); - await Assert.ThrowsAsync(() => + var ex = await Assert.ThrowsAsync(() => service.CreateAsync(new WorkOrderBoardCreateRequestDto { WorkOrderType = WorkOrderType.PM, @@ -703,6 +738,8 @@ public class WorkOrderBoardCreateServiceTests LocationId = 1, LifecycleStatus = LifecycleStatus.Scheduled, }, WorkOrderAccountTestHelpers.AccountUser(), "actor-1")); + + Assert.Equal("ScheduledRequiresDate", ex.Code); } [Fact] diff --git a/SeaHavenIndustries.Tests/WorkOrderBoardUpdateServiceTests.cs b/SeaHavenIndustries.Tests/WorkOrderBoardUpdateServiceTests.cs index f37686e..967b115 100644 --- a/SeaHavenIndustries.Tests/WorkOrderBoardUpdateServiceTests.cs +++ b/SeaHavenIndustries.Tests/WorkOrderBoardUpdateServiceTests.cs @@ -62,7 +62,6 @@ public class WorkOrderBoardUpdateServiceTests { Id = 1, LifecycleStatus = LifecycleStatus.Incomplete, - AssignTo = "user-a", RowVersion = new byte[] { 1, 0, 0, 0, 0, 0, 0, 1 } }; context.workOrders.Add(wo); @@ -83,6 +82,104 @@ public class WorkOrderBoardUpdateServiceTests Assert.Contains(audits, a => a.Action == AuditActionType.StatusChanged.ToString()); } + [Fact] + public async Task PatchField_PendingWithDate_PromotesToScheduled() + { + var (context, service) = CreateSut(); + var wo = new WorkOrder + { + Id = 1, + LifecycleStatus = LifecycleStatus.Pending, + RowVersion = new byte[] { 1, 0, 0, 0, 0, 0, 0, 1 } + }; + context.workOrders.Add(wo); + await context.SaveChangesAsync(); + + var result = await service.PatchFieldAsync(1, new WorkOrderBoardPatchRequestDto + { + Field = WorkOrderBoardFieldNames.ScheduledDate, + Value = "2026-06-25", + WorkOrderVersion = ToVersion(wo) + }, "actor-1"); + + Assert.Equal(LifecycleStatus.Scheduled, result.LifecycleStatus); + } + + [Fact] + public async Task PatchField_ClearsScheduledDate_DemotesToPending() + { + var (context, service) = CreateSut(); + var wo = new WorkOrder + { + Id = 1, + LifecycleStatus = LifecycleStatus.Scheduled, + ScheduledDate = new DateTime(2026, 6, 25), + RowVersion = new byte[] { 1, 0, 0, 0, 0, 0, 0, 1 } + }; + context.workOrders.Add(wo); + await context.SaveChangesAsync(); + + var result = await service.PatchFieldAsync(1, new WorkOrderBoardPatchRequestDto + { + Field = WorkOrderBoardFieldNames.ScheduledDate, + Value = null, + WorkOrderVersion = ToVersion(wo) + }, "actor-1"); + + Assert.Equal(LifecycleStatus.Pending, result.LifecycleStatus); + Assert.Null(result.ScheduledDate); + } + + [Fact] + public async Task PatchField_ScheduleWeekOnly_DemotesScheduledToPending() + { + var (context, service) = CreateSut(); + var wo = new WorkOrder + { + Id = 1, + LifecycleStatus = LifecycleStatus.Scheduled, + ScheduledDate = new DateTime(2026, 6, 25), + ScheduleWeekOnly = false, + RowVersion = new byte[] { 1, 0, 0, 0, 0, 0, 0, 1 } + }; + context.workOrders.Add(wo); + await context.SaveChangesAsync(); + + var result = await service.PatchFieldAsync(1, new WorkOrderBoardPatchRequestDto + { + Field = WorkOrderBoardFieldNames.ScheduleWeekOnly, + Value = "true", + WorkOrderVersion = ToVersion(wo) + }, "actor-1"); + + Assert.Equal(LifecycleStatus.Pending, result.LifecycleStatus); + Assert.True(result.ScheduleWeekOnly); + } + + [Fact] + public async Task PatchField_InProgress_ClearDate_DoesNotChangeStatus() + { + var (context, service) = CreateSut(); + var wo = new WorkOrder + { + Id = 1, + LifecycleStatus = LifecycleStatus.InProgress, + ScheduledDate = new DateTime(2026, 6, 25), + RowVersion = new byte[] { 1, 0, 0, 0, 0, 0, 0, 1 } + }; + context.workOrders.Add(wo); + await context.SaveChangesAsync(); + + var result = await service.PatchFieldAsync(1, new WorkOrderBoardPatchRequestDto + { + Field = WorkOrderBoardFieldNames.ScheduledDate, + Value = null, + WorkOrderVersion = ToVersion(wo) + }, "actor-1"); + + Assert.Equal(LifecycleStatus.InProgress, result.LifecycleStatus); + } + [Fact] public async Task PatchField_IncrementsRescheduleCount() {