using System; using System.Collections.Generic; using System.Globalization; using FluentAssertions; using StellaOps.Replay.Core; using StellaOps.Scanner.Reachability; using Xunit; namespace StellaOps.Reachability.FixtureTests; public sealed class ReachabilityReplayWriterTests { [Fact] public void AttachEvidence_AppendsGraphsAndTracesDeterministically() { var manifest = new ReplayManifest { Scan = new ReplayScanMetadata { Id = "scan-123", Time = DateTimeOffset.Parse("2025-10-15T10:00:00Z", CultureInfo.InvariantCulture) } }; var graphs = new List { new("static", "cas://graph/B", "ABCDEF", "scanner-jvm", "1.0.0"), new("framework", "cas://graph/A", "abcdef", "scanner-jvm", "1.0.0"), new("static", "cas://graph/B", "ABCDEF", "scanner-jvm", "1.0.0") // duplicate }; var traces = new List { new("zastava", "cas://trace/1", "FFEE", DateTimeOffset.Parse("2025-10-15T09:00:00+02:00", CultureInfo.InvariantCulture)), new("zastava", "cas://trace/2", "ffee", DateTimeOffset.Parse("2025-10-15T09:05:00Z", CultureInfo.InvariantCulture)), new("zastava", "cas://trace/1", "FFEE", DateTimeOffset.Parse("2025-10-15T09:00:00Z", CultureInfo.InvariantCulture)) // duplicate once normalized }; var writer = new ReachabilityReplayWriter(); writer.AttachEvidence(manifest, graphs, traces); manifest.Reachability.Should().NotBeNull(); manifest.Reachability!.Graphs.Should().HaveCount(2); manifest.Reachability.Graphs[0].CasUri.Should().Be("cas://graph/A"); manifest.Reachability.Graphs[0].Sha256.Should().Be("abcdef"); manifest.Reachability.Graphs[1].CasUri.Should().Be("cas://graph/B"); manifest.Reachability.Graphs[1].Kind.Should().Be("static"); manifest.Reachability.RuntimeTraces.Should().HaveCount(2); manifest.Reachability.RuntimeTraces[0].RecordedAt.Should().Be(DateTimeOffset.Parse("2025-10-15T07:00:00Z")); manifest.Reachability.RuntimeTraces[0].Sha256.Should().Be("ffee"); manifest.Reachability.RuntimeTraces[1].CasUri.Should().Be("cas://trace/2"); } [Fact] public void AttachEvidence_DoesNotCreateSectionWhenEmpty() { var manifest = new ReplayManifest(); var writer = new ReachabilityReplayWriter(); writer.AttachEvidence(manifest, Array.Empty(), Array.Empty()); manifest.Reachability.Should().BeNull(); } }