using ZB.MOM.WW.ScadaBridge.Commons.Entities.Deployment; using ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.Repositories; namespace ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.Tests; /// /// Retention purge for rows (review 2026-10-21 /// 08/G2): one row is written per Deploy Artifacts run and nothing reads them back, so they /// must share the terminal deployment-record retention window. /// public sealed class SystemArtifactDeploymentPurgeTests : IDisposable { private readonly ScadaBridgeDbContext _context = SqliteTestHelper.CreateInMemoryContext(); private readonly DeploymentManagerRepository _repository; /// Initializes the repository over a fresh in-memory SQLite context. public SystemArtifactDeploymentPurgeTests() { _repository = new DeploymentManagerRepository(_context); } /// Releases the in-memory database. public void Dispose() => _context.Dispose(); private async Task SeedAsync(DateTimeOffset deployedAt) { await _repository.AddSystemArtifactDeploymentAsync( new SystemArtifactDeploymentRecord("Artifacts", "admin") { DeployedAt = deployedAt }); await _repository.SaveChangesAsync(); } /// Only rows older than the cutoff are deleted, in bounded batches. /// A task that represents the asynchronous operation. [Fact] public async Task Purge_DeletesOnlyRowsOlderThanCutoff_InBoundedBatches() { var now = DateTimeOffset.UtcNow; await SeedAsync(now.AddDays(-400)); await SeedAsync(now.AddDays(-380)); await SeedAsync(now.AddDays(-370)); await SeedAsync(now.AddDays(-1)); var cutoff = now.AddDays(-365); Assert.Equal(2, await _repository.PurgeSystemArtifactDeploymentRecordsAsync(cutoff, batchSize: 2)); Assert.Equal(1, await _repository.PurgeSystemArtifactDeploymentRecordsAsync(cutoff, batchSize: 2)); Assert.Equal(0, await _repository.PurgeSystemArtifactDeploymentRecordsAsync(cutoff, batchSize: 2)); var remaining = await _repository.GetAllSystemArtifactDeploymentsAsync(); var survivor = Assert.Single(remaining); Assert.True(survivor.DeployedAt > cutoff); } }