From 76e839addfdb4a8cf00d3e4be3a0870f39c897f4 Mon Sep 17 00:00:00 2001 From: Arthur Bassi Date: Tue, 30 Jun 2026 13:20:42 -0300 Subject: [PATCH] test(work-orders): cover FE-aligned mappers and derived field logic --- .../WorkOrderDerivedFieldsTests.cs | 75 +++++++++++++++++++ .../WorkOrderTypeMapperTests.cs | 32 ++++++++ 2 files changed, 107 insertions(+) create mode 100644 SeaHavenIndustries.Tests/WorkOrderDerivedFieldsTests.cs create mode 100644 SeaHavenIndustries.Tests/WorkOrderTypeMapperTests.cs diff --git a/SeaHavenIndustries.Tests/WorkOrderDerivedFieldsTests.cs b/SeaHavenIndustries.Tests/WorkOrderDerivedFieldsTests.cs new file mode 100644 index 0000000..0d1f61c --- /dev/null +++ b/SeaHavenIndustries.Tests/WorkOrderDerivedFieldsTests.cs @@ -0,0 +1,75 @@ +using Data.SeaHavenIndustries; +using Data.SeaHavenIndustries.Enums; +using SeaHaven.Services.Helpers; + +namespace SeaHavenIndustries.Tests; + +public class WorkOrderDerivedFieldsTests +{ + [Fact] + public void IsPastDue_WhenScheduledBeforeTodayAndNotTerminal_ReturnsTrue() + { + var wo = new WorkOrder + { + ScheduledDate = DateTime.UtcNow.AddDays(-2), + LifecycleStatus = LifecycleStatus.Scheduled + }; + + Assert.True(WorkOrderDerivedFields.IsPastDue(wo, DateOnly.FromDateTime(DateTime.UtcNow))); + } + + [Fact] + public void IsPastDue_WhenCompleted_ReturnsFalse() + { + var wo = new WorkOrder + { + ScheduledDate = DateTime.UtcNow.AddDays(-2), + LifecycleStatus = LifecycleStatus.Completed + }; + + Assert.False(WorkOrderDerivedFields.IsPastDue(wo, DateOnly.FromDateTime(DateTime.UtcNow))); + } + + [Fact] + public void ApplyAutoSchedule_WhenDateAndAssignee_PromotesToScheduled() + { + var wo = new WorkOrder + { + LifecycleStatus = LifecycleStatus.Incomplete, + ScheduledDate = new DateTime(2026, 6, 25), + AssignTo = "dispatcher-1" + }; + + Assert.True(WorkOrderDerivedFields.ApplyAutoScheduleIfEligible(wo)); + Assert.Equal(LifecycleStatus.Scheduled, wo.LifecycleStatus); + } + + [Fact] + public void ApplyAutoSchedule_WeekOnly_DoesNotPromote() + { + var wo = new WorkOrder + { + LifecycleStatus = LifecycleStatus.Incomplete, + ScheduledDate = new DateTime(2026, 6, 25), + AssignTo = "dispatcher-1", + ScheduleWeekOnly = true, + TargetWeek = new DateOnly(2026, 6, 22) + }; + + Assert.False(WorkOrderDerivedFields.ApplyAutoScheduleIfEligible(wo)); + Assert.Equal(LifecycleStatus.Incomplete, wo.LifecycleStatus); + } + + [Fact] + public void SetInitialLifecycleStatus_NewWo_StartsIncompleteThenAutoSchedules() + { + var wo = new WorkOrder + { + ScheduledDate = new DateTime(2026, 6, 25), + AssignTo = "dispatcher-1" + }; + + WorkOrderDerivedFields.SetInitialLifecycleStatus(wo); + Assert.Equal(LifecycleStatus.Scheduled, wo.LifecycleStatus); + } +} diff --git a/SeaHavenIndustries.Tests/WorkOrderTypeMapperTests.cs b/SeaHavenIndustries.Tests/WorkOrderTypeMapperTests.cs new file mode 100644 index 0000000..b25bcd5 --- /dev/null +++ b/SeaHavenIndustries.Tests/WorkOrderTypeMapperTests.cs @@ -0,0 +1,32 @@ +using Data.SeaHavenIndustries.Enums; +using SeaHaven.Services.Helpers; + +namespace SeaHavenIndustries.Tests; + +public class WorkOrderTypeMapperTests +{ + [Theory] + [InlineData("PM", WorkOrderType.PM)] + [InlineData("Reactive", WorkOrderType.Reactive)] + [InlineData("Emergency", WorkOrderType.Emergency)] + [InlineData("Add-On", WorkOrderType.AddOn)] + public void TryParseFeLabel_BoardTypes(string label, WorkOrderType expected) + { + Assert.True(WorkOrderTypeMapper.TryParseFeLabel(label, out var type)); + Assert.Equal(expected, type); + } + + [Fact] + public void TryParseFeLabel_Overdue_ReturnsFalse() + { + Assert.False(WorkOrderTypeMapper.TryParseFeLabel("Overdue", out _)); + } + + [Theory] + [InlineData(WorkOrderType.AddOn, "Add-On")] + [InlineData(WorkOrderType.Reactive, "Reactive")] + public void ToFeLabel_ReturnsBoardLabel(WorkOrderType type, string expected) + { + Assert.Equal(expected, WorkOrderTypeMapper.ToFeLabel(type)); + } +}