namespace StellaOps.AuditPack.Tests; using StellaOps.AuditPack.Models; using StellaOps.AuditPack.Services; [Trait("Category", "Unit")] public class AuditPackBuilderTests { [Fact] public async Task Build_FromScanResult_CreatesCompletePack() { // Arrange var scanResult = new ScanResult("scan-123"); var builder = new AuditPackBuilder(); var options = new AuditPackOptions { Name = "test-pack" }; // Act var pack = await builder.BuildAsync(scanResult, options); // Assert pack.Should().NotBeNull(); pack.PackId.Should().NotBeNullOrEmpty(); pack.Name.Should().Be("test-pack"); pack.RunManifest.Should().NotBeNull(); pack.Verdict.Should().NotBeNull(); pack.EvidenceIndex.Should().NotBeNull(); pack.PackDigest.Should().NotBeNullOrEmpty(); } [Fact] public async Task Export_CreatesValidArchive() { // Arrange var scanResult = new ScanResult("scan-123"); var builder = new AuditPackBuilder(); var pack = await builder.BuildAsync(scanResult, new AuditPackOptions()); var outputPath = Path.Combine(Path.GetTempPath(), $"test-pack-{Guid.NewGuid():N}.tar.gz"); var exportOptions = new ExportOptions { Sign = false }; try { // Act await builder.ExportAsync(pack, outputPath, exportOptions); // Assert File.Exists(outputPath).Should().BeTrue(); var fileInfo = new FileInfo(outputPath); fileInfo.Length.Should().BeGreaterThan(0); } finally { if (File.Exists(outputPath)) File.Delete(outputPath); } } [Fact] public void PackDigest_IsComputedCorrectly() { // Arrange var pack = new AuditPack { PackId = "test-pack", Name = "Test Pack", CreatedAt = new DateTimeOffset(2025, 1, 1, 0, 0, 0, TimeSpan.Zero), RunManifest = new RunManifest("scan-1", DateTimeOffset.UtcNow), EvidenceIndex = new EvidenceIndex([]), Verdict = new Verdict("verdict-1", "pass"), OfflineBundle = new BundleManifest("bundle-1", "1.0"), Contents = new PackContents() }; // Act - digest should be set during build pack.PackDigest.Should().NotBeNull(); } }