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(); 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; } }