refactor(ExcelIO): delete old attribute-based infrastructure

- Remove OutputColumnAttribute, OutputTableAttribute, OutputColumnCache
- Remove AttributeTableWriter and ColumnFormatter
- Remove duplicate ExcelFormats from Mapping (use Formatting version)
- Remove OutputColumn model
- Add FilterEntryMaps for criteria sheet filter models
- Update CriteriaSheetGenerator to use FluentTableWriter
- Remove attributes from filter entry models (now use fluent maps)
- Update DI to register filter entry maps and remove old services
- Update tests to use new fluent infrastructure
- Delete obsolete test files for removed infrastructure

Task 16 of fluent-excel-mapping-implementation plan.
This commit is contained in:
Joseph Doherty
2026-01-06 23:56:02 -05:00
parent e98ce636e2
commit 621dd41a97
30 changed files with 287 additions and 891 deletions
@@ -1,7 +1,8 @@
using ClosedXML.Excel;
using JdeScoping.ExcelIO.Options;
using JdeScoping.ExcelIO.Generators;
using JdeScoping.ExcelIO.Helpers;
using JdeScoping.ExcelIO.Mapping;
using JdeScoping.ExcelIO.Mapping.Maps;
using JdeScoping.ExcelIO.Models.Reporting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
@@ -9,6 +10,10 @@ using NSubstitute;
using Shouldly;
using Xunit;
using SearchResult = JdeScoping.Core.Models.SearchResults.SearchResult;
using MisSearchResult = JdeScoping.Core.Models.SearchResults.MisSearchResult;
using MisNonMatchSearchResult = JdeScoping.Core.Models.SearchResults.MisNonMatchSearchResult;
namespace JdeScoping.ExcelIO.Tests;
/// <summary>
@@ -29,11 +34,33 @@ public class ExcelExportIntegrationTests
DataSheetPassword = "TestDataPass"
});
var cache = new OutputColumnCache();
var tableWriter = new AttributeTableWriter(cache);
var registry = CreateTestRegistry();
var tableWriter = new FluentTableWriter(registry);
var criteriaGenerator = new CriteriaSheetGenerator(_options, tableWriter);
_service = new ExcelExportService(_logger, _options, criteriaGenerator, tableWriter);
_service = new ExcelExportService(_logger, _options, criteriaGenerator, tableWriter, registry);
}
private static ExcelMapRegistry CreateTestRegistry()
{
var registry = new ExcelMapRegistry();
// Search result maps
registry.Register(new SearchResultMap());
registry.Register(new MisSearchResultMap());
registry.Register(new MisNonMatchSearchResultMap());
// Filter entry maps
registry.Register(new TimespanFilterMap());
registry.Register(new WorkOrderFilterEntryMap());
registry.Register(new ItemNumberFilterEntryMap());
registry.Register(new ProfitCenterFilterEntryMap());
registry.Register(new WorkCenterFilterEntryMap());
registry.Register(new OperatorFilterEntryMap());
registry.Register(new ComponentLotFilterEntryMap());
registry.Register(new ItemOperationMisFilterEntryMap());
return registry;
}
#region Sheet Count Tests
@@ -387,10 +414,13 @@ public class ExcelExportIntegrationTests
public async Task GenerateAsync_SearchResults_ContainsCorrectData()
{
var search = CreateMinimalSearchModel();
var searchResult = CreateSampleSearchResult();
searchResult.WorkOrderNumber = 99999;
searchResult.ItemNumber = "TEST-ITEM-001";
searchResult.LotNumber = "LOT-999";
var searchResult = new SearchResult
{
WorkOrderNumber = 99999,
ItemNumber = "TEST-ITEM-001",
LotNumber = "LOT-999",
Flagged = true
};
search.Results.Add(searchResult);
var result = await _service.GenerateAsync(search);
@@ -408,9 +438,16 @@ public class ExcelExportIntegrationTests
[Fact]
public async Task GenerateAsync_MisInfo_ContainsCorrectData()
{
var search = CreateSearchModelWithMisData();
search.MisResults![0].ItemNumber = "MIS-ITEM-001";
search.MisResults[0].MisNumber = "MIS-12345";
var search = CreateMinimalSearchModel();
search.ExtractMisData = true;
search.MisResults = [
new MisSearchResult
{
ItemNumber = "MIS-ITEM-001",
MisNumber = "MIS-12345"
}
];
search.MisNonMatchResults = [];
var result = await _service.GenerateAsync(search);
@@ -426,9 +463,16 @@ public class ExcelExportIntegrationTests
[Fact]
public async Task GenerateAsync_Investigation_ContainsCorrectData()
{
var search = CreateSearchModelWithMisData();
search.MisNonMatchResults![0].WorkOrderNumber = 77777;
search.MisNonMatchResults[0].ItemNumber = "INV-ITEM-001";
var search = CreateMinimalSearchModel();
search.ExtractMisData = true;
search.MisResults = [];
search.MisNonMatchResults = [
new MisNonMatchSearchResult
{
WorkOrderNumber = 77777,
ItemNumber = "INV-ITEM-001"
}
];
var result = await _service.GenerateAsync(search);