mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-09-30 09:33:13 +00:00
Permit flagColor, comments, and Extra media after completion while keeping Canceled fully locked.
104 lines
4.2 KiB
C#
104 lines
4.2 KiB
C#
using Data.SeaHavenIndustries.Enums;
|
|
using SeaHaven.Services.Helpers;
|
|
|
|
namespace SeaHavenIndustries.Tests;
|
|
|
|
public class WorkOrderBoardMutationRulesTests
|
|
{
|
|
[Theory]
|
|
[InlineData(LifecycleStatus.Canceled, true)]
|
|
[InlineData(LifecycleStatus.Completed, true)]
|
|
[InlineData(LifecycleStatus.Scheduled, false)]
|
|
[InlineData(LifecycleStatus.Incomplete, false)]
|
|
public void IsReadOnly_ReflectsTerminalStatuses(LifecycleStatus status, bool expected)
|
|
{
|
|
Assert.Equal(expected, WorkOrderBoardMutationRules.IsReadOnly(status));
|
|
}
|
|
|
|
[Fact]
|
|
public void ShouldBlockStatusChangeWhenPastDue_BlocksOnlyLifecycleStatus()
|
|
{
|
|
Assert.True(WorkOrderBoardMutationRules.ShouldBlockStatusChangeWhenPastDue(
|
|
WorkOrderBoardFieldNames.LifecycleStatus, isPastDue: true));
|
|
Assert.False(WorkOrderBoardMutationRules.ShouldBlockStatusChangeWhenPastDue(
|
|
WorkOrderBoardFieldNames.ScheduledDate, isPastDue: true));
|
|
Assert.False(WorkOrderBoardMutationRules.ShouldBlockStatusChangeWhenPastDue(
|
|
WorkOrderBoardFieldNames.DueDate, isPastDue: true));
|
|
}
|
|
|
|
[Fact]
|
|
public void ShouldAutoSchedule_WhenIncompleteWithDateAndAssignee()
|
|
{
|
|
Assert.True(WorkOrderBoardMutationRules.ShouldAutoSchedule(
|
|
LifecycleStatus.Incomplete,
|
|
new DateTime(2026, 6, 25),
|
|
"dispatcher-1"));
|
|
}
|
|
|
|
[Fact]
|
|
public void ShouldAutoSchedule_FalseWhenAlreadyScheduled()
|
|
{
|
|
Assert.False(WorkOrderBoardMutationRules.ShouldAutoSchedule(
|
|
LifecycleStatus.Scheduled,
|
|
new DateTime(2026, 6, 25),
|
|
"dispatcher-1"));
|
|
}
|
|
|
|
[Fact]
|
|
public void ShouldAutoSchedule_FalseWhenScheduleWeekOnly()
|
|
{
|
|
Assert.False(WorkOrderBoardMutationRules.ShouldAutoSchedule(
|
|
LifecycleStatus.Incomplete,
|
|
new DateTime(2026, 6, 25),
|
|
"dispatcher-1",
|
|
scheduleWeekOnly: true));
|
|
}
|
|
|
|
[Fact]
|
|
public void CanPatchBoardField_AllowsOnlyFlagColorWhenCompleted()
|
|
{
|
|
Assert.True(WorkOrderBoardMutationRules.CanPatchBoardField(
|
|
LifecycleStatus.Completed, WorkOrderBoardFieldNames.FlagColor));
|
|
Assert.False(WorkOrderBoardMutationRules.CanPatchBoardField(
|
|
LifecycleStatus.Completed, WorkOrderBoardFieldNames.LifecycleStatus));
|
|
Assert.False(WorkOrderBoardMutationRules.CanPatchBoardField(
|
|
LifecycleStatus.Completed, WorkOrderBoardFieldNames.SiteCode));
|
|
Assert.False(WorkOrderBoardMutationRules.CanPatchBoardField(
|
|
LifecycleStatus.Canceled, WorkOrderBoardFieldNames.FlagColor));
|
|
Assert.True(WorkOrderBoardMutationRules.CanPatchBoardField(
|
|
LifecycleStatus.Scheduled, WorkOrderBoardFieldNames.AssignTo));
|
|
}
|
|
|
|
[Fact]
|
|
public void CanMutateComments_FalseOnlyWhenCanceled()
|
|
{
|
|
Assert.True(WorkOrderBoardMutationRules.CanMutateComments(LifecycleStatus.Completed));
|
|
Assert.True(WorkOrderBoardMutationRules.CanMutateComments(LifecycleStatus.Scheduled));
|
|
Assert.False(WorkOrderBoardMutationRules.CanMutateComments(LifecycleStatus.Canceled));
|
|
}
|
|
|
|
[Fact]
|
|
public void CanMutateExtraMedia_AllowsExtraOnCompleted()
|
|
{
|
|
Assert.True(WorkOrderBoardMutationRules.CanMutateExtraMedia(
|
|
LifecycleStatus.Completed, WorkOrderMediaCategory.Extra));
|
|
Assert.True(WorkOrderBoardMutationRules.CanMutateExtraMedia(LifecycleStatus.Completed, null));
|
|
Assert.False(WorkOrderBoardMutationRules.CanMutateExtraMedia(
|
|
LifecycleStatus.Completed, WorkOrderMediaCategory.Before));
|
|
Assert.False(WorkOrderBoardMutationRules.CanMutateExtraMedia(
|
|
LifecycleStatus.Completed, WorkOrderMediaCategory.After));
|
|
Assert.False(WorkOrderBoardMutationRules.CanMutateExtraMedia(
|
|
LifecycleStatus.Canceled, WorkOrderMediaCategory.Extra));
|
|
}
|
|
|
|
[Fact]
|
|
public void IsReschedule_WhenPreviousDateExistsAndChanges()
|
|
{
|
|
Assert.True(WorkOrderBoardMutationRules.IsReschedule(
|
|
new DateTime(2026, 6, 20),
|
|
new DateTime(2026, 6, 25)));
|
|
Assert.False(WorkOrderBoardMutationRules.IsReschedule(
|
|
null,
|
|
new DateTime(2026, 6, 25)));
|
|
}
|
|
}
|