perf: optimize ExcelIO tests with fixture-based consolidation
- Add WorkbookFixtureBase and 4 concrete fixtures for shared workbooks - Add ExcelTestHelpers with shared utility methods - Create Integration/ folder with 7 fixture-based test classes: - MinimalSearchTests (5 tests) - SearchResultsSheetTests (5 tests) - MisInfoSheetTests (11 tests) - InvestigationSheetTests (7 tests) - ProtectionAndStyleTests (7 tests) - LegacyFormatTests (5 tests) - LargeDataSetTests (1 test) - Delete redundant ExcelExportIntegrationTests.cs (26 tests) - Delete redundant LegacyComparisonTests.cs (16 tests) - Reduce workbook generations from ~42 to 4 fixtures - Test runtime reduced from ~18 min to ~4 min (76% improvement) - All 122 ExcelIO tests pass
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
using ClosedXML.Excel;
|
||||
using JdeScoping.ExcelIO.Tests.Fixtures;
|
||||
using Shouldly;
|
||||
using Xunit;
|
||||
|
||||
namespace JdeScoping.ExcelIO.Tests.Integration;
|
||||
|
||||
public class InvestigationSheetTests : IClassFixture<WithMisDataFixture>
|
||||
{
|
||||
private readonly XLWorkbook _workbook;
|
||||
private readonly IXLWorksheet _sheet;
|
||||
private readonly List<string> _headers;
|
||||
|
||||
public InvestigationSheetTests(WithMisDataFixture fixture)
|
||||
{
|
||||
_workbook = fixture.Workbook;
|
||||
_sheet = _workbook.Worksheet("Investigation");
|
||||
_headers = ExcelTestHelpers.GetHeadersFromSheet(_sheet);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void InvestigationSheet_Exists()
|
||||
{
|
||||
_workbook.Worksheets.TryGetWorksheet("Investigation", out _).ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ColumnCount_Is12()
|
||||
{
|
||||
_headers.Count.ShouldBe(12);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ColumnHeaders_MatchExpected()
|
||||
{
|
||||
_headers.ShouldContain("Work Center Code");
|
||||
_headers.ShouldContain("Work Order Number");
|
||||
_headers.ShouldContain("Work Order Start Date");
|
||||
_headers.ShouldContain("Job Step Number");
|
||||
_headers.ShouldContain("Function Operation Description");
|
||||
_headers.ShouldContain("Job Step End Date");
|
||||
_headers.ShouldContain("Function Code");
|
||||
_headers.ShouldContain("Was Job Step Added?");
|
||||
_headers.ShouldContain("Matched Job Step Number");
|
||||
_headers.ShouldContain("Item Number");
|
||||
_headers.ShouldContain("Item Description");
|
||||
_headers.ShouldContain("Routing Type");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ColumnOrder_MatchesSpec()
|
||||
{
|
||||
_headers[0].ShouldBe("Work Center Code");
|
||||
_headers[1].ShouldBe("Work Order Number");
|
||||
_headers[2].ShouldBe("Work Order Start Date");
|
||||
_headers[3].ShouldBe("Job Step Number");
|
||||
_headers[4].ShouldBe("Function Operation Description");
|
||||
_headers[5].ShouldBe("Job Step End Date");
|
||||
_headers[6].ShouldBe("Function Code");
|
||||
_headers[7].ShouldBe("Was Job Step Added?");
|
||||
_headers[8].ShouldBe("Matched Job Step Number");
|
||||
_headers[9].ShouldBe("Item Number");
|
||||
_headers[10].ShouldBe("Item Description");
|
||||
_headers[11].ShouldBe("Routing Type");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TableStyle_IsLight18()
|
||||
{
|
||||
var table = _sheet.Tables.First();
|
||||
table.Theme.ShouldBe(XLTableTheme.TableStyleLight18);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Protection_IsEnabled()
|
||||
{
|
||||
_sheet.Protection.IsProtected.ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DataRow_ContainsExpectedValues()
|
||||
{
|
||||
_sheet.Cell(2, 2).Value.GetNumber().ShouldBe(12345);
|
||||
_sheet.Cell(2, 10).Value.GetText().ShouldBe("ITEM-001");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
using ClosedXML.Excel;
|
||||
using JdeScoping.ExcelIO.Tests.Fixtures;
|
||||
using Shouldly;
|
||||
using Xunit;
|
||||
|
||||
namespace JdeScoping.ExcelIO.Tests.Integration;
|
||||
|
||||
public class LargeDataSetTests : IClassFixture<LargeDataSetFixture>
|
||||
{
|
||||
private readonly XLWorkbook _workbook;
|
||||
|
||||
public LargeDataSetTests(LargeDataSetFixture fixture)
|
||||
{
|
||||
_workbook = fixture.Workbook;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TableRowCount_Is1001()
|
||||
{
|
||||
var sheet = _workbook.Worksheet("Search Results");
|
||||
var table = sheet.Tables.First();
|
||||
table.RowCount().ShouldBe(1001); // 1 header + 1000 data rows
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
using Shouldly;
|
||||
using Xunit;
|
||||
using ExcelFormats = JdeScoping.ExcelIO.Formatting.ExcelFormats;
|
||||
|
||||
namespace JdeScoping.ExcelIO.Tests.Integration;
|
||||
|
||||
/// <summary>
|
||||
/// Tests for ExcelFormats constants - no workbook generation needed.
|
||||
/// </summary>
|
||||
public class LegacyFormatTests
|
||||
{
|
||||
[Fact]
|
||||
public void TimestampFormat_MatchesLegacy()
|
||||
{
|
||||
ExcelFormats.TimestampFormat.ShouldBe("[$-409]m/d/yy h:mm AM/PM;@");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DateFormat_MatchesLegacyPattern()
|
||||
{
|
||||
ExcelFormats.DateFormat.ShouldContain("MM/dd/yyyy");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void WrappedColumnWidth_MatchesLegacy()
|
||||
{
|
||||
ExcelFormats.WrappedColumnWidth.ShouldBe(65);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CriteriaPaddingFactor_MatchesLegacy()
|
||||
{
|
||||
ExcelFormats.CriteriaPaddingFactor.ShouldBe(1.15);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DataPaddingFactor_MatchesLegacy()
|
||||
{
|
||||
ExcelFormats.DataPaddingFactor.ShouldBe(1.30);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
using ClosedXML.Excel;
|
||||
using JdeScoping.ExcelIO.Tests.Fixtures;
|
||||
using Shouldly;
|
||||
using Xunit;
|
||||
|
||||
namespace JdeScoping.ExcelIO.Tests.Integration;
|
||||
|
||||
public class MinimalSearchTests : IClassFixture<MinimalSearchFixture>
|
||||
{
|
||||
private readonly XLWorkbook _workbook;
|
||||
|
||||
public MinimalSearchTests(MinimalSearchFixture fixture)
|
||||
{
|
||||
_workbook = fixture.Workbook;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SheetCount_IsTwo()
|
||||
{
|
||||
_workbook.Worksheets.Count.ShouldBe(2);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SearchCriteriaSheet_Exists()
|
||||
{
|
||||
_workbook.Worksheets.TryGetWorksheet("Search Criteria", out _).ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SearchResultsSheet_Exists()
|
||||
{
|
||||
_workbook.Worksheets.TryGetWorksheet("Search Results", out _).ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SearchCriteriaSheet_IsProtected()
|
||||
{
|
||||
var sheet = _workbook.Worksheet("Search Criteria");
|
||||
sheet.Protection.IsProtected.ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SearchResultsSheet_IsProtected()
|
||||
{
|
||||
var sheet = _workbook.Worksheet("Search Results");
|
||||
sheet.Protection.IsProtected.ShouldBeTrue();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
using ClosedXML.Excel;
|
||||
using JdeScoping.ExcelIO.Tests.Fixtures;
|
||||
using Shouldly;
|
||||
using Xunit;
|
||||
|
||||
namespace JdeScoping.ExcelIO.Tests.Integration;
|
||||
|
||||
public class MisInfoSheetTests : IClassFixture<WithMisDataFixture>
|
||||
{
|
||||
private readonly XLWorkbook _workbook;
|
||||
private readonly IXLWorksheet _sheet;
|
||||
private readonly List<string> _headers;
|
||||
|
||||
public MisInfoSheetTests(WithMisDataFixture fixture)
|
||||
{
|
||||
_workbook = fixture.Workbook;
|
||||
_sheet = _workbook.Worksheet("MIS Info");
|
||||
_headers = ExcelTestHelpers.GetHeadersFromSheet(_sheet);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SheetCount_IsFour()
|
||||
{
|
||||
_workbook.Worksheets.Count.ShouldBe(4);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MisInfoSheet_Exists()
|
||||
{
|
||||
_workbook.Worksheets.TryGetWorksheet("MIS Info", out _).ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ColumnCount_Is19()
|
||||
{
|
||||
_headers.Count.ShouldBe(19);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ColumnHeaders_MatchExpected()
|
||||
{
|
||||
_headers.ShouldContain("Item Number");
|
||||
_headers.ShouldContain("MIS Job Step Sequence Number");
|
||||
_headers.ShouldContain("MIS Number");
|
||||
_headers.ShouldContain("MIS Revision");
|
||||
_headers.ShouldContain("Item Description");
|
||||
_headers.ShouldContain("MIS Release Status");
|
||||
_headers.ShouldContain("MIS Release Date");
|
||||
_headers.ShouldContain("Branch Code");
|
||||
_headers.ShouldContain("Job Step Sequence Number");
|
||||
_headers.ShouldContain("Matched Sequence Number");
|
||||
_headers.ShouldContain("Matched to F3112Z1?");
|
||||
_headers.ShouldContain("Matched to F3003?");
|
||||
_headers.ShouldContain("Function Operation Description");
|
||||
_headers.ShouldContain("Char Number");
|
||||
_headers.ShouldContain("Test Description");
|
||||
_headers.ShouldContain("Sampling Type");
|
||||
_headers.ShouldContain("Sampling Value");
|
||||
_headers.ShouldContain("Tools & Gauges");
|
||||
_headers.ShouldContain("Work Instructions");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ColumnOrder_MatchesSpec()
|
||||
{
|
||||
_headers[0].ShouldBe("Item Number");
|
||||
_headers[1].ShouldBe("MIS Job Step Sequence Number");
|
||||
_headers[2].ShouldBe("MIS Number");
|
||||
_headers[3].ShouldBe("MIS Revision");
|
||||
_headers[4].ShouldBe("Item Description");
|
||||
_headers[5].ShouldBe("MIS Release Status");
|
||||
_headers[6].ShouldBe("MIS Release Date");
|
||||
_headers[7].ShouldBe("Branch Code");
|
||||
_headers[8].ShouldBe("Job Step Sequence Number");
|
||||
_headers[9].ShouldBe("Matched Sequence Number");
|
||||
_headers[10].ShouldBe("Matched to F3112Z1?");
|
||||
_headers[11].ShouldBe("Matched to F3003?");
|
||||
_headers[12].ShouldBe("Function Operation Description");
|
||||
_headers[13].ShouldBe("Char Number");
|
||||
_headers[14].ShouldBe("Test Description");
|
||||
_headers[15].ShouldBe("Sampling Type");
|
||||
_headers[16].ShouldBe("Sampling Value");
|
||||
_headers[17].ShouldBe("Tools & Gauges");
|
||||
_headers[18].ShouldBe("Work Instructions");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TableStyle_IsLight18()
|
||||
{
|
||||
var table = _sheet.Tables.First();
|
||||
table.Theme.ShouldBe(XLTableTheme.TableStyleLight18);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Protection_IsEnabled()
|
||||
{
|
||||
_sheet.Protection.IsProtected.ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DataRow_ContainsExpectedValues()
|
||||
{
|
||||
_sheet.Cell(2, 1).Value.GetText().ShouldBe("ITEM-001");
|
||||
_sheet.Cell(2, 3).Value.GetText().ShouldBe("MIS-001");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TestDescriptionColumn_IsWrapped()
|
||||
{
|
||||
var colIndex = _headers.IndexOf("Test Description") + 1;
|
||||
_sheet.Column(colIndex).Width.ShouldBe(65);
|
||||
_sheet.Column(colIndex).Style.Alignment.WrapText.ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ToolsGaugesColumn_IsWrapped()
|
||||
{
|
||||
var colIndex = _headers.IndexOf("Tools & Gauges") + 1;
|
||||
_sheet.Column(colIndex).Width.ShouldBe(65);
|
||||
_sheet.Column(colIndex).Style.Alignment.WrapText.ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void WorkInstructionsColumn_IsWrapped()
|
||||
{
|
||||
var colIndex = _headers.IndexOf("Work Instructions") + 1;
|
||||
_sheet.Column(colIndex).Width.ShouldBe(65);
|
||||
_sheet.Column(colIndex).Style.Alignment.WrapText.ShouldBeTrue();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
using ClosedXML.Excel;
|
||||
using JdeScoping.ExcelIO.Tests.Fixtures;
|
||||
using Shouldly;
|
||||
using Xunit;
|
||||
|
||||
namespace JdeScoping.ExcelIO.Tests.Integration;
|
||||
|
||||
public class ProtectionAndStyleTests : IClassFixture<WithMisDataFixture>
|
||||
{
|
||||
private readonly XLWorkbook _workbook;
|
||||
|
||||
public ProtectionAndStyleTests(WithMisDataFixture fixture)
|
||||
{
|
||||
_workbook = fixture.Workbook;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AllDataSheets_AreProtected()
|
||||
{
|
||||
_workbook.Worksheet("Search Results").Protection.IsProtected.ShouldBeTrue();
|
||||
_workbook.Worksheet("MIS Info").Protection.IsProtected.ShouldBeTrue();
|
||||
_workbook.Worksheet("Investigation").Protection.IsProtected.ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Protection_AllowsFiltering()
|
||||
{
|
||||
var sheet = _workbook.Worksheet("Search Results");
|
||||
sheet.Protection.AllowedElements.HasFlag(XLSheetProtectionElements.AutoFilter).ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Protection_AllowsSorting()
|
||||
{
|
||||
var sheet = _workbook.Worksheet("Search Results");
|
||||
sheet.Protection.AllowedElements.HasFlag(XLSheetProtectionElements.Sort).ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Protection_AllowsFormatting()
|
||||
{
|
||||
var sheet = _workbook.Worksheet("Search Results");
|
||||
sheet.Protection.AllowedElements.HasFlag(XLSheetProtectionElements.FormatCells).ShouldBeTrue();
|
||||
sheet.Protection.AllowedElements.HasFlag(XLSheetProtectionElements.FormatColumns).ShouldBeTrue();
|
||||
sheet.Protection.AllowedElements.HasFlag(XLSheetProtectionElements.FormatRows).ShouldBeTrue();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AllTables_UseLight18Style()
|
||||
{
|
||||
_workbook.Worksheet("Search Results").Tables.First().Theme.ShouldBe(XLTableTheme.TableStyleLight18);
|
||||
_workbook.Worksheet("MIS Info").Tables.First().Theme.ShouldBe(XLTableTheme.TableStyleLight18);
|
||||
_workbook.Worksheet("Investigation").Tables.First().Theme.ShouldBe(XLTableTheme.TableStyleLight18);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void HeaderCells_HaveCorrectFormatting()
|
||||
{
|
||||
var sheet = _workbook.Worksheet("Search Criteria");
|
||||
var headerCell = sheet.Cell(1, 1);
|
||||
headerCell.Style.Font.Bold.ShouldBeTrue();
|
||||
headerCell.Style.Fill.BackgroundColor.ShouldBe(XLColor.Gainsboro);
|
||||
headerCell.Style.Alignment.Horizontal.ShouldBe(XLAlignmentHorizontalValues.Center);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CriteriaTimestamp_MatchesLegacyFormat()
|
||||
{
|
||||
var sheet = _workbook.Worksheet("Search Criteria");
|
||||
var timestamp = sheet.Cell(4, 2).Value.GetText();
|
||||
timestamp.ShouldContain("Jan 15, 2024");
|
||||
timestamp.ShouldContain("02:30:45");
|
||||
timestamp.ShouldContain("EST");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
using ClosedXML.Excel;
|
||||
using JdeScoping.ExcelIO.Tests.Fixtures;
|
||||
using Shouldly;
|
||||
using Xunit;
|
||||
|
||||
namespace JdeScoping.ExcelIO.Tests.Integration;
|
||||
|
||||
public class SearchResultsSheetTests : IClassFixture<WithResultsFixture>
|
||||
{
|
||||
private readonly XLWorkbook _workbook;
|
||||
private readonly IXLWorksheet _sheet;
|
||||
private readonly List<string> _headers;
|
||||
|
||||
public SearchResultsSheetTests(WithResultsFixture fixture)
|
||||
{
|
||||
_workbook = fixture.Workbook;
|
||||
_sheet = _workbook.Worksheet("Search Results");
|
||||
_headers = ExcelTestHelpers.GetHeadersFromSheet(_sheet);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ColumnCount_Is19()
|
||||
{
|
||||
_headers.Count.ShouldBe(19);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ColumnHeaders_MatchExpected()
|
||||
{
|
||||
_headers.ShouldContain("Work Order Number");
|
||||
_headers.ShouldContain("Work Order Branch Code");
|
||||
_headers.ShouldContain("Lot Number");
|
||||
_headers.ShouldContain("Item Number");
|
||||
_headers.ShouldContain("Planning Family");
|
||||
_headers.ShouldContain("Stocking Type");
|
||||
_headers.ShouldContain("Order Quantity");
|
||||
_headers.ShouldContain("Held Quantity");
|
||||
_headers.ShouldContain("Scrapped Quantity");
|
||||
_headers.ShouldContain("Shipped Quantity");
|
||||
_headers.ShouldContain("Operation Step Branch Code");
|
||||
_headers.ShouldContain("Operation Step");
|
||||
_headers.ShouldContain("Operation Step Description");
|
||||
_headers.ShouldContain("Function Operation Description");
|
||||
_headers.ShouldContain("Operation Step Update Timestamp");
|
||||
_headers.ShouldContain("Status Code");
|
||||
_headers.ShouldContain("Status Description");
|
||||
_headers.ShouldContain("Status Update Timestamp");
|
||||
_headers.ShouldContain("Inclusion Reason");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ColumnOrder_MatchesSpec()
|
||||
{
|
||||
_headers[0].ShouldBe("Work Order Number");
|
||||
_headers[1].ShouldBe("Work Order Branch Code");
|
||||
_headers[2].ShouldBe("Lot Number");
|
||||
_headers[3].ShouldBe("Item Number");
|
||||
_headers[4].ShouldBe("Planning Family");
|
||||
_headers[5].ShouldBe("Stocking Type");
|
||||
_headers[6].ShouldBe("Order Quantity");
|
||||
_headers[7].ShouldBe("Held Quantity");
|
||||
_headers[8].ShouldBe("Scrapped Quantity");
|
||||
_headers[9].ShouldBe("Shipped Quantity");
|
||||
_headers[10].ShouldBe("Operation Step Branch Code");
|
||||
_headers[11].ShouldBe("Operation Step");
|
||||
_headers[12].ShouldBe("Operation Step Description");
|
||||
_headers[13].ShouldBe("Function Operation Description");
|
||||
_headers[14].ShouldBe("Operation Step Update Timestamp");
|
||||
_headers[15].ShouldBe("Status Code");
|
||||
_headers[16].ShouldBe("Status Description");
|
||||
_headers[17].ShouldBe("Status Update Timestamp");
|
||||
_headers[18].ShouldBe("Inclusion Reason");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TableStyle_IsLight18()
|
||||
{
|
||||
var table = _sheet.Tables.First();
|
||||
table.Theme.ShouldBe(XLTableTheme.TableStyleLight18);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DataRow_ContainsExpectedValues()
|
||||
{
|
||||
_sheet.Cell(2, 1).Value.GetNumber().ShouldBe(12345);
|
||||
_sheet.Cell(2, 3).Value.GetText().ShouldBe("LOT-001");
|
||||
_sheet.Cell(2, 4).Value.GetText().ShouldBe("ITEM-001");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user