Files
jdescopingtool/NEW/tests/JdeScoping.DataSync.Tests/Etl/Transformers/TransformingDataReaderTests.cs
T
Joseph Doherty 6e7bcadf68 feat(etl): implement TransformingDataReader and DataTransformerBase
Add core transformer infrastructure for the ETL pipeline:
- DataTransformerBase: abstract base class with virtual methods for
  field count, names, types, values, ordinals, and null checking
- TransformingDataReader: IDataReader wrapper that delegates to
  transformer, enabling on-the-fly data transformations
2026-01-03 09:08:17 -05:00

233 lines
6.5 KiB
C#

using System.Data;
using JdeScoping.DataSync.Etl.Transformers;
using NSubstitute;
namespace JdeScoping.DataSync.Tests.Etl.Transformers;
public class TransformingDataReaderTests
{
[Fact]
public void Read_DelegatesToSourceReader()
{
var source = Substitute.For<IDataReader>();
source.Read().Returns(true, true, false);
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
Assert.True(reader.Read());
Assert.True(reader.Read());
Assert.False(reader.Read());
}
[Fact]
public void FieldCount_DelegatesToTransformer()
{
var source = Substitute.For<IDataReader>();
source.FieldCount.Returns(5);
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
Assert.Equal(5, reader.FieldCount);
}
[Fact]
public void GetName_DelegatesToTransformer()
{
var source = Substitute.For<IDataReader>();
source.GetName(0).Returns("OriginalName");
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
Assert.Equal("OriginalName", reader.GetName(0));
}
[Fact]
public void GetValue_DelegatesToTransformer()
{
var source = Substitute.For<IDataReader>();
source.GetValue(0).Returns("TestValue");
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
Assert.Equal("TestValue", reader.GetValue(0));
}
[Fact]
public void GetOrdinal_DelegatesToTransformer()
{
var source = Substitute.For<IDataReader>();
source.GetOrdinal("TestField").Returns(3);
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
Assert.Equal(3, reader.GetOrdinal("TestField"));
}
[Fact]
public void GetFieldType_DelegatesToTransformer()
{
var source = Substitute.For<IDataReader>();
source.GetFieldType(0).Returns(typeof(string));
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
Assert.Equal(typeof(string), reader.GetFieldType(0));
}
[Fact]
public void IsDBNull_DelegatesToTransformer()
{
var source = Substitute.For<IDataReader>();
source.IsDBNull(0).Returns(true);
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
Assert.True(reader.IsDBNull(0));
}
[Fact]
public void Indexer_ByOrdinal_UsesGetValue()
{
var source = Substitute.For<IDataReader>();
source.GetValue(1).Returns("IndexedValue");
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
Assert.Equal("IndexedValue", reader[1]);
}
[Fact]
public void Indexer_ByName_UsesGetOrdinalAndGetValue()
{
var source = Substitute.For<IDataReader>();
source.GetOrdinal("TestColumn").Returns(2);
source.GetValue(2).Returns("NamedValue");
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
Assert.Equal("NamedValue", reader["TestColumn"]);
}
[Fact]
public void GetValues_PopulatesArrayWithTransformedValues()
{
var source = Substitute.For<IDataReader>();
source.FieldCount.Returns(3);
source.GetValue(0).Returns("Value0");
source.GetValue(1).Returns("Value1");
source.GetValue(2).Returns("Value2");
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
var values = new object[3];
var count = reader.GetValues(values);
Assert.Equal(3, count);
Assert.Equal("Value0", values[0]);
Assert.Equal("Value1", values[1]);
Assert.Equal("Value2", values[2]);
}
[Fact]
public void Dispose_DisposesSourceReader()
{
var source = Substitute.For<IDataReader>();
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
reader.Dispose();
source.Received(1).Dispose();
}
[Fact]
public void Close_ClosesSourceReader()
{
var source = Substitute.For<IDataReader>();
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
reader.Close();
source.Received(1).Close();
}
[Fact]
public void NextResult_DelegatesToSourceReader()
{
var source = Substitute.For<IDataReader>();
source.NextResult().Returns(true);
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
Assert.True(reader.NextResult());
}
[Fact]
public void Depth_DelegatesToSourceReader()
{
var source = Substitute.For<IDataReader>();
source.Depth.Returns(2);
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
Assert.Equal(2, reader.Depth);
}
[Fact]
public void IsClosed_DelegatesToSourceReader()
{
var source = Substitute.For<IDataReader>();
source.IsClosed.Returns(true);
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
Assert.True(reader.IsClosed);
}
[Fact]
public void RecordsAffected_DelegatesToSourceReader()
{
var source = Substitute.For<IDataReader>();
source.RecordsAffected.Returns(42);
var transformer = new PassThroughTransformer();
var reader = transformer.Transform(source);
Assert.Equal(42, reader.RecordsAffected);
}
[Fact]
public void Transform_ThrowsOnNullSource()
{
var transformer = new PassThroughTransformer();
Assert.Throws<ArgumentNullException>(() => transformer.Transform(null!));
}
[Fact]
public void TransformerName_ReturnsExpectedName()
{
var transformer = new PassThroughTransformer();
Assert.Equal("PassThrough", transformer.TransformerName);
}
private class PassThroughTransformer : DataTransformerBase
{
public override string TransformerName => "PassThrough";
}
}