feat(etl): implement JdeDateTransformer for Julian date parsing
Add transformer that combines JDE Julian date (CYYDDD) and time (HHMMSS) columns into a single DateTime column. Includes static ParseJdeDateTime method for direct date conversion.
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
using System.Data;
|
||||
using JdeScoping.DataSync.Etl.Transformers;
|
||||
using NSubstitute;
|
||||
|
||||
namespace JdeScoping.DataSync.Tests.Etl.Transformers;
|
||||
|
||||
public class JdeDateTransformerTests
|
||||
{
|
||||
[Fact]
|
||||
public void FieldCount_ReducedByOne()
|
||||
{
|
||||
var source = CreateMockReader(new[] { "Id", "UPMJ", "TDAY", "Name" }, new object[] { 1, 124001m, 120000m, "Test" });
|
||||
var transformer = new JdeDateTransformer("UPMJ", "TDAY", "UpdatedAt");
|
||||
var reader = transformer.Transform(source);
|
||||
Assert.Equal(3, reader.FieldCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetName_DateColumnRenamed_TimeColumnRemoved()
|
||||
{
|
||||
var source = CreateMockReader(new[] { "Id", "UPMJ", "TDAY", "Name" }, new object[] { 1, 124001m, 120000m, "Test" });
|
||||
var transformer = new JdeDateTransformer("UPMJ", "TDAY", "UpdatedAt");
|
||||
var reader = transformer.Transform(source);
|
||||
Assert.Equal("Id", reader.GetName(0));
|
||||
Assert.Equal("UpdatedAt", reader.GetName(1));
|
||||
Assert.Equal("Name", reader.GetName(2));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetValue_ParsesJulianDateAndTime()
|
||||
{
|
||||
// Julian date 124001 = Jan 1, 2024 (century digit 1 = 2000s, year 24, day 001)
|
||||
// Time 120000 = 12:00:00
|
||||
var source = CreateMockReader(new[] { "Id", "UPMJ", "TDAY", "Name" }, new object[] { 1, 124001m, 120000m, "Test" });
|
||||
source.Read().Returns(true);
|
||||
var transformer = new JdeDateTransformer("UPMJ", "TDAY", "UpdatedAt");
|
||||
var reader = transformer.Transform(source);
|
||||
reader.Read();
|
||||
var expectedDate = new DateTime(2024, 1, 1, 12, 0, 0);
|
||||
Assert.Equal(expectedDate, reader.GetValue(1));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetValue_NullDate_ReturnsDbNull()
|
||||
{
|
||||
var source = CreateMockReader(new[] { "Id", "UPMJ", "TDAY", "Name" }, new object[] { 1, DBNull.Value, DBNull.Value, "Test" });
|
||||
source.Read().Returns(true);
|
||||
source.IsDBNull(1).Returns(true);
|
||||
source.IsDBNull(2).Returns(true);
|
||||
var transformer = new JdeDateTransformer("UPMJ", "TDAY", "UpdatedAt");
|
||||
var reader = transformer.Transform(source);
|
||||
reader.Read();
|
||||
Assert.Equal(DBNull.Value, reader.GetValue(1));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetFieldType_DateColumn_ReturnsDateTime()
|
||||
{
|
||||
var source = CreateMockReader(new[] { "Id", "UPMJ", "TDAY", "Name" }, new object[] { 1, 124001m, 120000m, "Test" });
|
||||
var transformer = new JdeDateTransformer("UPMJ", "TDAY", "UpdatedAt");
|
||||
var reader = transformer.Transform(source);
|
||||
Assert.Equal(typeof(DateTime), reader.GetFieldType(1));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetOrdinal_NewDateColumn_ReturnsCorrectOrdinal()
|
||||
{
|
||||
var source = CreateMockReader(new[] { "Id", "UPMJ", "TDAY", "Name" }, new object[] { 1, 124001m, 120000m, "Test" });
|
||||
var transformer = new JdeDateTransformer("UPMJ", "TDAY", "UpdatedAt");
|
||||
var reader = transformer.Transform(source);
|
||||
Assert.Equal(1, reader.GetOrdinal("UpdatedAt"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ParseJdeDateTime_VariousDates()
|
||||
{
|
||||
// Test the static parsing method
|
||||
Assert.Equal(new DateTime(2024, 1, 1, 12, 0, 0), JdeDateTransformer.ParseJdeDateTime(124001m, 120000m));
|
||||
Assert.Equal(new DateTime(2023, 12, 31, 23, 59, 59), JdeDateTransformer.ParseJdeDateTime(123365m, 235959m));
|
||||
Assert.Equal(new DateTime(1999, 6, 15, 0, 0, 0), JdeDateTransformer.ParseJdeDateTime(99166m, 0m));
|
||||
}
|
||||
|
||||
private static IDataReader CreateMockReader(string[] columns, object[] values)
|
||||
{
|
||||
var reader = Substitute.For<IDataReader>();
|
||||
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);
|
||||
reader.GetValue(index).Returns(values[index]);
|
||||
reader.IsDBNull(index).Returns(values[index] == DBNull.Value);
|
||||
reader.GetFieldType(index).Returns(values[index]?.GetType() ?? typeof(object));
|
||||
}
|
||||
return reader;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user