using StellaOps.Scheduler.Models; namespace StellaOps.Scheduler.Models.Tests; public sealed class ImpactSetTests { [Fact] public void ImpactSetSortsImagesByDigest() { var selector = new Selector(SelectorScope.AllImages, tenantId: "tenant-alpha"); var images = new[] { new ImpactImage( imageDigest: "sha256:bbbb", registry: "registry.internal", repository: "app/api", namespaces: new[] { "team-a" }, tags: new[] { "prod", "latest" }, usedByEntrypoint: true, labels: new Dictionary { ["env"] = "prod", }), new ImpactImage( imageDigest: "sha256:aaaa", registry: "registry.internal", repository: "app/api", namespaces: new[] { "team-a" }, tags: new[] { "prod" }, usedByEntrypoint: false), }; var impactSet = new ImpactSet( selector, images, usageOnly: true, generatedAt: DateTimeOffset.Parse("2025-10-18T05:04:03Z"), total: 2, snapshotId: "snap-001"); Assert.Equal(SchedulerSchemaVersions.ImpactSet, impactSet.SchemaVersion); Assert.Equal(new[] { "sha256:aaaa", "sha256:bbbb" }, impactSet.Images.Select(i => i.ImageDigest)); Assert.True(impactSet.UsageOnly); Assert.Equal(2, impactSet.Total); var json = CanonicalJsonSerializer.Serialize(impactSet); Assert.Contains("\"snapshotId\":\"snap-001\"", json, StringComparison.Ordinal); } [Fact] public void ImpactImageRejectsInvalidDigest() { Assert.Throws(() => new ImpactImage("sha1:not-supported", "registry", "repo")); } }