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(() => 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(() => 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(() => transformer.Transform(source)); } private static IDataReader CreateMockReader(string[] columns) { 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); } return reader; } private static IDataReader CreateMockReaderWithDuplicates(string[] columns) { 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]); } return reader; } }