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