Migrate ExcelIO from ClosedXML to NPOI
This commit is contained in:
@@ -1,179 +1,171 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
using JdeScoping.ExcelIO.Parsing;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using NPOI.XSSF.UserModel;
|
||||
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()
|
||||
{
|
||||
var excelData = CreateWorkOrderExcel([12345, 67890, 11111]);
|
||||
|
||||
using var stream = new MemoryStream(excelData);
|
||||
var result = _service.ParseWorkOrders(stream);
|
||||
|
||||
result.Count.ShouldBe(3);
|
||||
result.ShouldContain(12345);
|
||||
result.ShouldContain(67890);
|
||||
result.ShouldContain(11111);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ParseWorkOrders_SkipsInvalidNumbers()
|
||||
{
|
||||
using var workbook = new XSSFWorkbook();
|
||||
var worksheet = workbook.CreateSheet("Sheet1");
|
||||
worksheet.CreateRow(0).CreateCell(0).SetCellValue("Work Order");
|
||||
worksheet.CreateRow(1).CreateCell(0).SetCellValue("12345");
|
||||
worksheet.CreateRow(2).CreateCell(0).SetCellValue("not-a-number");
|
||||
worksheet.CreateRow(3).CreateCell(0).SetCellValue("67890");
|
||||
|
||||
using var ms = new MemoryStream();
|
||||
workbook.Write(ms, leaveOpen: true);
|
||||
ms.Position = 0;
|
||||
|
||||
var result = _service.ParseWorkOrders(ms);
|
||||
|
||||
result.Count.ShouldBe(2);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ParseItems_ReturnsItemNumbers()
|
||||
{
|
||||
var excelData = CreateItemExcel(["ITEM-001", "ITEM-002"]);
|
||||
|
||||
using var stream = new MemoryStream(excelData);
|
||||
var result = _service.ParseItems(stream);
|
||||
|
||||
result.Count.ShouldBe(2);
|
||||
result.ShouldContain("ITEM-001");
|
||||
result.ShouldContain("ITEM-002");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ParseComponentLots_ReturnsLotViewModels()
|
||||
{
|
||||
var excelData = CreateComponentLotExcel([("LOT001", "ITEM-001"), ("LOT002", "ITEM-002")]);
|
||||
|
||||
using var stream = new MemoryStream(excelData);
|
||||
var result = _service.ParseComponentLots(stream);
|
||||
|
||||
result.Count.ShouldBe(2);
|
||||
result[0].LotNumber.ShouldBe("LOT001");
|
||||
result[0].ItemNumber.ShouldBe("ITEM-001");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ParsePartOperations_ReturnsPartOperations()
|
||||
{
|
||||
var excelData = CreatePartOperationExcel([("ITEM-001", "100", "MIS001", "A")]);
|
||||
|
||||
using var stream = new MemoryStream(excelData);
|
||||
var result = _service.ParsePartOperations(stream);
|
||||
|
||||
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()
|
||||
{
|
||||
var excelData = CreatePartOperationExcel([("ITEM-001", "100.5", "MIS001", "A")]);
|
||||
|
||||
using var stream = new MemoryStream(excelData);
|
||||
var result = _service.ParsePartOperations(stream);
|
||||
|
||||
result[0].OperationNumber.ShouldBe("100");
|
||||
}
|
||||
|
||||
private static byte[] CreateWorkOrderExcel(long[] workOrderNumbers)
|
||||
{
|
||||
using var workbook = new XSSFWorkbook();
|
||||
var worksheet = workbook.CreateSheet("Sheet1");
|
||||
worksheet.CreateRow(0).CreateCell(0).SetCellValue("Work Order Number");
|
||||
for (var i = 0; i < workOrderNumbers.Length; i++)
|
||||
{
|
||||
worksheet.CreateRow(i + 1).CreateCell(0).SetCellValue(workOrderNumbers[i]);
|
||||
}
|
||||
|
||||
using var stream = new MemoryStream();
|
||||
workbook.Write(stream, leaveOpen: true);
|
||||
return stream.ToArray();
|
||||
}
|
||||
|
||||
private static byte[] CreateItemExcel(string[] itemNumbers)
|
||||
{
|
||||
using var workbook = new XSSFWorkbook();
|
||||
var worksheet = workbook.CreateSheet("Sheet1");
|
||||
worksheet.CreateRow(0).CreateCell(0).SetCellValue("Item Number");
|
||||
for (var i = 0; i < itemNumbers.Length; i++)
|
||||
{
|
||||
worksheet.CreateRow(i + 1).CreateCell(0).SetCellValue(itemNumbers[i]);
|
||||
}
|
||||
|
||||
using var stream = new MemoryStream();
|
||||
workbook.Write(stream, leaveOpen: true);
|
||||
return stream.ToArray();
|
||||
}
|
||||
|
||||
private static byte[] CreateComponentLotExcel((string LotNumber, string ItemNumber)[] lots)
|
||||
{
|
||||
using var workbook = new XSSFWorkbook();
|
||||
var worksheet = workbook.CreateSheet("Sheet1");
|
||||
var header = worksheet.CreateRow(0);
|
||||
header.CreateCell(0).SetCellValue("Lot Number");
|
||||
header.CreateCell(1).SetCellValue("Item Number");
|
||||
|
||||
for (var i = 0; i < lots.Length; i++)
|
||||
{
|
||||
var row = worksheet.CreateRow(i + 1);
|
||||
row.CreateCell(0).SetCellValue(lots[i].LotNumber);
|
||||
row.CreateCell(1).SetCellValue(lots[i].ItemNumber);
|
||||
}
|
||||
|
||||
using var stream = new MemoryStream();
|
||||
workbook.Write(stream, leaveOpen: true);
|
||||
return stream.ToArray();
|
||||
}
|
||||
|
||||
private static byte[] CreatePartOperationExcel((string ItemNumber, string OpNumber, string MisNumber, string MisRevision)[] operations)
|
||||
{
|
||||
using var workbook = new XSSFWorkbook();
|
||||
var worksheet = workbook.CreateSheet("Sheet1");
|
||||
var header = worksheet.CreateRow(0);
|
||||
header.CreateCell(0).SetCellValue("Item Number");
|
||||
header.CreateCell(1).SetCellValue("Operation Number");
|
||||
header.CreateCell(2).SetCellValue("MIS Number");
|
||||
header.CreateCell(3).SetCellValue("MIS Revision");
|
||||
|
||||
for (var i = 0; i < operations.Length; i++)
|
||||
{
|
||||
var row = worksheet.CreateRow(i + 1);
|
||||
row.CreateCell(0).SetCellValue(operations[i].ItemNumber);
|
||||
row.CreateCell(1).SetCellValue(operations[i].OpNumber);
|
||||
row.CreateCell(2).SetCellValue(operations[i].MisNumber);
|
||||
row.CreateCell(3).SetCellValue(operations[i].MisRevision);
|
||||
}
|
||||
|
||||
using var stream = new MemoryStream();
|
||||
workbook.Write(stream, leaveOpen: true);
|
||||
return stream.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user