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();
}
}