mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-09-30 07:13:12 +00:00
Past Due must track the deadline (Due Date), not Schedule On. Keep dueDate and scheduledDate PATCH mutations independent so rescheduling alone does not clear Past Due.
126 lines
3.7 KiB
C#
126 lines
3.7 KiB
C#
using Data.SeaHavenIndustries;
|
|
using Data.SeaHavenIndustries.Enums;
|
|
using SeaHaven.Services.Helpers;
|
|
|
|
namespace SeaHavenIndustries.Tests;
|
|
|
|
public class WorkOrderDerivedFieldsTests
|
|
{
|
|
private static readonly DateOnly Today = DateOnly.FromDateTime(DateTime.UtcNow);
|
|
private static readonly DateTime Past = DateTime.UtcNow.Date.AddDays(-2);
|
|
private static readonly DateTime Future = DateTime.UtcNow.Date.AddDays(3);
|
|
private static readonly DateTime TodayDate = DateTime.UtcNow.Date;
|
|
|
|
[Fact]
|
|
public void IsPastDue_WhenDuePastAndScheduleFuture_ReturnsTrue()
|
|
{
|
|
var wo = new WorkOrder
|
|
{
|
|
DueDate = Past,
|
|
ScheduledDate = Future,
|
|
LifecycleStatus = LifecycleStatus.Scheduled
|
|
};
|
|
|
|
Assert.True(WorkOrderDerivedFields.IsPastDue(wo, Today));
|
|
Assert.True(WorkOrderDerivedFields.IsPastDue(wo.DueDate, wo.LifecycleStatus));
|
|
}
|
|
|
|
[Fact]
|
|
public void IsPastDue_WhenDueFutureAndSchedulePast_ReturnsFalse()
|
|
{
|
|
var wo = new WorkOrder
|
|
{
|
|
DueDate = Future,
|
|
ScheduledDate = Past,
|
|
LifecycleStatus = LifecycleStatus.Scheduled
|
|
};
|
|
|
|
Assert.False(WorkOrderDerivedFields.IsPastDue(wo, Today));
|
|
}
|
|
|
|
[Fact]
|
|
public void IsPastDue_WhenDueDateNull_ReturnsFalse()
|
|
{
|
|
var wo = new WorkOrder
|
|
{
|
|
DueDate = null,
|
|
ScheduledDate = Past,
|
|
LifecycleStatus = LifecycleStatus.Scheduled
|
|
};
|
|
|
|
Assert.False(WorkOrderDerivedFields.IsPastDue(wo, Today));
|
|
Assert.False(WorkOrderDerivedFields.IsPastDue(null, LifecycleStatus.Scheduled));
|
|
}
|
|
|
|
[Fact]
|
|
public void IsPastDue_WhenDueEqualsToday_ReturnsFalse()
|
|
{
|
|
var wo = new WorkOrder
|
|
{
|
|
DueDate = TodayDate,
|
|
ScheduledDate = Past,
|
|
LifecycleStatus = LifecycleStatus.Scheduled
|
|
};
|
|
|
|
Assert.False(WorkOrderDerivedFields.IsPastDue(wo, Today));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(LifecycleStatus.Completed)]
|
|
[InlineData(LifecycleStatus.Canceled)]
|
|
public void IsPastDue_WhenTerminal_ReturnsFalse(LifecycleStatus status)
|
|
{
|
|
var wo = new WorkOrder
|
|
{
|
|
DueDate = Past,
|
|
ScheduledDate = Past,
|
|
LifecycleStatus = status
|
|
};
|
|
|
|
Assert.False(WorkOrderDerivedFields.IsPastDue(wo, Today));
|
|
Assert.False(WorkOrderDerivedFields.IsPastDue(Past, status));
|
|
}
|
|
|
|
[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);
|
|
}
|
|
}
|