using JdeScoping.DataSync.Configuration; using Shouldly; namespace JdeScoping.DataSync.Tests.Configuration; public class PipelinesRootTests { [Fact] public void EffectiveScheduleDefaults_WhenNull_ReturnsDefaults() { var root = new PipelinesRoot(null, null, new Dictionary()); var defaults = root.EffectiveScheduleDefaults; defaults.ShouldNotBeNull(); defaults.Mass.IntervalMinutes.ShouldBe(10080); defaults.Daily.IntervalMinutes.ShouldBe(1440); defaults.Hourly.IntervalMinutes.ShouldBe(60); } [Fact] public void EffectiveScheduleDefaults_WhenProvided_ReturnsProvided() { var customDefaults = new ScheduleDefaults { Mass = new ScheduleConfig { IntervalMinutes = 20000 } }; var root = new PipelinesRoot(null, customDefaults, new Dictionary()); var defaults = root.EffectiveScheduleDefaults; defaults.Mass.IntervalMinutes.ShouldBe(20000); } [Fact] public void EffectiveSettings_WhenNull_ReturnsDefaults() { var root = new PipelinesRoot(null, null, new Dictionary()); var settings = root.EffectiveSettings; settings.ShouldNotBeNull(); settings.Timezone.ShouldBe("UTC"); } [Fact] public void EffectiveSettings_WhenProvided_ReturnsProvided() { var customSettings = new PipelineSettings("America/New_York"); var root = new PipelinesRoot(customSettings, null, new Dictionary()); var settings = root.EffectiveSettings; settings.Timezone.ShouldBe("America/New_York"); } [Fact] public void Pipelines_WhenProvided_StoresCorrectly() { var pipelines = new Dictionary { ["TestTable"] = CreateMinimalPipelineConfig() }; var root = new PipelinesRoot(null, null, pipelines); root.Pipelines.ShouldContainKey("TestTable"); root.Pipelines["TestTable"].Destination.Table.ShouldBe("TestTable"); } [Fact] public void PipelineConfig_WithSchedules_ParsesCorrectly() { var config = new PipelineConfig( new SourceConfig("jde", "SELECT 1", null, null), null, // Old SyncModes - deprecated new PipelineSchedules { Mass = new ScheduleConfig { PrePurge = true, ReIndex = true }, Daily = new ScheduleConfig { Enabled = true }, Hourly = new ScheduleConfig { Enabled = false } }, null, new DestinationConfig("TestTable", ["Id"], null), null, null); config.Schedules.ShouldNotBeNull(); config.Schedules!.Mass!.PrePurge.ShouldBeTrue(); config.Schedules!.Hourly!.Enabled.ShouldBeFalse(); } private static PipelineConfig CreateMinimalPipelineConfig() { return new PipelineConfig( new SourceConfig("lotfinder", "SELECT 1", null, null), new Dictionary { ["mass"] = new SyncModeConfig(null, true, true), ["incremental"] = new SyncModeConfig("-1d") }, null, // Schedules null, // Transformers new DestinationConfig("TestTable", ["Id"], null), null, null); } }