using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using ZB.MOM.WW.ScadaBridge.AuditLog.Central; using ZB.MOM.WW.ScadaBridge.AuditLog.Configuration; using ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.Maintenance; namespace ZB.MOM.WW.ScadaBridge.AuditLog.Tests.Central; /// /// AuditLog:Archive:RetentionDays (ScadaBridge#109): 0 = never delete; otherwise in range /// and greater than the global AuditLog:RetentionDays. /// public sealed class AuditLogArchiveRetentionValidatorTests { /// Range check in the section validator. /// RetentionDays. /// Expected outcome. [Theory] [InlineData(0, true)] [InlineData(400, true)] [InlineData(36_500, true)] [InlineData(-1, false)] [InlineData(36_501, false)] public void SectionValidator_ChecksTheRange(int days, bool valid) { var result = new AuditLogArchiveOptionsValidator().Validate(null, new AuditLogArchiveOptions { RetentionDays = days }); Assert.Equal(valid, result.Succeeded); } /// Cross-section check against the global retention (365 here). /// RetentionDays. /// Expected outcome. [Theory] [InlineData(0, true)] [InlineData(366, true)] [InlineData(365, false)] [InlineData(30, false)] public void RetentionValidator_RequiresMoreThanTheGlobalRetention(int days, bool valid) { var validator = new AuditLogArchiveRetentionValidator(Options.Create(new AuditLogOptions { RetentionDays = 365 })); var result = validator.Validate(null, new AuditLogArchiveOptions { RetentionDays = days }); Assert.Equal(valid, result.Succeeded); if (!valid) { Assert.Contains("AuditLog:RetentionDays (365)", result.FailureMessage); } } /// The cross-section check is wired into the central registration. /// Archive RetentionDays. /// Whether binding succeeds. [Theory] [InlineData("0", true)] [InlineData("400", true)] [InlineData("100", false)] public void CentralRegistration_RejectsAnArchiveRetentionBelowTheGlobalOne(string days, bool valid) { var config = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary { ["AuditLog:SiteWriter:DatabasePath"] = ":memory:", ["AuditLog:RetentionDays"] = "365", ["AuditLog:Archive:RetentionDays"] = days, }) .Build(); var services = new ServiceCollection(); services.AddAuditLog(config); services.AddAuditLogCentralMaintenance(config); using var provider = services.BuildServiceProvider(); var resolve = () => provider.GetRequiredService>().Value; if (valid) { Assert.Equal(int.Parse(days), resolve().RetentionDays); } else { Assert.Contains("AuditLog:Archive:RetentionDays (100)", Assert.Throws(resolve).Message); } } }