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:
@@ -1,4 +1,5 @@
|
|||||||
using System.Data;
|
using System.Data;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using JdeScoping.DataSync.Etl.Transformers;
|
using JdeScoping.DataSync.Etl.Transformers;
|
||||||
using NSubstitute;
|
using NSubstitute;
|
||||||
|
|
||||||
@@ -120,6 +121,132 @@ public class RegexTransformerTests
|
|||||||
Assert.Equal(string.Empty, reader.GetValue(0));
|
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)
|
private static IDataReader CreateMockReader(string[] columns, object[] values)
|
||||||
{
|
{
|
||||||
var reader = Substitute.For<IDataReader>();
|
var reader = Substitute.For<IDataReader>();
|
||||||
|
|||||||
Reference in New Issue
Block a user