Initial commit: JDE Scoping Tool migration project

Set up repository with legacy .NET Framework 4.8 source (OLD/),
new .NET 10 Blazor solution (NEW/), OpenSpec specifications,
documentation, and project configuration.
This commit is contained in:
Joseph Doherty
2026-01-02 07:43:29 -05:00
commit 26ff8d9b4f
1761 changed files with 596509 additions and 0 deletions
@@ -0,0 +1,365 @@
using JdeScoping.Core.Helpers;
using Shouldly;
namespace JdeScoping.Core.Tests.Unit;
public class JdeDateConverterTests
{
#region ToDateTime(int jdeDate) Tests
[Fact]
public void ToDateTime_WithZero_ReturnsNull()
{
// Act
var result = JdeDateConverter.ToDateTime(0);
// Assert
result.ShouldBeNull();
}
[Fact]
public void ToDateTime_WithNegative_ReturnsNull()
{
// Act
var result = JdeDateConverter.ToDateTime(-1);
// Assert
result.ShouldBeNull();
}
[Fact]
public void ToDateTime_With1900sDate_ConvertsCorrectly()
{
// Arrange - January 1, 1990 = 090001 (C=0, YY=90, DDD=001)
int jdeDate = 90001;
// Act
var result = JdeDateConverter.ToDateTime(jdeDate);
// Assert
result.ShouldNotBeNull();
result.Value.Year.ShouldBe(1990);
result.Value.Month.ShouldBe(1);
result.Value.Day.ShouldBe(1);
}
[Fact]
public void ToDateTime_With2000sDate_ConvertsCorrectly()
{
// Arrange - January 1, 2024 = 124001 (C=1, YY=24, DDD=001)
int jdeDate = 124001;
// Act
var result = JdeDateConverter.ToDateTime(jdeDate);
// Assert
result.ShouldNotBeNull();
result.Value.Year.ShouldBe(2024);
result.Value.Month.ShouldBe(1);
result.Value.Day.ShouldBe(1);
}
[Fact]
public void ToDateTime_WithLeapYearDay366_ConvertsCorrectly()
{
// Arrange - December 31, 2024 = 124366 (2024 is a leap year)
int jdeDate = 124366;
// Act
var result = JdeDateConverter.ToDateTime(jdeDate);
// Assert
result.ShouldNotBeNull();
result.Value.Year.ShouldBe(2024);
result.Value.Month.ShouldBe(12);
result.Value.Day.ShouldBe(31);
}
[Fact]
public void ToDateTime_WithNonLeapYearDay366_ReturnsNull()
{
// Arrange - 2023 is not a leap year, so day 366 is invalid
int jdeDate = 123366;
// Act
var result = JdeDateConverter.ToDateTime(jdeDate);
// Assert
result.ShouldBeNull();
}
[Fact]
public void ToDateTime_WithInvalidDayOfYear_Zero_ReturnsNull()
{
// Arrange - day 0 is invalid
int jdeDate = 124000;
// Act
var result = JdeDateConverter.ToDateTime(jdeDate);
// Assert
result.ShouldBeNull();
}
[Fact]
public void ToDateTime_WithInvalidDayOfYear_TooHigh_ReturnsNull()
{
// Arrange - day 400 is invalid
int jdeDate = 124400;
// Act
var result = JdeDateConverter.ToDateTime(jdeDate);
// Assert
result.ShouldBeNull();
}
[Fact]
public void ToDateTime_WithMidYearDate_ConvertsCorrectly()
{
// Arrange - July 4, 2024 = day 186 of year = 124186
int jdeDate = 124186;
// Act
var result = JdeDateConverter.ToDateTime(jdeDate);
// Assert
result.ShouldNotBeNull();
result.Value.Year.ShouldBe(2024);
result.Value.Month.ShouldBe(7);
result.Value.Day.ShouldBe(4);
}
#endregion
#region ToDateTime(int jdeDate, int jdeTime) Tests
[Fact]
public void ToDateTime_WithValidTime_ConvertsCorrectly()
{
// Arrange - January 1, 2024 at 14:30:45
int jdeDate = 124001;
int jdeTime = 143045;
// Act
var result = JdeDateConverter.ToDateTime(jdeDate, jdeTime);
// Assert
result.ShouldNotBeNull();
result.Value.Year.ShouldBe(2024);
result.Value.Month.ShouldBe(1);
result.Value.Day.ShouldBe(1);
result.Value.Hour.ShouldBe(14);
result.Value.Minute.ShouldBe(30);
result.Value.Second.ShouldBe(45);
}
[Fact]
public void ToDateTime_WithZeroTime_ReturnsDateOnly()
{
// Arrange
int jdeDate = 124001;
int jdeTime = 0;
// Act
var result = JdeDateConverter.ToDateTime(jdeDate, jdeTime);
// Assert
result.ShouldNotBeNull();
result.Value.Hour.ShouldBe(0);
result.Value.Minute.ShouldBe(0);
result.Value.Second.ShouldBe(0);
}
[Fact]
public void ToDateTime_WithMidnight_ConvertsCorrectly()
{
// Arrange - midnight = 000000
int jdeDate = 124001;
int jdeTime = 1; // 00:00:01
// Act
var result = JdeDateConverter.ToDateTime(jdeDate, jdeTime);
// Assert
result.ShouldNotBeNull();
result.Value.Hour.ShouldBe(0);
result.Value.Minute.ShouldBe(0);
result.Value.Second.ShouldBe(1);
}
[Fact]
public void ToDateTime_WithEndOfDay_ConvertsCorrectly()
{
// Arrange - 23:59:59
int jdeDate = 124001;
int jdeTime = 235959;
// Act
var result = JdeDateConverter.ToDateTime(jdeDate, jdeTime);
// Assert
result.ShouldNotBeNull();
result.Value.Hour.ShouldBe(23);
result.Value.Minute.ShouldBe(59);
result.Value.Second.ShouldBe(59);
}
[Fact]
public void ToDateTime_WithInvalidDate_IgnoresTime()
{
// Arrange
int jdeDate = 0;
int jdeTime = 120000;
// Act
var result = JdeDateConverter.ToDateTime(jdeDate, jdeTime);
// Assert
result.ShouldBeNull();
}
#endregion
#region ToJdeDate Extension Method Tests
[Fact]
public void ToJdeDate_With1900sDate_ConvertsCorrectly()
{
// Arrange
var date = new DateTime(1990, 1, 1);
// Act
var result = date.ToJdeDate();
// Assert
result.ShouldBe(90001);
}
[Fact]
public void ToJdeDate_With2000sDate_ConvertsCorrectly()
{
// Arrange
var date = new DateTime(2024, 1, 1);
// Act
var result = date.ToJdeDate();
// Assert
result.ShouldBe(124001);
}
[Fact]
public void ToJdeDate_WithLeapYearLastDay_ConvertsCorrectly()
{
// Arrange - December 31, 2024 is day 366
var date = new DateTime(2024, 12, 31);
// Act
var result = date.ToJdeDate();
// Assert
result.ShouldBe(124366);
}
[Fact]
public void ToJdeDate_WithMidYearDate_ConvertsCorrectly()
{
// Arrange - July 4, 2024 is day 186
var date = new DateTime(2024, 7, 4);
// Act
var result = date.ToJdeDate();
// Assert
result.ShouldBe(124186);
}
#endregion
#region ToJdeTime Extension Method Tests
[Fact]
public void ToJdeTime_WithMidnight_ReturnsZero()
{
// Arrange
var date = new DateTime(2024, 1, 1, 0, 0, 0);
// Act
var result = date.ToJdeTime();
// Assert
result.ShouldBe(0);
}
[Fact]
public void ToJdeTime_WithAfternoon_ConvertsCorrectly()
{
// Arrange
var date = new DateTime(2024, 1, 1, 14, 30, 45);
// Act
var result = date.ToJdeTime();
// Assert
result.ShouldBe(143045);
}
[Fact]
public void ToJdeTime_WithEndOfDay_ConvertsCorrectly()
{
// Arrange
var date = new DateTime(2024, 1, 1, 23, 59, 59);
// Act
var result = date.ToJdeTime();
// Assert
result.ShouldBe(235959);
}
#endregion
#region Round-Trip Tests
[Theory]
[InlineData(1990, 1, 1)]
[InlineData(1999, 12, 31)]
[InlineData(2000, 1, 1)]
[InlineData(2024, 7, 4)]
[InlineData(2024, 12, 31)]
public void RoundTrip_DateOnly_PreservesValue(int year, int month, int day)
{
// Arrange
var original = new DateTime(year, month, day);
// Act
var jdeDate = original.ToJdeDate();
var converted = JdeDateConverter.ToDateTime(jdeDate);
// Assert
converted.ShouldNotBeNull();
converted.Value.Date.ShouldBe(original.Date);
}
[Theory]
[InlineData(0, 0, 0)]
[InlineData(12, 30, 45)]
[InlineData(23, 59, 59)]
public void RoundTrip_DateAndTime_PreservesValue(int hour, int minute, int second)
{
// Arrange
var original = new DateTime(2024, 6, 15, hour, minute, second);
// Act
var jdeDate = original.ToJdeDate();
var jdeTime = original.ToJdeTime();
var converted = JdeDateConverter.ToDateTime(jdeDate, jdeTime);
// Assert
converted.ShouldNotBeNull();
converted.Value.ShouldBe(original);
}
#endregion
}
@@ -0,0 +1,616 @@
using JdeScoping.Core.Models.Infrastructure;
using JdeScoping.Core.Models.Search;
using JdeScoping.Core.ViewModels;
using Shouldly;
namespace JdeScoping.Core.Tests.Unit;
/// <summary>
/// Unit tests for the QueryTypes class
/// </summary>
public class QueryTypesTests
{
#region Static Definition Tests
[Fact]
public void WorkOrder_HasCorrectProperties()
{
var qt = QueryTypes.WorkOrder;
qt.Code.ShouldBe("WorkOrder");
qt.Name.ShouldBe("Work Order");
qt.OrderIndex.ShouldBe(10);
qt.WorkOrderFilter.ShouldBeTrue();
qt.TimeSpanFilter.ShouldBeFalse();
qt.ItemNumberFilter.ShouldBeFalse();
qt.ProfitCenterFilter.ShouldBeFalse();
qt.WorkCenterFilter.ShouldBeFalse();
qt.ComponentLotFilter.ShouldBeFalse();
qt.OperatorFilter.ShouldBeFalse();
qt.ItemOperationMisFilter.ShouldBeFalse();
qt.ExtractMisFilter.ShouldBeFalse();
}
[Fact]
public void ComponentLot_HasCorrectProperties()
{
var qt = QueryTypes.ComponentLot;
qt.Code.ShouldBe("ComponentLot");
qt.Name.ShouldBe("Component Lot");
qt.OrderIndex.ShouldBe(20);
qt.ComponentLotFilter.ShouldBeTrue();
qt.TimeSpanFilter.ShouldBeFalse();
qt.WorkOrderFilter.ShouldBeFalse();
}
[Fact]
public void TimeSpanProfitCenter_HasCorrectProperties()
{
var qt = QueryTypes.TimeSpanProfitCenter;
qt.Code.ShouldBe("TimeSpanProfitCenter");
qt.Name.ShouldBe("Time Span + Profit Center");
qt.OrderIndex.ShouldBe(30);
qt.TimeSpanFilter.ShouldBeTrue();
qt.ProfitCenterFilter.ShouldBeTrue();
qt.WorkOrderFilter.ShouldBeFalse();
qt.ItemNumberFilter.ShouldBeFalse();
}
[Fact]
public void TimeSpanWorkCenter_HasCorrectProperties()
{
var qt = QueryTypes.TimeSpanWorkCenter;
qt.Code.ShouldBe("TimeSpanWorkCenter");
qt.Name.ShouldBe("Time Span + Work Center");
qt.OrderIndex.ShouldBe(40);
qt.TimeSpanFilter.ShouldBeTrue();
qt.WorkCenterFilter.ShouldBeTrue();
qt.ProfitCenterFilter.ShouldBeFalse();
}
[Fact]
public void TimeSpanOperator_HasCorrectProperties()
{
var qt = QueryTypes.TimeSpanOperator;
qt.Code.ShouldBe("TimeSpanOperator");
qt.Name.ShouldBe("Time Span + Operator");
qt.OrderIndex.ShouldBe(50);
qt.TimeSpanFilter.ShouldBeTrue();
qt.OperatorFilter.ShouldBeTrue();
qt.WorkCenterFilter.ShouldBeFalse();
qt.ProfitCenterFilter.ShouldBeFalse();
}
[Fact]
public void TimeSpanProfitCenterItem_HasCorrectProperties()
{
var qt = QueryTypes.TimeSpanProfitCenterItem;
qt.Code.ShouldBe("TimeSpanProfitCenterItem");
qt.Name.ShouldBe("Time Span + Profit Center + Item Number");
qt.OrderIndex.ShouldBe(60);
qt.TimeSpanFilter.ShouldBeTrue();
qt.ProfitCenterFilter.ShouldBeTrue();
qt.ItemNumberFilter.ShouldBeTrue();
qt.WorkCenterFilter.ShouldBeFalse();
}
[Fact]
public void TimeSpanProfitCenterIOM_HasCorrectProperties()
{
var qt = QueryTypes.TimeSpanProfitCenterIOM;
qt.Code.ShouldBe("TimeSpanProfitCenterIOM");
qt.Name.ShouldBe("Time Span + Profit Center + Item/Operation/MIS");
qt.OrderIndex.ShouldBe(70);
qt.TimeSpanFilter.ShouldBeTrue();
qt.ProfitCenterFilter.ShouldBeTrue();
qt.ItemOperationMisFilter.ShouldBeTrue();
qt.ItemNumberFilter.ShouldBeFalse();
}
[Fact]
public void TimeSpanProfitCenterWorkOrderIOM_HasCorrectProperties()
{
var qt = QueryTypes.TimeSpanProfitCenterWorkOrderIOM;
qt.Code.ShouldBe("TimeSpanProfitCenterWorkOrderIOM");
qt.Name.ShouldBe("Time Span + Profit Center + Work Order + Item/Operation/MIS");
qt.OrderIndex.ShouldBe(80);
qt.TimeSpanFilter.ShouldBeTrue();
qt.WorkOrderFilter.ShouldBeTrue();
qt.ProfitCenterFilter.ShouldBeTrue();
qt.ItemOperationMisFilter.ShouldBeTrue();
}
[Fact]
public void TimeSpanProfitCenterExtractMIS_HasCorrectProperties()
{
var qt = QueryTypes.TimeSpanProfitCenterExtractMIS;
qt.Code.ShouldBe("TimeSpanProfitCenterExtractMIS");
qt.Name.ShouldBe("Time Span + Profit Center + Extract MIS");
qt.OrderIndex.ShouldBe(90);
qt.TimeSpanFilter.ShouldBeTrue();
qt.ProfitCenterFilter.ShouldBeTrue();
qt.ExtractMisFilter.ShouldBeTrue();
qt.ItemOperationMisFilter.ShouldBeFalse();
}
[Fact]
public void TimeSpanWorkCenterItem_HasCorrectProperties()
{
var qt = QueryTypes.TimeSpanWorkCenterItem;
qt.Code.ShouldBe("TimeSpanWorkCenterItem");
qt.Name.ShouldBe("Time Span + Work Center + Item Number");
qt.OrderIndex.ShouldBe(100);
qt.TimeSpanFilter.ShouldBeTrue();
qt.WorkCenterFilter.ShouldBeTrue();
qt.ItemNumberFilter.ShouldBeTrue();
qt.ProfitCenterFilter.ShouldBeFalse();
}
[Fact]
public void TimeSpanWorkCenterExtractMIS_HasCorrectProperties()
{
var qt = QueryTypes.TimeSpanWorkCenterExtractMIS;
qt.Code.ShouldBe("TimeSpanWorkCenterExtractMIS");
qt.Name.ShouldBe("Time Span + Work Center + Extract MIS");
qt.OrderIndex.ShouldBe(110);
qt.TimeSpanFilter.ShouldBeTrue();
qt.WorkCenterFilter.ShouldBeTrue();
qt.ExtractMisFilter.ShouldBeTrue();
}
[Fact]
public void TimeSpanWorkCenterIOM_HasCorrectProperties()
{
var qt = QueryTypes.TimeSpanWorkCenterIOM;
qt.Code.ShouldBe("TimeSpanWorkCenterIOM");
qt.Name.ShouldBe("Time Span + Work Center + Item/Operation/MIS");
qt.OrderIndex.ShouldBe(120);
qt.TimeSpanFilter.ShouldBeTrue();
qt.WorkCenterFilter.ShouldBeTrue();
qt.ItemOperationMisFilter.ShouldBeTrue();
}
[Fact]
public void TimeSpanWorkCenterWorkOrderIOM_HasCorrectProperties()
{
var qt = QueryTypes.TimeSpanWorkCenterWorkOrderIOM;
qt.Code.ShouldBe("TimeSpanWorkCenterWorkOrderIOM");
qt.Name.ShouldBe("Time Span + Work Center + Work Order + Item/Operation/MIS");
qt.OrderIndex.ShouldBe(130);
qt.TimeSpanFilter.ShouldBeTrue();
qt.WorkOrderFilter.ShouldBeTrue();
qt.WorkCenterFilter.ShouldBeTrue();
qt.ItemOperationMisFilter.ShouldBeTrue();
}
[Fact]
public void TimeSpanItem_HasCorrectProperties()
{
var qt = QueryTypes.TimeSpanItem;
qt.Code.ShouldBe("TimeSpanItem");
qt.Name.ShouldBe("Time Span + Item Number");
qt.OrderIndex.ShouldBe(140);
qt.TimeSpanFilter.ShouldBeTrue();
qt.ItemNumberFilter.ShouldBeTrue();
qt.ProfitCenterFilter.ShouldBeFalse();
qt.WorkCenterFilter.ShouldBeFalse();
}
[Fact]
public void TimeSpanWorkCenterOperator_HasCorrectProperties()
{
var qt = QueryTypes.TimeSpanWorkCenterOperator;
qt.Code.ShouldBe("TimeSpanWorkCenterOperator");
qt.Name.ShouldBe("Time Span + Work Center + Operator");
qt.OrderIndex.ShouldBe(150);
qt.TimeSpanFilter.ShouldBeTrue();
qt.WorkCenterFilter.ShouldBeTrue();
qt.OperatorFilter.ShouldBeTrue();
}
[Fact]
public void TimeSpanProfitCenterOperator_HasCorrectProperties()
{
var qt = QueryTypes.TimeSpanProfitCenterOperator;
qt.Code.ShouldBe("TimeSpanProfitCenterOperator");
qt.Name.ShouldBe("Time Span + Profit Center + Operator");
qt.OrderIndex.ShouldBe(160);
qt.TimeSpanFilter.ShouldBeTrue();
qt.ProfitCenterFilter.ShouldBeTrue();
qt.OperatorFilter.ShouldBeTrue();
}
#endregion
#region DefinedTypes Dictionary Tests
[Fact]
public void DefinedTypes_ContainsExactly16Entries()
{
QueryTypes.DefinedTypes.Count.ShouldBe(16);
}
[Fact]
public void DefinedTypes_ContainsAllStaticTypes()
{
var types = QueryTypes.DefinedTypes;
types.ShouldContainKey("WorkOrder");
types.ShouldContainKey("ComponentLot");
types.ShouldContainKey("TimeSpanProfitCenter");
types.ShouldContainKey("TimeSpanWorkCenter");
types.ShouldContainKey("TimeSpanOperator");
types.ShouldContainKey("TimeSpanProfitCenterItem");
types.ShouldContainKey("TimeSpanProfitCenterIOM");
types.ShouldContainKey("TimeSpanProfitCenterWorkOrderIOM");
types.ShouldContainKey("TimeSpanProfitCenterExtractMIS");
types.ShouldContainKey("TimeSpanWorkCenterItem");
types.ShouldContainKey("TimeSpanWorkCenterExtractMIS");
types.ShouldContainKey("TimeSpanWorkCenterIOM");
types.ShouldContainKey("TimeSpanWorkCenterWorkOrderIOM");
types.ShouldContainKey("TimeSpanItem");
types.ShouldContainKey("TimeSpanWorkCenterOperator");
types.ShouldContainKey("TimeSpanProfitCenterOperator");
}
[Fact]
public void DefinedTypes_AllCodesAreUnique()
{
var codes = QueryTypes.DefinedTypes.Keys.ToList();
var uniqueCodes = codes.Distinct().ToList();
codes.Count.ShouldBe(uniqueCodes.Count);
}
#endregion
#region GetAll Tests
[Fact]
public void GetAll_Returns16Types()
{
var allTypes = QueryTypes.GetAll().ToList();
allTypes.Count.ShouldBe(16);
}
[Fact]
public void GetAll_ReturnsSortedByOrderIndex()
{
var allTypes = QueryTypes.GetAll().ToList();
for (int i = 1; i < allTypes.Count; i++)
{
allTypes[i].OrderIndex.ShouldBeGreaterThan(allTypes[i - 1].OrderIndex);
}
}
[Fact]
public void GetAll_FirstIsWorkOrder()
{
var first = QueryTypes.GetAll().First();
first.Code.ShouldBe("WorkOrder");
first.OrderIndex.ShouldBe(10);
}
[Fact]
public void GetAll_LastIsTimeSpanProfitCenterOperator()
{
var last = QueryTypes.GetAll().Last();
last.Code.ShouldBe("TimeSpanProfitCenterOperator");
last.OrderIndex.ShouldBe(160);
}
#endregion
#region GetByCode Tests
[Theory]
[InlineData("WorkOrder")]
[InlineData("ComponentLot")]
[InlineData("TimeSpanProfitCenter")]
[InlineData("TimeSpanWorkCenter")]
[InlineData("TimeSpanItem")]
public void GetByCode_ReturnsCorrectType_ForValidCode(string code)
{
var result = QueryTypes.GetByCode(code);
result.ShouldNotBeNull();
result.Code.ShouldBe(code);
}
[Fact]
public void GetByCode_ReturnsNull_ForInvalidCode()
{
var result = QueryTypes.GetByCode("InvalidCode");
result.ShouldBeNull();
}
[Fact]
public void GetByCode_IsCaseSensitive()
{
var result = QueryTypes.GetByCode("workorder"); // lowercase
result.ShouldBeNull();
}
[Fact]
public void GetByCode_ReturnsNull_ForEmptyString()
{
var result = QueryTypes.GetByCode("");
result.ShouldBeNull();
}
#endregion
#region Identify Tests
[Fact]
public void Identify_ReturnsNull_ForNullCriteria()
{
var result = QueryTypes.Identify(null!);
result.ShouldBeNull();
}
[Fact]
public void Identify_ReturnsNull_ForEmptyCriteria()
{
var criteria = new SearchCriteria();
var result = QueryTypes.Identify(criteria);
result.ShouldBeNull();
}
[Fact]
public void Identify_ReturnsWorkOrder_ForWorkOrderCriteria()
{
var criteria = new SearchCriteria
{
WorkOrderNumbers = [12345]
};
var result = QueryTypes.Identify(criteria);
result.ShouldNotBeNull();
result.Code.ShouldBe("WorkOrder");
}
[Fact]
public void Identify_ReturnsComponentLot_ForComponentLotCriteria()
{
var criteria = new SearchCriteria
{
ComponentLotNumbers = [new LotViewModel { LotNumber = "LOT123", ItemNumber = "ITEM1" }]
};
var result = QueryTypes.Identify(criteria);
result.ShouldNotBeNull();
result.Code.ShouldBe("ComponentLot");
}
[Fact]
public void Identify_ReturnsTimeSpanProfitCenter_ForTimeSpanAndProfitCenterCriteria()
{
var criteria = new SearchCriteria
{
MinimumDt = DateTime.Now.AddDays(-30),
ProfitCenters = ["PC01"]
};
var result = QueryTypes.Identify(criteria);
result.ShouldNotBeNull();
result.Code.ShouldBe("TimeSpanProfitCenter");
}
[Fact]
public void Identify_ReturnsTimeSpanWorkCenter_ForTimeSpanAndWorkCenterCriteria()
{
var criteria = new SearchCriteria
{
MaximumDt = DateTime.Now,
WorkCenters = ["WC01"]
};
var result = QueryTypes.Identify(criteria);
result.ShouldNotBeNull();
result.Code.ShouldBe("TimeSpanWorkCenter");
}
[Fact]
public void Identify_ReturnsTimeSpanOperator_ForTimeSpanAndOperatorCriteria()
{
var criteria = new SearchCriteria
{
MinimumDt = DateTime.Now.AddDays(-7),
OperatorIDs = ["OP001"]
};
var result = QueryTypes.Identify(criteria);
result.ShouldNotBeNull();
result.Code.ShouldBe("TimeSpanOperator");
}
[Fact]
public void Identify_ReturnsTimeSpanItem_ForTimeSpanAndItemCriteria()
{
var criteria = new SearchCriteria
{
MinimumDt = DateTime.Now.AddDays(-30),
ItemNumbers = ["ITEM001"]
};
var result = QueryTypes.Identify(criteria);
result.ShouldNotBeNull();
result.Code.ShouldBe("TimeSpanItem");
}
[Fact]
public void Identify_ReturnsTimeSpanProfitCenterItem_ForComplexCriteria()
{
var criteria = new SearchCriteria
{
MinimumDt = DateTime.Now.AddDays(-30),
ProfitCenters = ["PC01"],
ItemNumbers = ["ITEM001"]
};
var result = QueryTypes.Identify(criteria);
result.ShouldNotBeNull();
result.Code.ShouldBe("TimeSpanProfitCenterItem");
}
[Fact]
public void Identify_ReturnsTimeSpanProfitCenterExtractMIS_ForExtractMisCriteria()
{
var criteria = new SearchCriteria
{
MinimumDt = DateTime.Now.AddDays(-30),
ProfitCenters = ["PC01"],
ExtractMisData = true
};
var result = QueryTypes.Identify(criteria);
result.ShouldNotBeNull();
result.Code.ShouldBe("TimeSpanProfitCenterExtractMIS");
}
[Fact]
public void Identify_ReturnsTimeSpanProfitCenterIOM_ForPartOperationsCriteria()
{
var criteria = new SearchCriteria
{
MinimumDt = DateTime.Now.AddDays(-30),
ProfitCenters = ["PC01"],
PartOperations = [new PartOperationViewModel { ItemNumber = "ITEM1", OperationNumber = "10" }]
};
var result = QueryTypes.Identify(criteria);
result.ShouldNotBeNull();
result.Code.ShouldBe("TimeSpanProfitCenterIOM");
}
[Fact]
public void Identify_ReturnsTimeSpanProfitCenterWorkOrderIOM_ForComplexIOMCriteria()
{
var criteria = new SearchCriteria
{
MinimumDt = DateTime.Now.AddDays(-30),
WorkOrderNumbers = [12345],
ProfitCenters = ["PC01"],
PartOperations = [new PartOperationViewModel { ItemNumber = "ITEM1", OperationNumber = "10" }]
};
var result = QueryTypes.Identify(criteria);
result.ShouldNotBeNull();
result.Code.ShouldBe("TimeSpanProfitCenterWorkOrderIOM");
}
[Fact]
public void Identify_ReturnsTimeSpanWorkCenterOperator_ForWorkCenterAndOperatorCriteria()
{
var criteria = new SearchCriteria
{
MinimumDt = DateTime.Now.AddDays(-7),
WorkCenters = ["WC01"],
OperatorIDs = ["OP001"]
};
var result = QueryTypes.Identify(criteria);
result.ShouldNotBeNull();
result.Code.ShouldBe("TimeSpanWorkCenterOperator");
}
[Fact]
public void Identify_ReturnsTimeSpanProfitCenterOperator_ForProfitCenterAndOperatorCriteria()
{
var criteria = new SearchCriteria
{
MinimumDt = DateTime.Now.AddDays(-7),
ProfitCenters = ["PC01"],
OperatorIDs = ["OP001"]
};
var result = QueryTypes.Identify(criteria);
result.ShouldNotBeNull();
result.Code.ShouldBe("TimeSpanProfitCenterOperator");
}
[Fact]
public void Identify_ReturnsNull_ForInvalidCombination()
{
// This combination doesn't match any defined query type
var criteria = new SearchCriteria
{
WorkOrderNumbers = [12345],
ComponentLotNumbers = [new LotViewModel { LotNumber = "LOT1", ItemNumber = "ITEM1" }]
};
var result = QueryTypes.Identify(criteria);
result.ShouldBeNull();
}
[Fact]
public void Identify_HandlesMinimumDtOnly()
{
var criteria = new SearchCriteria
{
MinimumDt = DateTime.Now.AddDays(-30),
ProfitCenters = ["PC01"]
};
var result = QueryTypes.Identify(criteria);
result.ShouldNotBeNull();
result.Code.ShouldBe("TimeSpanProfitCenter");
}
[Fact]
public void Identify_HandlesMaximumDtOnly()
{
var criteria = new SearchCriteria
{
MaximumDt = DateTime.Now,
WorkCenters = ["WC01"]
};
var result = QueryTypes.Identify(criteria);
result.ShouldNotBeNull();
result.Code.ShouldBe("TimeSpanWorkCenter");
}
#endregion
}