103 lines
3.7 KiB
C#
103 lines
3.7 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));
|
|
}
|
|
|
|
[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<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;
|
|
}
|
|
}
|