using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using SchotzIadKmTracker.Api.Data; using SchotzIadKmTracker.Api.Models.Entities; using SchotzIadKmTracker.Api.Services; namespace SchotzIadKmTracker.Tests.PrecisionDistance; /// /// Banc d'essai pour tester les services liés à la précision des distances /// (feature precision-distances-km) en isolation. /// /// Utilise un adossé à une base SQLite EN MÉMOIRE /// ("Data Source=:memory:") dont la connexion est maintenue ouverte pour la /// durée du harnais (la base disparaît à la fermeture de la connexion), sur le /// même modèle que . /// /// Expose les services réels (, , /// , , , /// ) branchés sur le même contexte, ainsi que des méthodes /// utilitaires pour insérer rapidement Véhicules/Trajets/Tranches de barème de test. /// public sealed class PrecisionDistanceTestHarness : IDisposable { private readonly SqliteConnection _connection; public AppDbContext Context { get; } public IPrecisionDistanceService PrecisionDistanceService { get; } public IBaremeService BaremeService { get; } public IResumeService ResumeService { get; } public IMontantRegleService MontantRegleService { get; } public PrecisionDistanceTestHarness() { _connection = new SqliteConnection("Data Source=:memory:"); _connection.Open(); // maintenue ouverte : garde la base en vie var options = new DbContextOptionsBuilder() .UseSqlite(_connection) .Options; Context = new AppDbContext(options); Context.Database.EnsureCreated(); PrecisionDistanceService = new SchotzIadKmTracker.Api.Services.PrecisionDistanceService(Context); BaremeService = new SchotzIadKmTracker.Api.Services.BaremeService(Context); ResumeService = new SchotzIadKmTracker.Api.Services.ResumeService(Context, PrecisionDistanceService); MontantRegleService = new SchotzIadKmTracker.Api.Services.MontantRegleService( Context, BaremeService, PrecisionDistanceService); } /// Insère un véhicule de test et retourne son identifiant. public int AjouterVehicule(int puissanceFiscale = 5, string plaque = "AA-000-AA", DateOnly? dateEffet = null) { var vehicule = new Vehicule { Denomination = "Véhicule de test", Plaque = plaque, PuissanceFiscale = puissanceFiscale, DateEffet = dateEffet ?? new DateOnly(2020, 1, 1), }; Context.Vehicules.Add(vehicule); Context.SaveChanges(); return vehicule.Id; } /// Insère un trajet de test et retourne son identifiant. public int AjouterTrajet( int vehiculeId, DateOnly date, decimal? distance, bool allerRetour = false, int puissanceFiscale = 5, decimal position = 1m) { var trajet = new Trajet { Date = date, AdresseDepart = "Départ test", AdresseArrivee = "Arrivée test", Distance = distance, AllerRetour = allerRetour, Position = position, VehiculeId = vehiculeId, PuissanceFiscale = puissanceFiscale, }; Context.Trajets.Add(trajet); Context.SaveChanges(); return trajet.Id; } /// Insère une tranche de barème unique (illimitée) couvrant tous les kilométrages. public void AjouterTrancheBaremeUnique(int annee, int puissanceFiscale, decimal coefficient, decimal baseFixe = 0m) { Context.TranchesBareme.Add(new TrancheBareme { Annee = annee, PuissanceFiscale = puissanceFiscale, KmMin = 0m, KmMax = null, Coefficient = coefficient, Base = baseFixe, }); Context.SaveChanges(); } public void Dispose() { Context.Dispose(); _connection.Dispose(); } }