77 lines
2.9 KiB
Go
77 lines
2.9 KiB
Go
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")
|
|
}
|