109 lines
3.8 KiB
C#
109 lines
3.8 KiB
C#
using System.Data;
|
|
using JdeScoping.DataSync.Etl.Transformers;
|
|
using NSubstitute;
|
|
|
|
namespace JdeScoping.DataSync.Tests.Etl.Transformers;
|
|
|
|
public class ColumnRenameTransformerTests
|
|
{
|
|
[Fact]
|
|
public void GetName_ReturnsRenamedColumn()
|
|
{
|
|
var source = CreateMockReader(new[] { "OldName", "Other" });
|
|
var transformer = new ColumnRenameTransformer(("OldName", "NewName"));
|
|
var reader = transformer.Transform(source);
|
|
Assert.Equal("NewName", reader.GetName(0));
|
|
Assert.Equal("Other", reader.GetName(1));
|
|
}
|
|
|
|
[Fact]
|
|
public void GetOrdinal_FindsByNewName()
|
|
{
|
|
var source = CreateMockReader(new[] { "OldName", "Other" });
|
|
var transformer = new ColumnRenameTransformer(("OldName", "NewName"));
|
|
var reader = transformer.Transform(source);
|
|
Assert.Equal(0, reader.GetOrdinal("NewName"));
|
|
}
|
|
|
|
[Fact]
|
|
public void GetOrdinal_OldName_ThrowsIndexOutOfRange()
|
|
{
|
|
var source = CreateMockReader(new[] { "OldName", "Other" });
|
|
var transformer = new ColumnRenameTransformer(("OldName", "NewName"));
|
|
var reader = transformer.Transform(source);
|
|
Assert.Throws<IndexOutOfRangeException>(() => reader.GetOrdinal("OldName"));
|
|
}
|
|
|
|
[Fact]
|
|
public void FieldCount_Unchanged()
|
|
{
|
|
var source = CreateMockReader(new[] { "OldName", "Other" });
|
|
var transformer = new ColumnRenameTransformer(("OldName", "NewName"));
|
|
var reader = transformer.Transform(source);
|
|
Assert.Equal(2, reader.FieldCount);
|
|
}
|
|
|
|
[Fact]
|
|
public void MultipleRenames_AllApplied()
|
|
{
|
|
var source = CreateMockReader(new[] { "A", "B", "C" });
|
|
var transformer = new ColumnRenameTransformer(("A", "Alpha"), ("C", "Charlie"));
|
|
var reader = transformer.Transform(source);
|
|
Assert.Equal("Alpha", reader.GetName(0));
|
|
Assert.Equal("B", reader.GetName(1));
|
|
Assert.Equal("Charlie", reader.GetName(2));
|
|
}
|
|
|
|
[Fact]
|
|
public void OnInitialize_RenameCollision_ThrowsInvalidOperationException()
|
|
{
|
|
// Arrange - renaming A to B when B already exists
|
|
var transformer = new ColumnRenameTransformer(("A", "B"));
|
|
var source = CreateMockReader(new[] { "A", "B", "C" });
|
|
|
|
// Act & Assert
|
|
var ex = Assert.Throws<InvalidOperationException>(() =>
|
|
transformer.Transform(source));
|
|
Assert.Contains("A", ex.Message);
|
|
Assert.Contains("B", ex.Message);
|
|
Assert.Contains("collision", ex.Message.ToLower());
|
|
}
|
|
|
|
[Fact]
|
|
public void OnInitialize_PreExistingDuplicates_ThrowsInvalidOperationException()
|
|
{
|
|
// Arrange - source has duplicate column names (case-insensitive)
|
|
var transformer = new ColumnRenameTransformer();
|
|
var source = CreateMockReaderWithDuplicates(new[] { "Name", "name" });
|
|
|
|
// Act & Assert
|
|
Assert.Throws<InvalidOperationException>(() =>
|
|
transformer.Transform(source));
|
|
}
|
|
|
|
private static IDataReader CreateMockReader(string[] columns)
|
|
{
|
|
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);
|
|
}
|
|
return reader;
|
|
}
|
|
|
|
private static IDataReader CreateMockReaderWithDuplicates(string[] columns)
|
|
{
|
|
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]);
|
|
}
|
|
return reader;
|
|
}
|
|
}
|