veza/veza-backend-api/internal/database/migrations_test.go
2025-12-12 21:34:34 -05:00

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")
}