fix(deployment): purge SystemArtifactDeploymentRecords in the terminal-record retention sweep (review 2026-10-21 08/G2)

This commit is contained in:
Joseph Doherty
2026-10-22 06:20:44 -04:00
parent da5a049077
commit d6a9a79c27
7 changed files with 138 additions and 4 deletions
@@ -87,6 +87,32 @@ public class DeploymentServiceTests : TestKit
PendingDeploymentTtl = TestPendingTtl
});
// ── Terminal-record retention (review 2026-10-21 08/G2) ──
/// <summary>
/// The retention sweep also purges system artifact deployment records — one per Deploy
/// Artifacts run, never read back — with the same cutoff as terminal deployment records.
/// NOTE: the sweep is rate-limited by a process-wide static, so this is the only test in
/// the assembly that may drive <see cref="DeploymentService.TryPurgeTerminalDeploymentRecordsAsync"/>.
/// </summary>
/// <returns>A task that represents the asynchronous operation.</returns>
[Fact]
public async Task TryPurgeTerminalDeploymentRecords_AlsoPurgesSystemArtifactRecords()
{
_repo.PurgeTerminalDeploymentRecordsAsync(Arg.Any<DateTimeOffset>(), Arg.Any<int>(), Arg.Any<CancellationToken>())
.Returns(1);
_repo.PurgeSystemArtifactDeploymentRecordsAsync(Arg.Any<DateTimeOffset>(), Arg.Any<int>(), Arg.Any<CancellationToken>())
.Returns(3);
var purged = await _service.TryPurgeTerminalDeploymentRecordsAsync();
Assert.Equal(4, purged);
var expectedCutoff = DateTimeOffset.UtcNow - new DeploymentManagerOptions().TerminalDeploymentRecordRetention;
await _repo.Received(1).PurgeSystemArtifactDeploymentRecordsAsync(
Arg.Is<DateTimeOffset>(c => (c - expectedCutoff).Duration() < TimeSpan.FromMinutes(1)),
Arg.Any<int>(), Arg.Any<CancellationToken>());
}
// ── Deployment flow ──
/// <summary>Verifies that deploy instance async instance not found returns failure.</summary>