diff --git a/NEW/tests/JdeScoping.DataSync.Tests/Etl/Transformers/RegexTransformerTests.cs b/NEW/tests/JdeScoping.DataSync.Tests/Etl/Transformers/RegexTransformerTests.cs index 7af4ea0..1390b03 100644 --- a/NEW/tests/JdeScoping.DataSync.Tests/Etl/Transformers/RegexTransformerTests.cs +++ b/NEW/tests/JdeScoping.DataSync.Tests/Etl/Transformers/RegexTransformerTests.cs @@ -1,4 +1,5 @@ using System.Data; +using System.Text.RegularExpressions; using JdeScoping.DataSync.Etl.Transformers; using NSubstitute; @@ -120,6 +121,132 @@ public class RegexTransformerTests Assert.Equal(string.Empty, reader.GetValue(0)); } + [Fact] + public void FindReplace_UseCaptureGroups() + { + // Arrange - swap two numbers + var source = CreateMockReader( + columns: new[] { "Value" }, + values: new object[] { "123-456" }); + + var transformer = new RegexTransformer( + columnName: "Value", + pattern: @"(\d+)-(\d+)", + replacement: "$2-$1"); + + // Act + var reader = transformer.Transform(source); + source.Read().Returns(true); + reader.Read(); + + // Assert + Assert.Equal("456-123", reader.GetValue(0)); + } + + [Fact] + public void IgnoreCase_MatchesDifferentCase() + { + // Arrange + var source = CreateMockReader( + columns: new[] { "BatchID" }, + values: new object[] { "IIS_12345" }); + + var transformer = new RegexTransformer( + columnName: "BatchID", + pattern: "^iis_", // lowercase pattern + replacement: "", + ignoreCase: true); + + // Act + var reader = transformer.Transform(source); + source.Read().Returns(true); + reader.Read(); + + // Assert + Assert.Equal("12345", reader.GetValue(0)); + } + + [Fact] + public void NullValue_PassesThrough() + { + // Arrange + var source = CreateMockReader( + columns: new[] { "BatchID" }, + values: new object[] { DBNull.Value }); + + var transformer = new RegexTransformer( + columnName: "BatchID", + pattern: "^IIS_", + replacement: ""); + + // Act + var reader = transformer.Transform(source); + source.Read().Returns(true); + reader.Read(); + + // Assert + Assert.Equal(DBNull.Value, reader.GetValue(0)); + } + + [Fact] + public void NonTargetColumn_Unchanged() + { + // Arrange + var source = CreateMockReader( + columns: new[] { "BatchID", "OtherColumn" }, + values: new object[] { "IIS_12345", "IIS_Should_Not_Change" }); + + var transformer = new RegexTransformer( + columnName: "BatchID", + pattern: "^IIS_", + replacement: ""); + + // Act + var reader = transformer.Transform(source); + source.Read().Returns(true); + reader.Read(); + + // Assert + Assert.Equal("12345", reader.GetValue(0)); + Assert.Equal("IIS_Should_Not_Change", reader.GetValue(1)); + } + + [Fact] + public void InvalidRegex_ThrowsOnTransform() + { + // Arrange + var source = CreateMockReader( + columns: new[] { "Value" }, + values: new object[] { "test" }); + + var transformer = new RegexTransformer( + columnName: "Value", + pattern: "[invalid(regex", + replacement: ""); + + // Act & Assert + var ex = Assert.Throws(() => transformer.Transform(source)); + Assert.Contains("Invalid", ex.Message, StringComparison.OrdinalIgnoreCase); + } + + [Fact] + public void ColumnNotFound_ThrowsOnTransform() + { + // Arrange + var source = CreateMockReader( + columns: new[] { "Value" }, + values: new object[] { "test" }); + source.GetOrdinal("NonExistent").Returns(_ => throw new IndexOutOfRangeException("Column not found")); + + var transformer = new RegexTransformer( + columnName: "NonExistent", + pattern: "test", + replacement: ""); + + // Act & Assert + Assert.Throws(() => transformer.Transform(source)); + } + private static IDataReader CreateMockReader(string[] columns, object[] values) { var reader = Substitute.For();