using StellaOps.Policy.Engine.Domain; using StellaOps.Policy.Engine.Services; using Xunit; namespace StellaOps.Policy.Engine.Tests; public class PolicyPackRepositoryTests { private readonly InMemoryPolicyPackRepository repository = new(); [Fact] public async Task ActivateRevision_WithSingleApprover_ActivatesImmediately() { await repository.CreateAsync("pack-1", "Pack", CancellationToken.None); await repository.UpsertRevisionAsync("pack-1", 1, requiresTwoPersonApproval: false, PolicyRevisionStatus.Approved, CancellationToken.None); var result = await repository.RecordActivationAsync("pack-1", 1, "alice", DateTimeOffset.UtcNow, null, CancellationToken.None); Assert.Equal(PolicyActivationResultStatus.Activated, result.Status); Assert.NotNull(result.Revision); Assert.Equal(PolicyRevisionStatus.Active, result.Revision!.Status); Assert.Single(result.Revision.Approvals); } [Fact] public async Task ActivateRevision_WithTwoPersonRequirement_ReturnsPendingUntilSecondApproval() { await repository.CreateAsync("pack-2", "Pack", CancellationToken.None); await repository.UpsertRevisionAsync("pack-2", 1, requiresTwoPersonApproval: true, PolicyRevisionStatus.Approved, CancellationToken.None); var first = await repository.RecordActivationAsync("pack-2", 1, "alice", DateTimeOffset.UtcNow, null, CancellationToken.None); Assert.Equal(PolicyActivationResultStatus.PendingSecondApproval, first.Status); Assert.Equal(PolicyRevisionStatus.Approved, first.Revision!.Status); Assert.Single(first.Revision.Approvals); var duplicate = await repository.RecordActivationAsync("pack-2", 1, "alice", DateTimeOffset.UtcNow, null, CancellationToken.None); Assert.Equal(PolicyActivationResultStatus.DuplicateApproval, duplicate.Status); var second = await repository.RecordActivationAsync("pack-2", 1, "bob", DateTimeOffset.UtcNow, null, CancellationToken.None); Assert.Equal(PolicyActivationResultStatus.Activated, second.Status); Assert.Equal(PolicyRevisionStatus.Active, second.Revision!.Status); Assert.Equal(2, second.Revision.Approvals.Length); } }