using ClosedXML.Excel; using JdeScoping.ExcelIO.Parsing; using Microsoft.Extensions.Logging.Abstractions; using Shouldly; using Xunit; namespace JdeScoping.ExcelIO.Tests.Parsing; public class ExcelParserServiceTests { private readonly ExcelParserService _service = new(NullLogger.Instance); [Fact] public void ParseWorkOrders_ReturnsWorkOrderNumbers() { // Arrange var excelData = CreateWorkOrderExcel([12345, 67890, 11111]); // Act using var stream = new MemoryStream(excelData); var result = _service.ParseWorkOrders(stream); // Assert result.Count.ShouldBe(3); result.ShouldContain(12345); result.ShouldContain(67890); result.ShouldContain(11111); } [Fact] public void ParseWorkOrders_SkipsInvalidNumbers() { // Arrange using var workbook = new XLWorkbook(); var worksheet = workbook.Worksheets.Add("Sheet1"); worksheet.Cell(1, 1).Value = "Work Order"; worksheet.Cell(2, 1).Value = "12345"; worksheet.Cell(3, 1).Value = "not-a-number"; worksheet.Cell(4, 1).Value = "67890"; using var ms = new MemoryStream(); workbook.SaveAs(ms); ms.Position = 0; // Act var result = _service.ParseWorkOrders(ms); // Assert result.Count.ShouldBe(2); } [Fact] public void ParseItems_ReturnsItemNumbers() { // Arrange var excelData = CreateItemExcel(["ITEM-001", "ITEM-002"]); // Act using var stream = new MemoryStream(excelData); var result = _service.ParseItems(stream); // Assert result.Count.ShouldBe(2); result.ShouldContain("ITEM-001"); result.ShouldContain("ITEM-002"); } [Fact] public void ParseComponentLots_ReturnsLotViewModels() { // Arrange var excelData = CreateComponentLotExcel([("LOT001", "ITEM-001"), ("LOT002", "ITEM-002")]); // Act using var stream = new MemoryStream(excelData); var result = _service.ParseComponentLots(stream); // Assert result.Count.ShouldBe(2); result[0].LotNumber.ShouldBe("LOT001"); result[0].ItemNumber.ShouldBe("ITEM-001"); } [Fact] public void ParsePartOperations_ReturnsPartOperations() { // Arrange var excelData = CreatePartOperationExcel([("ITEM-001", "100", "MIS001", "A")]); // Act using var stream = new MemoryStream(excelData); var result = _service.ParsePartOperations(stream); // Assert result.Count.ShouldBe(1); result[0].ItemNumber.ShouldBe("ITEM-001"); result[0].OperationNumber.ShouldBe("100"); result[0].MisNumber.ShouldBe("MIS001"); result[0].MisRevision.ShouldBe("A"); } [Fact] public void ParsePartOperations_TruncatesDecimalOperationNumbers() { // Arrange var excelData = CreatePartOperationExcel([("ITEM-001", "100.5", "MIS001", "A")]); // Act using var stream = new MemoryStream(excelData); var result = _service.ParsePartOperations(stream); // Assert result[0].OperationNumber.ShouldBe("100"); } private static byte[] CreateWorkOrderExcel(long[] workOrderNumbers) { using var workbook = new XLWorkbook(); var worksheet = workbook.Worksheets.Add("Sheet1"); worksheet.Cell(1, 1).Value = "Work Order Number"; for (var i = 0; i < workOrderNumbers.Length; i++) { worksheet.Cell(i + 2, 1).Value = workOrderNumbers[i]; } using var stream = new MemoryStream(); workbook.SaveAs(stream); return stream.ToArray(); } private static byte[] CreateItemExcel(string[] itemNumbers) { using var workbook = new XLWorkbook(); var worksheet = workbook.Worksheets.Add("Sheet1"); worksheet.Cell(1, 1).Value = "Item Number"; for (var i = 0; i < itemNumbers.Length; i++) { worksheet.Cell(i + 2, 1).Value = itemNumbers[i]; } using var stream = new MemoryStream(); workbook.SaveAs(stream); return stream.ToArray(); } private static byte[] CreateComponentLotExcel((string LotNumber, string ItemNumber)[] lots) { using var workbook = new XLWorkbook(); var worksheet = workbook.Worksheets.Add("Sheet1"); worksheet.Cell(1, 1).Value = "Lot Number"; worksheet.Cell(1, 2).Value = "Item Number"; for (var i = 0; i < lots.Length; i++) { worksheet.Cell(i + 2, 1).Value = lots[i].LotNumber; worksheet.Cell(i + 2, 2).Value = lots[i].ItemNumber; } using var stream = new MemoryStream(); workbook.SaveAs(stream); return stream.ToArray(); } private static byte[] CreatePartOperationExcel((string ItemNumber, string OpNumber, string MisNumber, string MisRevision)[] operations) { using var workbook = new XLWorkbook(); var worksheet = workbook.Worksheets.Add("Sheet1"); worksheet.Cell(1, 1).Value = "Item Number"; worksheet.Cell(1, 2).Value = "Operation Number"; worksheet.Cell(1, 3).Value = "MIS Number"; worksheet.Cell(1, 4).Value = "MIS Revision"; for (var i = 0; i < operations.Length; i++) { worksheet.Cell(i + 2, 1).Value = operations[i].ItemNumber; worksheet.Cell(i + 2, 2).Value = operations[i].OpNumber; worksheet.Cell(i + 2, 3).Value = operations[i].MisNumber; worksheet.Cell(i + 2, 4).Value = operations[i].MisRevision; } using var stream = new MemoryStream(); workbook.SaveAs(stream); return stream.ToArray(); } }