package database import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap/zaptest" ) // TestRunMigrations_RollbackOnError vérifie que les migrations sont rollback en cas d'erreur // MOD-P1-002: Test pour valider le rollback automatique func TestRunMigrations_RollbackOnError(t *testing.T) { // Note: Test complet nécessiterait une vraie DB PostgreSQL avec migrations invalides // Pour l'instant, on documente le comportement attendu t.Log("Test de rollback: Si une migration échoue, elle doit être rollback automatiquement") t.Log("Comportement attendu: Migration invalide -> erreur retournée, DB inchangée") t.Log("Comportement implémenté: defer func() garantit rollback même en cas de panic") } // TestRunMigrations_ExtensionsHandling vérifie que les migrations avec extensions sont gérées correctement // MOD-P1-002: Test pour valider la gestion des extensions (hors transaction) func TestRunMigrations_ExtensionsHandling(t *testing.T) { // Ce test vérifie que les migrations contenant CREATE EXTENSION sont exécutées // hors transaction (car PostgreSQL ne permet pas CREATE EXTENSION dans transaction) // Note: Test complet nécessiterait une vraie DB PostgreSQL // Pour un test complet, il faudrait une vraie DB PostgreSQL // Pour l'instant, on documente le comportement attendu t.Log("Test extensions: Migrations avec CREATE EXTENSION doivent être exécutées hors transaction") t.Log("Comportement attendu: Extension créée, puis enregistrement dans schema_migrations dans transaction séparée") } // TestRunMigrations_TransactionRollback vérifie le rollback avec defer // MOD-P1-002: Test unitaire pour valider le mécanisme de rollback func TestRunMigrations_TransactionRollback(t *testing.T) { // Créer une DB de test db, err := NewDatabase(&Config{ URL: "sqlite://:memory:", Database: "test", }) if err != nil { t.Skipf("SQLite not available: %v", err) } defer db.Close() db.Logger = zaptest.NewLogger(t) // Initialiser la table schema_migrations createMigrationsTable := ` CREATE TABLE IF NOT EXISTS schema_migrations ( id INTEGER PRIMARY KEY AUTOINCREMENT, version VARCHAR(50) NOT NULL UNIQUE, applied_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ` _, err = db.Exec(createMigrationsTable) require.NoError(t, err) // Tester qu'une transaction est rollback en cas d'erreur tx, err := db.Begin() require.NoError(t, err) // Exécuter une commande qui va échouer _, err = tx.Exec("INVALID SQL STATEMENT") assert.Error(t, err, "Invalid SQL should fail") // Rollback doit réussir err = tx.Rollback() assert.NoError(t, err, "Rollback should succeed") // Vérifier que rien n'a été créé (pas de table test) var count int err = db.QueryRow("SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='test_rollback'").Scan(&count) assert.NoError(t, err) assert.Equal(t, 0, count, "Table should not exist after rollback") }