using ManagerService.Data; using ManagerService.Services; using ManagerService.Tests.Infrastructure; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging.Abstractions; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Xunit; namespace ManagerService.Tests.Services { public class AuditLogPurgeServiceTests { private static AuditLogPurgeService BuildService(MyInfoMateDbContext db, int? retentionDays) { var settings = new Dictionary(); if (retentionDays != null) settings["Audit:RetentionDays"] = retentionDays.ToString(); var configuration = new ConfigurationBuilder().AddInMemoryCollection(settings).Build(); return new AuditLogPurgeService(db, configuration, NullLogger.Instance); } private static AuditLog Entry(string id, DateTime timestamp) => new AuditLog { Id = id, EntityType = "User", EntityId = "u1", Action = "Update", UserId = "u1", Timestamp = timestamp }; /// /// Le verrou : sans configuration, rien n'est supprimé. C'est une suppression /// définitive et le pg_dump quotidien n'est pas en place — un job de purge qui /// partirait tout seul est exactement ce qu'on ne veut pas. /// [Fact] public async Task PurgeAsync_WithoutConfiguration_DeletesNothing() { using var db = DbContextFactory.Create(); db.AuditLogs.Add(Entry("a1", DateTime.UtcNow.AddYears(-5))); db.SaveChanges(); await BuildService(db, null).PurgeAsync(); Assert.Single(db.AuditLogs); } // ⚠️ La suppression elle-même se teste contre un vrai PostgreSQL, pas ici : // `ExecuteDeleteAsync` n'est pas traduisible par le provider InMemory. Écrire la // purge en chargeant les lignes puis `RemoveRange` la rendrait testable ici au prix // de charger un an de journal en mémoire — dégrader le code de production pour // satisfaire un provider de test. Voir AuditLogPurgePostgresTests. /// /// 12 mois, pas 13 : les 13 mois des statistiques existent pour comparer une saison à /// la précédente, les recopier ici serait du mimétisme. Ce test fige l'écart voulu. /// [Fact] public void DefaultRetention_IsTwelveMonths_NotThirteen() { Assert.Equal(365, AuditLogPurgeService.DefaultRetentionDays); Assert.NotEqual(MyInfoMateDbContext.StatsRetentionDays, AuditLogPurgeService.DefaultRetentionDays); } } }