using JdeScoping.DataSync.Configuration; using Shouldly; namespace JdeScoping.DataSync.Tests.Configuration; public class ScheduleConfigTests { [Fact] public void ScheduleConfig_DefaultValues_AreCorrect() { var config = new ScheduleConfig(); config.Enabled.ShouldBeTrue(); config.IntervalMinutes.ShouldBe(0); config.PrePurge.ShouldBeFalse(); config.ReIndex.ShouldBeFalse(); config.UpdateWhen.ShouldBeNull(); } [Fact] public void ScheduleConfig_WithValues_StoresCorrectly() { var config = new ScheduleConfig { Enabled = false, IntervalMinutes = 60, PrePurge = true, ReIndex = true, UpdateWhen = "src.LastUpdateDt > tgt.LastUpdateDt" }; config.Enabled.ShouldBeFalse(); config.IntervalMinutes.ShouldBe(60); config.PrePurge.ShouldBeTrue(); config.ReIndex.ShouldBeTrue(); config.UpdateWhen.ShouldBe("src.LastUpdateDt > tgt.LastUpdateDt"); } [Fact] public void ScheduleDefaults_HasCorrectDefaultValues() { var defaults = new ScheduleDefaults(); defaults.Mass.ShouldNotBeNull(); defaults.Daily.ShouldNotBeNull(); defaults.Hourly.ShouldNotBeNull(); } [Fact] public void ScheduleDefaults_Mass_HasCorrectValues() { var defaults = new ScheduleDefaults(); defaults.Mass.Enabled.ShouldBeTrue(); defaults.Mass.IntervalMinutes.ShouldBe(10080); // Weekly defaults.Mass.PrePurge.ShouldBeTrue(); defaults.Mass.ReIndex.ShouldBeTrue(); defaults.Mass.UpdateWhen.ShouldBeNull(); } [Fact] public void ScheduleDefaults_Daily_HasCorrectValues() { var defaults = new ScheduleDefaults(); defaults.Daily.Enabled.ShouldBeTrue(); defaults.Daily.IntervalMinutes.ShouldBe(1440); // Daily defaults.Daily.PrePurge.ShouldBeFalse(); defaults.Daily.ReIndex.ShouldBeFalse(); defaults.Daily.UpdateWhen.ShouldBe("src.LastUpdateDt > tgt.LastUpdateDt"); } [Fact] public void ScheduleDefaults_Hourly_HasCorrectValues() { var defaults = new ScheduleDefaults(); defaults.Hourly.Enabled.ShouldBeTrue(); defaults.Hourly.IntervalMinutes.ShouldBe(60); // Hourly defaults.Hourly.PrePurge.ShouldBeFalse(); defaults.Hourly.ReIndex.ShouldBeFalse(); defaults.Hourly.UpdateWhen.ShouldBe("src.LastUpdateDt > tgt.LastUpdateDt"); } [Fact] public void PipelineSchedules_AllPropertiesNullable() { var schedules = new PipelineSchedules(); schedules.Mass.ShouldBeNull(); schedules.Daily.ShouldBeNull(); schedules.Hourly.ShouldBeNull(); } [Fact] public void PipelineSchedules_WithValues_StoresCorrectly() { var schedules = new PipelineSchedules { Mass = new ScheduleConfig { PrePurge = true }, Daily = new ScheduleConfig { Enabled = true }, Hourly = new ScheduleConfig { Enabled = false } }; schedules.Mass.ShouldNotBeNull(); schedules.Mass!.PrePurge.ShouldBeTrue(); schedules.Daily.ShouldNotBeNull(); schedules.Daily!.Enabled.ShouldBeTrue(); schedules.Hourly.ShouldNotBeNull(); schedules.Hourly!.Enabled.ShouldBeFalse(); } [Fact] public void MergeWith_WhenConfigHasNoOverrides_ReturnsDefaultValues() { var config = new ScheduleConfig(); var defaults = new ScheduleConfig { Enabled = true, IntervalMinutes = 60, PrePurge = false, ReIndex = false, UpdateWhen = "src.LastUpdateDt > tgt.LastUpdateDt" }; var merged = config.MergeWith(defaults); merged.IntervalMinutes.ShouldBe(60); merged.UpdateWhen.ShouldBe("src.LastUpdateDt > tgt.LastUpdateDt"); } [Fact] public void MergeWith_WhenConfigHasOverrides_UsesOverrideValues() { var config = new ScheduleConfig { IntervalMinutes = 120, PrePurge = true, UpdateWhen = "custom condition" }; var defaults = new ScheduleConfig { IntervalMinutes = 60, PrePurge = false, UpdateWhen = "default condition" }; var merged = config.MergeWith(defaults); merged.IntervalMinutes.ShouldBe(120); merged.PrePurge.ShouldBeTrue(); merged.UpdateWhen.ShouldBe("custom condition"); } [Fact] public void MergeWith_PreservesEnabledFromConfig() { var config = new ScheduleConfig { Enabled = false }; var defaults = new ScheduleConfig { Enabled = true }; var merged = config.MergeWith(defaults); merged.Enabled.ShouldBeFalse(); } [Fact] public void MergeWith_WhenIntervalZero_UsesDefaultInterval() { var config = new ScheduleConfig { IntervalMinutes = 0 }; var defaults = new ScheduleConfig { IntervalMinutes = 1440 }; var merged = config.MergeWith(defaults); merged.IntervalMinutes.ShouldBe(1440); } }