Files
jdescopingtool/NEW/tests/JdeScoping.DataSync.Tests/Etl/Transformers/ColumnDropTransformerTests.cs
T
Joseph Doherty f1b7809a45 feat(etl): implement ColumnDropTransformer
Add a data transformer that removes specified columns from the data stream.
Columns are matched by name (case-insensitive) and multiple columns can be
dropped in a single transformer. Includes comprehensive tests using NSubstitute
for mock IDataReader.
2026-01-03 09:10:54 -05:00

88 lines
3.2 KiB
C#

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<IndexOutOfRangeException>(() => 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));
}
private static IDataReader CreateMockReader(string[] columns, object[]? values = null)
{
var reader = Substitute.For<IDataReader>();
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;
}
}