Ce document resume les tests effectues apres la migration de l'API de SQL Server vers PostgreSQL.
- API ASP.NET Core
net10.0 - Base PostgreSQL via Docker Compose
- Provider ADO.NET :
Npgsql - Migrations automatiques : DbUp avec
dbup-postgresql - Acces data : Dapper
La base PostgreSQL utilisee pendant les tests etait celle du service Docker postgres.
Les secrets locaux, le contenu du .env et le fichier Firebase n'ont pas ete affiches ni documentes.
Les points suivants ont ete verifies :
- Le conteneur PostgreSQL demarre et passe en etat
healthy. - Docker Compose est valide avec
docker compose config --quiet. - L'API demarre avec une connection string PostgreSQL.
- DbUp se lance au demarrage de l'API.
- DbUp detecte les scripts deja executes et ne rejoue pas les migrations inutilement.
Les scripts DbUp PostgreSQL valides sont :
TableMasterApi/sql-scripts/001_InitialSchema.sqlTableMasterApi/sql-scripts/002_UpdateReservationStatus.sqlTableMasterApi/sql-scripts/003_AddDeviceTokens.sql
Un scenario complet a ete execute en HTTP contre l'API locale, avec creation d'un compte de test, recuperation d'un token JWT, puis appels authentifies.
Routes d'authentification et utilisateur :
POST /api/User: creation de comptePOST /api/Auth: loginPOST /api/Auth/refresh: renouvellement du refresh tokenGET /api/User/{id}: lecture utilisateurPUT /api/User: mise a jour utilisateurPUT /api/User/Password: changement de mot de passeDELETE /api/User: suppression de compte
Routes restaurant :
POST /api/Restaurant: creation restaurantGET /api/Restaurant/{id}: lecture restaurantGET /api/Restaurant: recherche restaurants avec pagination et distancePUT /api/Restaurant/{id}: modification restaurantDELETE /api/Restaurant/{id}: suppression restaurant
Routes tables :
POST /api/Table/Restaurant/{id}: creation tableGET /api/Table/Restaurant/{id}: lecture tables d'un restaurantPUT /api/Table/{id}: modification tablePOST /api/Table/Restaurant/{id}/Bulk: remplacement des tablesDELETE /api/Table/{id}: suppression table
Routes menu :
POST /api/Menu: creation menuGET /api/Menu/restaurant/{restaurantId}: lecture menus d'un restaurantDELETE /api/Menu/{id}: suppression menu
Routes horaires :
POST /api/DailyActivity: creation horaireGET /api/DailyActivity/restaurant/{restaurantId}: lecture horairesPUT /api/DailyActivity/{id}: modification horaireDELETE /api/DailyActivity/{id}: suppression horaire
Routes jours de fermeture :
POST /api/ClosedDayException: creation fermetureGET /api/ClosedDayException/restaurant/{restaurantId}: lecture fermeturesPUT /api/ClosedDayException/{id}: modification fermetureDELETE /api/ClosedDayException/{id}: suppression fermeture
Routes avis :
POST /api/Review: creation avisGET /api/Review/Restaurant/{id}: lecture avis restaurantGET /api/Review/My: lecture de mes avisPUT /api/Review/{id}: modification avisDELETE /api/Review/{id}: suppression avis
Routes reservations :
POST /api/Reservation: creation reservationGET /api/Reservation: lecture reservationsGET /api/Reservation/My: lecture de mes reservationsPUT /api/Reservation/{id}/Status: changement de statutDELETE /api/Reservation/{id}: suppression reservation
Routes device tokens :
POST /api/DeviceToken: enregistrement token appareilDELETE /api/DeviceToken: suppression token appareil
Pendant le test de POST /api/DailyActivity, l'API retournait une erreur 500.
Cause :
- PostgreSQL renvoie les colonnes SQL
TIMEviaNpgsqlsous forme deTimeOnly. - Les modeles de l'API utilisent
TimeSpanpourStartTimeetEndTime. - Dapper ne convertissait pas automatiquement
TimeOnlyversTimeSpan.
Correction ajoutee :
- Ajout de
TableMasterApi/DAL/Handlers/PostgresTimeSpanHandler.cs - Enregistrement du handler Dapper dans
Program.cs
Ce handler convertit :
TimeOnlyversTimeSpanen lectureTimeSpanvers parametre SQL en ecriture
Apres correction, les routes DailyActivity passent.
Les donnees creees par les scenarios de test ont ete ciblees avec des prefixes dedies :
- emails
codex.route.*@example.com - emails
codex.password.*@example.com - restaurants
Codex Test Restaurant ... - device tokens
test-device-*
Les donnees de test codex.route.* ont ete nettoyees apres la passe complete.
Le compte temporaire utilise pour tester le changement de mot de passe a ete supprime via DELETE /api/User.
docker compose config --quiet
dotnet build TableMasterApi.sln --no-restore
dotnet test --no-buildResultat final :
- Build OK
- Tests xUnit OK : 31/31
- Scenario HTTP complet OK
- Aucune trace restante de
SqlConnection,SqlException,DbUp.SqlServer,SqlDatabase,OUTPUT INSERTED,GETDATE()ou syntaxe SQL Server critique dansTableMasterApi/
- Les warnings de nullabilite existants ne bloquent pas la migration PostgreSQL.
- Le package
Microsoft.AspNetCore.SignalRremonte un warning NuGet indiquant qu'il est probablement inutile, mais ce point n'a pas ete modifie car il est hors scope de la migration. - Les tests ont valide le comportement avec une base PostgreSQL locale Docker. Ils ne constituent pas encore une suite automatisee versionnee dans
TableMasterApi.Tests.