Expose les coordonnées déjà géocodées dans ProfilDto (DomicileLatitude/Longitude) et TrajetDto (DepartLatitude/Longitude, ArriveeLatitude/Longitude) afin que le Frontend les réutilise sans déclencher un nouveau géocodage BAN : - Bouton « Utiliser mon domicile » (trajet-form) : utilise désormais les coordonnées du Profil au lieu de forcer un re-géocodage. - Actions « insérer avant/après » (trajet-list) : transmettent les coordonnées déjà connues du point de fin repris au formulaire d'insertion. Le résumé mensuel (ResumeService) résout les coordonnées via le Cache_Adresses pour chaque trajet (nouvelle méthode ConstruireResumeMensuelAvecCoordonneesAsync) ; le résumé annuel reste inchangé pour éviter des lookups de cache inutiles sur une vue qui n'affiche pas le détail des trajets. Met à jour design.md et design-requirements.md (Requirements 10 et 11) pour refléter le nouveau contrat d'API.
117 lines
4.4 KiB
C#
117 lines
4.4 KiB
C#
using Microsoft.Data.Sqlite;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using SchotzIadKmTracker.Api.Data;
|
|
using SchotzIadKmTracker.Api.Models.Entities;
|
|
using SchotzIadKmTracker.Api.Services;
|
|
|
|
namespace SchotzIadKmTracker.Tests.PrecisionDistance;
|
|
|
|
/// <summary>
|
|
/// Banc d'essai pour tester les services liés à la précision des distances
|
|
/// (feature precision-distances-km) en isolation.
|
|
///
|
|
/// Utilise un <see cref="AppDbContext"/> 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 <see cref="Tests.Auth.AuthTestHarness"/>.
|
|
///
|
|
/// Expose les services réels (<see cref="PrecisionDistanceService"/>, <see cref="BaremeService"/>,
|
|
/// <see cref="ResumeService"/>, <see cref="TotauxService"/>, <see cref="MontantRegleService"/>,
|
|
/// <see cref="RemboursementService"/>) 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.
|
|
/// </summary>
|
|
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<AppDbContext>()
|
|
.UseSqlite(_connection)
|
|
.Options;
|
|
|
|
Context = new AppDbContext(options);
|
|
Context.Database.EnsureCreated();
|
|
|
|
PrecisionDistanceService = new SchotzIadKmTracker.Api.Services.PrecisionDistanceService(Context);
|
|
BaremeService = new SchotzIadKmTracker.Api.Services.BaremeService(Context);
|
|
var adresseCacheRepository = new SchotzIadKmTracker.Api.Repositories.AdresseCacheRepository(Context);
|
|
var adresseCacheService = new SchotzIadKmTracker.Api.Services.AdresseCacheService(adresseCacheRepository, Context);
|
|
ResumeService = new SchotzIadKmTracker.Api.Services.ResumeService(Context, PrecisionDistanceService, adresseCacheService);
|
|
MontantRegleService = new SchotzIadKmTracker.Api.Services.MontantRegleService(
|
|
Context, BaremeService, PrecisionDistanceService);
|
|
}
|
|
|
|
/// <summary>Insère un véhicule de test et retourne son identifiant.</summary>
|
|
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;
|
|
}
|
|
|
|
/// <summary>Insère un trajet de test et retourne son identifiant.</summary>
|
|
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;
|
|
}
|
|
|
|
/// <summary>Insère une tranche de barème unique (illimitée) couvrant tous les kilométrages.</summary>
|
|
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();
|
|
}
|
|
}
|