shoc-backend/SeaHavenIndustries.Tests/WorkOrderAddonCutoffTests.cs
Arthur Bassi 97e042f552 feat(work-orders): persist IsAddOn frozen at create (SH-126)
Add set-once IsAddOn with server cutoff at create, board DTO exposure, legacy type-7 backfill, and Types=AddOn search compat. Aligns with FE PR #61 frozen contract.
2026-08-13 13:30:09 -03:00

135 lines
4.6 KiB
C#

using SeaHaven.Services.Helpers;
namespace SeaHavenIndustries.Tests;
public class WorkOrderAddonCutoffTests
{
// Schedule week Mon 2026-06-22 → cutoff Sat 2026-06-20 23:59:59 UTC
private static readonly DateTime ScheduleMonday = new(2026, 6, 22, 0, 0, 0, DateTimeKind.Utc);
private static readonly DateTime ExpectedCutoff = new(2026, 6, 20, 23, 59, 59, DateTimeKind.Utc);
[Fact]
public void GetAddonCutoffUtc_FromScheduledDate_IsPriorSaturdayEndOfDay()
{
// Wednesday in schedule week
var cutoff = WorkOrderAddonCutoff.GetAddonCutoffUtc(new DateTime(2026, 6, 24, 15, 0, 0, DateTimeKind.Utc));
Assert.Equal(ExpectedCutoff, cutoff);
}
[Fact]
public void GetAddonCutoffUtc_FromTargetWeekMonday_IsPriorSaturdayEndOfDay()
{
var cutoff = WorkOrderAddonCutoff.GetAddonCutoffUtc(new DateOnly(2026, 6, 22));
Assert.Equal(ExpectedCutoff, cutoff);
}
[Fact]
public void GetAddonCutoffUtc_FromMondayAnchor_MatchesGetWeekStartMondayMinusTwo()
{
var monday = WorkOrderBoardMutationRules.GetWeekStartMonday(ScheduleMonday);
Assert.Equal(ScheduleMonday.Date, monday.Date);
Assert.Equal(ExpectedCutoff, WorkOrderAddonCutoff.GetAddonCutoffUtc(ScheduleMonday));
}
[Fact]
public void Compute_AfterCutoff_ReturnsTrue_IgnoresManualFalse()
{
var created = new DateTime(2026, 6, 21, 0, 0, 0, DateTimeKind.Utc);
var result = WorkOrderAddonCutoff.ComputeIsAddOnAtCreation(
created,
scheduledDate: new DateTime(2026, 6, 24),
targetWeek: null,
manualOverride: false);
Assert.True(result);
}
[Fact]
public void Compute_BeforeCutoff_ReturnsFalse_IgnoresManualTrue()
{
var created = new DateTime(2026, 6, 20, 23, 59, 59, DateTimeKind.Utc);
var result = WorkOrderAddonCutoff.ComputeIsAddOnAtCreation(
created,
scheduledDate: new DateTime(2026, 6, 24),
targetWeek: null,
manualOverride: true);
Assert.False(result);
}
[Fact]
public void Compute_ExactlyAtCutoff_ReturnsFalse()
{
var result = WorkOrderAddonCutoff.ComputeIsAddOnAtCreation(
ExpectedCutoff,
scheduledDate: ScheduleMonday,
targetWeek: null,
manualOverride: true);
Assert.False(result);
}
[Fact]
public void Compute_TargetWeekOnly_UsesCutoff()
{
var after = WorkOrderAddonCutoff.ComputeIsAddOnAtCreation(
new DateTime(2026, 6, 21, 12, 0, 0, DateTimeKind.Utc),
scheduledDate: null,
targetWeek: new DateOnly(2026, 6, 22),
manualOverride: false);
var before = WorkOrderAddonCutoff.ComputeIsAddOnAtCreation(
new DateTime(2026, 6, 19, 12, 0, 0, DateTimeKind.Utc),
scheduledDate: null,
targetWeek: new DateOnly(2026, 6, 22),
manualOverride: true);
Assert.True(after);
Assert.False(before);
}
[Fact]
public void Compute_NoSchedule_UsesManualOverride()
{
Assert.True(WorkOrderAddonCutoff.ComputeIsAddOnAtCreation(
DateTime.UtcNow, null, null, manualOverride: true));
Assert.False(WorkOrderAddonCutoff.ComputeIsAddOnAtCreation(
DateTime.UtcNow, null, null, manualOverride: false));
Assert.False(WorkOrderAddonCutoff.ComputeIsAddOnAtCreation(
DateTime.UtcNow, null, null, manualOverride: null));
}
[Fact]
public void Compute_ScheduledDatePreferredOverTargetWeek()
{
// Target week far future (cutoff after created) would be false;
// scheduled date near past (cutoff before created) → true.
var created = new DateTime(2026, 7, 1, 0, 0, 0, DateTimeKind.Utc);
var result = WorkOrderAddonCutoff.ComputeIsAddOnAtCreation(
created,
scheduledDate: new DateTime(2026, 6, 24),
targetWeek: new DateOnly(2099, 1, 5),
manualOverride: false);
Assert.True(result);
}
[Fact]
public void RecalculateIsAddOnFromSchedule_NoSchedule_ReturnsFalse()
{
var created = new DateTime(2026, 6, 21, 0, 0, 0, DateTimeKind.Utc);
Assert.False(WorkOrderAddonCutoff.RecalculateIsAddOnFromSchedule(created, null, null));
}
[Fact]
public void RecalculateIsAddOnFromSchedule_AfterCutoff_ReturnsTrue()
{
var created = new DateTime(2026, 6, 21, 0, 0, 0, DateTimeKind.Utc);
var result = WorkOrderAddonCutoff.RecalculateIsAddOnFromSchedule(
created,
scheduledDate: new DateTime(2026, 6, 24),
targetWeek: null);
Assert.True(result);
}
}