From c1910e53102c8f8453ac068d37997267de0ab407 Mon Sep 17 00:00:00 2001 From: Alexandre Brandizzi Date: Fri, 25 Sep 2026 11:41:33 -0300 Subject: [PATCH] test(work-orders): pin severity-then-type correction from Overdue The board sends one PATCH per field, severity before workOrderType, so correcting an Overdue work order to Emergency or Reactive patches the severity while the stored type is still Overdue. Dropping or rejecting a severity patch for the current type would leave the corrected Emergency work order with no severity. Overdue's no-severity rule is enforced when the type changes, not on the severity patch. --- .../WorkOrderOverdueTypeTests.cs | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) 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() {