using FluentAssertions; using StellaOps.AirGap.Importer.Versioning; namespace StellaOps.AirGap.Importer.Tests.Versioning; public sealed class BundleVersionTests { [Fact] public void Parse_ShouldParseSemVer() { var createdAt = new DateTimeOffset(2025, 12, 14, 0, 0, 0, TimeSpan.Zero); var version = BundleVersion.Parse("1.2.3", createdAt); version.Major.Should().Be(1); version.Minor.Should().Be(2); version.Patch.Should().Be(3); version.Prerelease.Should().BeNull(); version.CreatedAt.Should().Be(createdAt); version.SemVer.Should().Be("1.2.3"); } [Fact] public void Parse_ShouldParsePrerelease() { var createdAt = new DateTimeOffset(2025, 12, 14, 0, 0, 0, TimeSpan.Zero); var version = BundleVersion.Parse("1.2.3-edge.1", createdAt); version.SemVer.Should().Be("1.2.3-edge.1"); version.Prerelease.Should().Be("edge.1"); } [Fact] public void IsNewerThan_ShouldCompareMajorMinorPatch() { var a = new BundleVersion(1, 2, 3, DateTimeOffset.UnixEpoch); var b = new BundleVersion(2, 0, 0, DateTimeOffset.UnixEpoch); b.IsNewerThan(a).Should().BeTrue(); a.IsNewerThan(b).Should().BeFalse(); } [Fact] public void IsNewerThan_ShouldTreatReleaseAsNewerThanPrerelease() { var now = new DateTimeOffset(2025, 12, 14, 0, 0, 0, TimeSpan.Zero); var prerelease = new BundleVersion(1, 2, 3, now, "alpha"); var release = new BundleVersion(1, 2, 3, now, null); release.IsNewerThan(prerelease).Should().BeTrue(); prerelease.IsNewerThan(release).Should().BeFalse(); } [Fact] public void IsNewerThan_ShouldOrderPrereleaseIdentifiers() { var now = new DateTimeOffset(2025, 12, 14, 0, 0, 0, TimeSpan.Zero); var alpha = new BundleVersion(1, 2, 3, now, "alpha"); var beta = new BundleVersion(1, 2, 3, now, "beta"); var rc1 = new BundleVersion(1, 2, 3, now, "rc.1"); var rc2 = new BundleVersion(1, 2, 3, now, "rc.2"); beta.IsNewerThan(alpha).Should().BeTrue(); rc1.IsNewerThan(beta).Should().BeTrue(); rc2.IsNewerThan(rc1).Should().BeTrue(); } [Fact] public void IsNewerThan_ShouldUseCreatedAtAsTiebreaker() { var earlier = new DateTimeOffset(2025, 12, 14, 0, 0, 0, TimeSpan.Zero); var later = earlier.AddMinutes(1); var a = new BundleVersion(1, 2, 3, earlier, "edge"); var b = new BundleVersion(1, 2, 3, later, "edge"); b.IsNewerThan(a).Should().BeTrue(); a.IsNewerThan(b).Should().BeFalse(); } }