using JdeScoping.ConfigManager.Models; using JdeScoping.ConfigManager.Services; namespace JdeScoping.ConfigManager.Tests.Services; public class ValidationServiceTests { private readonly ValidationService _sut; public ValidationServiceTests() { _sut = new ValidationService(); } [Fact] public void ValidateAppSettings_WithValidConfig_ReturnsNoErrors() { // Arrange var config = new ConfigModel { DataSync = new DataSyncSection { MaxDegreeOfParallelism = 4 } }; // Act var result = _sut.ValidateAppSettings(config); // Assert result.IsValid.ShouldBeTrue(); result.Errors.ShouldBeEmpty(); } [Fact] public void ValidateAppSettings_WithInvalidParallelism_ReturnsError() { // Arrange var config = new ConfigModel { DataSync = new DataSyncSection { MaxDegreeOfParallelism = 0 } }; // Act var result = _sut.ValidateAppSettings(config); // Assert result.IsValid.ShouldBeFalse(); result.Errors.ShouldContain(e => e.Contains("MaxDegreeOfParallelism")); } [Fact] public void ValidatePipelines_WithDuplicateNames_ReturnsError() { // Arrange - duplicate keys not possible in dictionary, but empty names are invalid var config = new PipelinesConfigModel { Pipelines = new Dictionary { [""] = new PipelineModel() } }; // Act var result = _sut.ValidatePipelines(config); // Assert result.IsValid.ShouldBeFalse(); } [Fact] public void ValidatePipelines_WithInvalidConnection_ReturnsError() { // Arrange var config = new PipelinesConfigModel { Pipelines = new Dictionary { ["Test"] = new PipelineModel { Source = new PipelineSource { Connection = "invalid" } } } }; // Act var result = _sut.ValidatePipelines(config); // Assert result.IsValid.ShouldBeFalse(); result.Errors.ShouldContain(e => e.Contains("Connection")); } }