Files
jdescopingtool/NEW/tests/JdeScoping.ExcelIO.Tests/Parsing/ExcelParserServiceTests.cs
T
Joseph Doherty 1c546c111a fix: resolve test failures from timezone conversion and interface rename
- Fix CriteriaSheetGenerator.FormatTimestamp to handle all DateTimeKind values
- Update TestWebApplicationFactory to use IAuthenticationService
- Add logger parameter to ExcelParserServiceTests
- Add SecureStoreManager to solution under /utils/ folder
2026-01-19 14:55:22 -05:00

180 lines
5.9 KiB
C#

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<ExcelParserService>.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();
}
}