test(datasync): add edge case tests for RegexTransformer

Tests cover:
- Capture group substitution in replacement
- Case-insensitive matching
- Null/DBNull passthrough
- Non-target columns unchanged
- Invalid regex pattern handling
- Column not found handling
This commit is contained in:
Joseph Doherty
2026-01-22 07:16:25 -05:00
parent af73aeba77
commit 8734c57c9b
@@ -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<RegexParseException>(() => 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<IndexOutOfRangeException>(() => transformer.Transform(source));
}
private static IDataReader CreateMockReader(string[] columns, object[] values)
{
var reader = Substitute.For<IDataReader>();