diff --git a/SeaHavenIndustries.Tests/WorkOrderOverdueTypeTests.cs b/SeaHavenIndustries.Tests/WorkOrderOverdueTypeTests.cs index 35c04e6..7a1ee1e 100644 --- a/SeaHavenIndustries.Tests/WorkOrderOverdueTypeTests.cs +++ b/SeaHavenIndustries.Tests/WorkOrderOverdueTypeTests.cs @@ -183,6 +183,47 @@ public class WorkOrderOverdueTypeTests Assert.Null(persisted.Severity); } + // The board sends one request per field, severity before type, so correcting + // Overdue to Emergency patches severity while the stored type is still Overdue. + // A severity patch must not be dropped or rejected for the current type; the + // no-severity invariant is enforced when the type itself changes. + [Fact] + public async Task PatchSeverityThenType_OverdueToEmergency_KeepsSeverity() + { + await using var context = NewContext(); + var wo = new WorkOrder + { + Id = 1, + LifecycleStatus = LifecycleStatus.Scheduled, + WorkOrderType = WorkOrderType.Overdue, + RowVersion = new byte[] { 1, 0, 0, 0, 0, 0, 0, 1 } + }; + context.workOrders.Add(wo); + await context.SaveChangesAsync(); + var service = NewUpdateService(context); + + await service.PatchFieldAsync(1, new WorkOrderBoardPatchRequestDto + { + Field = WorkOrderBoardFieldNames.Severity, + Value = "2", + WorkOrderVersion = ToVersion(wo) + }, "actor-1"); + + var updated = await context.workOrders.SingleAsync(w => w.Id == 1); + var result = await service.PatchFieldAsync(1, new WorkOrderBoardPatchRequestDto + { + Field = WorkOrderBoardFieldNames.WorkOrderType, + Value = "Emergency", + WorkOrderVersion = ToVersion(updated) + }, "actor-1"); + + Assert.Equal(WorkOrderType.Emergency, result.WorkOrderType); + Assert.Equal(2, result.Severity); + var persisted = await context.workOrders.SingleAsync(w => w.Id == 1); + Assert.Equal(WorkOrderType.Emergency, persisted.WorkOrderType); + Assert.Equal("2", persisted.Severity); + } + [Fact] public async Task PatchType_PmWithPmService_ToOverdue_KeepsService() {