namespace ScadaLink.HealthMonitoring.Tests; /// /// Bundle C (M5-T7) regression coverage. The Audit Log payload filter /// (DefaultAuditPayloadFilter) increments /// IAuditRedactionFailureCounter every time a header/body/SQL-param /// redactor stage throws and the filter has to over-redact the field with /// the <redacted: redactor error> marker. Bundle C bridges that /// counter into the Site Health Monitoring report payload as /// AuditRedactionFailure so a misconfigured / catastrophic regex /// surfaces on /monitoring/health rather than disappearing into a NoOp sink. /// Mirrors the Bundle G SiteAuditWriteFailures metric shape — same /// per-interval increment-and-reset semantics, same defaults-to-zero /// contract. /// public class AuditRedactionFailureMetricTests { private readonly SiteHealthCollector _collector = new(); [Fact] public void Increment_Three_Times_Counter_Reports_3() { _collector.IncrementAuditRedactionFailure(); _collector.IncrementAuditRedactionFailure(); _collector.IncrementAuditRedactionFailure(); var report = _collector.CollectReport("site-1"); Assert.Equal(3, report.AuditRedactionFailure); } [Fact] public void Report_Payload_Includes_AuditRedactionFailure_AsZeroByDefault() { var report = _collector.CollectReport("site-1"); Assert.Equal(0, report.AuditRedactionFailure); } /// /// Mirrors the existing per-interval reset semantics for ScriptErrorCount / /// AlarmEvaluationErrorCount / DeadLetterCount / SiteAuditWriteFailures — /// AuditRedactionFailure is an interval count, not a running total. /// [Fact] public void CollectReport_Resets_AuditRedactionFailure() { _collector.IncrementAuditRedactionFailure(); _collector.IncrementAuditRedactionFailure(); var first = _collector.CollectReport("site-1"); Assert.Equal(2, first.AuditRedactionFailure); var second = _collector.CollectReport("site-1"); Assert.Equal(0, second.AuditRedactionFailure); } }