feat(health): show site event-log/audit write and redaction failures on the Health dashboard (ScadaBridge#88)
New SiteWriteFailureBadges component renders warning badges for SiteEventLogWriteFailures, SiteAuditWriteFailures and AuditRedactionFailure when > 0 on online sites. The CLI 'health summary' already serialises the full latest report, so these counters are visible there unchanged. Claude-Session: https://claude.ai/code/session_01GT67AEHd2Acv1YPwGfXEoV
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
using Bunit;
|
||||
using ZB.MOM.WW.ScadaBridge.CentralUI.Components.Health;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Messages.Health;
|
||||
|
||||
namespace ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Monitoring;
|
||||
|
||||
/// <summary>Gitea #88: failure-counter badges on the Health dashboard site card.</summary>
|
||||
public class SiteWriteFailureBadgesTests : BunitContext
|
||||
{
|
||||
private static SiteHealthReport Report(long eventLog = 0, int audit = 0, int redaction = 0) =>
|
||||
new("site-a", 1, DateTimeOffset.UtcNow,
|
||||
new Dictionary<string, ZB.MOM.WW.ScadaBridge.Commons.Types.Enums.ConnectionHealth>(),
|
||||
new Dictionary<string, ZB.MOM.WW.ScadaBridge.Commons.Messages.Health.TagResolutionStatus>(),
|
||||
0, 0, new Dictionary<string, int>(), 0, 0, 0, 0,
|
||||
SiteAuditWriteFailures: audit,
|
||||
AuditRedactionFailure: redaction,
|
||||
SiteEventLogWriteFailures: eventLog);
|
||||
|
||||
private IRenderedComponent<SiteWriteFailureBadges> Render(SiteHealthReport? report, bool online = true) =>
|
||||
Render<SiteWriteFailureBadges>(p => p.Add(c => c.Report, report).Add(c => c.IsOnline, online));
|
||||
|
||||
/// <summary>All-zero counters render nothing.</summary>
|
||||
[Fact]
|
||||
public void ZeroCounters_RenderNoBadges() =>
|
||||
Assert.Empty(Render(Report()).FindAll(".badge"));
|
||||
|
||||
/// <summary>A missing report renders nothing.</summary>
|
||||
[Fact]
|
||||
public void NullReport_RendersNoBadges() =>
|
||||
Assert.Empty(Render(null).FindAll(".badge"));
|
||||
|
||||
/// <summary>Event-log write failures raise only their own badge.</summary>
|
||||
[Fact]
|
||||
public void EventLogFailures_ShowOwnBadgeOnly()
|
||||
{
|
||||
var cut = Render(Report(eventLog: 3));
|
||||
Assert.Single(cut.FindAll("[data-test='event-log-write-failures-badge']"));
|
||||
Assert.Single(cut.FindAll(".badge"));
|
||||
Assert.Contains("3", cut.Find("[data-test='event-log-write-failures-badge']").GetAttribute("title"));
|
||||
}
|
||||
|
||||
/// <summary>Audit write failures raise only their own badge.</summary>
|
||||
[Fact]
|
||||
public void AuditWriteFailures_ShowOwnBadgeOnly()
|
||||
{
|
||||
var cut = Render(Report(audit: 2));
|
||||
Assert.Single(cut.FindAll("[data-test='audit-write-failures-badge']"));
|
||||
Assert.Single(cut.FindAll(".badge"));
|
||||
}
|
||||
|
||||
/// <summary>Audit redaction failures raise only their own badge.</summary>
|
||||
[Fact]
|
||||
public void RedactionFailures_ShowOwnBadgeOnly()
|
||||
{
|
||||
var cut = Render(Report(redaction: 1));
|
||||
Assert.Single(cut.FindAll("[data-test='audit-redaction-failures-badge']"));
|
||||
Assert.Single(cut.FindAll(".badge"));
|
||||
}
|
||||
|
||||
/// <summary>All three counters render three badges.</summary>
|
||||
[Fact]
|
||||
public void AllCounters_ShowThreeBadges() =>
|
||||
Assert.Equal(3, Render(Report(1, 1, 1)).FindAll(".badge").Count);
|
||||
|
||||
/// <summary>An offline site renders no warning badges.</summary>
|
||||
[Fact]
|
||||
public void OfflineSite_ShowsNoBadges() =>
|
||||
Assert.Empty(Render(Report(1, 1, 1), online: false).FindAll(".badge"));
|
||||
}
|
||||
Reference in New Issue
Block a user