shoc-backend/SeaHavenIndustries.Tests/WorkOrderDerivedFieldsTests.cs

127 lines
3.7 KiB
C#
Raw Normal View History

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);
}
}