using System.Data; using JdeScoping.DataSync.Etl.Transformers; using NSubstitute; namespace JdeScoping.DataSync.Tests.Etl.Transformers; public class ColumnDropTransformerTests { [Fact] public void FieldCount_ExcludesDroppedColumns() { var source = CreateMockReader(new[] { "Id", "Name", "DropMe", "Value" }); var transformer = new ColumnDropTransformer("DropMe"); var reader = transformer.Transform(source); Assert.Equal(3, reader.FieldCount); } [Fact] public void GetName_SkipsDroppedColumns() { var source = CreateMockReader(new[] { "Id", "Name", "DropMe", "Value" }); var transformer = new ColumnDropTransformer("DropMe"); var reader = transformer.Transform(source); Assert.Equal("Id", reader.GetName(0)); Assert.Equal("Name", reader.GetName(1)); Assert.Equal("Value", reader.GetName(2)); } [Fact] public void GetOrdinal_ReturnsRemappedOrdinal() { var source = CreateMockReader(new[] { "Id", "Name", "DropMe", "Value" }); var transformer = new ColumnDropTransformer("DropMe"); var reader = transformer.Transform(source); Assert.Equal(0, reader.GetOrdinal("Id")); Assert.Equal(1, reader.GetOrdinal("Name")); Assert.Equal(2, reader.GetOrdinal("Value")); } [Fact] public void GetOrdinal_DroppedColumn_ThrowsIndexOutOfRange() { var source = CreateMockReader(new[] { "Id", "Name", "DropMe", "Value" }); var transformer = new ColumnDropTransformer("DropMe"); var reader = transformer.Transform(source); Assert.Throws(() => reader.GetOrdinal("DropMe")); } [Fact] public void GetValue_ReturnsCorrectValues() { var source = CreateMockReader(new[] { "Id", "Name", "DropMe", "Value" }, new object[] { 1, "Test", "Dropped", 42 }); source.Read().Returns(true); var transformer = new ColumnDropTransformer("DropMe"); var reader = transformer.Transform(source); reader.Read(); Assert.Equal(1, reader.GetValue(0)); Assert.Equal("Test", reader.GetValue(1)); Assert.Equal(42, reader.GetValue(2)); } [Fact] public void MultipleDroppedColumns_AllExcluded() { var source = CreateMockReader(new[] { "Id", "Drop1", "Name", "Drop2", "Value" }); var transformer = new ColumnDropTransformer("Drop1", "Drop2"); var reader = transformer.Transform(source); Assert.Equal(3, reader.FieldCount); Assert.Equal("Id", reader.GetName(0)); Assert.Equal("Name", reader.GetName(1)); Assert.Equal("Value", reader.GetName(2)); } [Fact] public void MapOrdinal_DroppedColumn_MapsCorrectly() { // Arrange - drop column B (ordinal 1), so C becomes ordinal 1 var source = CreateMockReader(new[] { "A", "B", "C" }); var transformer = new ColumnDropTransformer("B"); transformer.Transform(source); // Act - transformed ordinal 1 should map to source ordinal 2 (C) var result = transformer.MapOrdinal(1, source); // Assert Assert.Equal(2, result); } private static IDataReader CreateMockReader(string[] columns, object[]? values = null) { var reader = Substitute.For(); reader.FieldCount.Returns(columns.Length); for (int i = 0; i < columns.Length; i++) { var index = i; reader.GetName(index).Returns(columns[index]); reader.GetOrdinal(columns[index]).Returns(index); if (values != null) reader.GetValue(index).Returns(values[index]); } return reader; } }