using FluentAssertions; using Xunit; namespace BluejayInfraLint.Tests; [Trait("Category", "Unit")] public sealed class SignalControlPlatformManifestTests { private static readonly string Root = ManifestInventory.Load().BluejayRoot; [Fact] public void Monitoring_PrometheusScrapesSignalControlPiAppAndPirelayNodeExporter() { var monitoring = File.ReadAllText(Path.Combine(Root, "apps", "monitoring", "noc-monitoring.yaml")); monitoring.Should().Contain("job_name: \"signalcontrol-pi-app\""); monitoring.Should().Contain("metrics_path: /metrics/prometheus"); monitoring.Should().Contain("targets: [\"10.0.58.113:5200\"]"); monitoring.Should().Contain("host: \"signal-a.iamworkin.lan\""); monitoring.Should().Contain("targets: [\"10.0.58.113:9100\"]"); monitoring.Should().Contain("instance: \"pirelay\""); } [Fact] public void Monitoring_GrafanaMountsSignalControlDashboard() { var monitoring = File.ReadAllText(Path.Combine(Root, "apps", "monitoring", "noc-monitoring.yaml")); var dashboard = File.ReadAllText(Path.Combine(Root, "apps", "monitoring", "grafana-dashboard-signalcontrol.yaml")); monitoring.Should().Contain("name: dashboards-signalcontrol"); monitoring.Should().Contain("mountPath: /var/lib/grafana/dashboards/signalcontrol"); monitoring.Should().Contain("name: grafana-dashboard-signalcontrol"); dashboard.Should().Contain("\"uid\": \"flowercore-signalcontrol\""); dashboard.Should().Contain("signalcontrol_active_pattern"); dashboard.Should().Contain("signal_relay_writes_total"); dashboard.Should().Contain("node_cpu_seconds_total"); } [Fact] public void FcSignalControlReadme_DocumentsMtlsTelemetryAndDefaultOffAudit() { var readme = File.ReadAllText(Path.Combine(Root, "apps", "fc-signalcontrol", "README.md")); readme.Should().Contain("step-ca-agent"); readme.Should().Contain("10.0.58.113:5200"); readme.Should().Contain("10.0.58.113:9100"); readme.Should().Contain("PhysicalAudit:Enabled=false"); readme.Should().Contain("ForwardingEnabled=false"); readme.Should().Contain("Secrets, enrollment codes, private keys"); } }