veza/veza-backend-api/internal/testutils
senke f84dbf5c66 test(backend): gate testcontainers tests behind VEZA_SKIP_INTEGRATION
The Forgejo runner doesn't expose /var/run/docker.sock, so anything
relying on testcontainers-go panicked with "Cannot connect to the
Docker daemon". This caused internal/testutils, tests/transactions
and tests/integration to fail wholesale, plus internal/handlers
to hit the 5min hard timeout while waiting for container startup.

Approach (least invasive):
- testutils.GetTestContainerDB short-circuits when VEZA_SKIP_INTEGRATION=1
  is set, returning a sentinel error immediately instead of attempting
  three retries against a missing Docker socket.
- Add testutils.SkipIfNoIntegration helper for granular per-test skips.
- Add TestMain to internal/testutils, tests/transactions and
  tests/integration packages that os.Exit(0) when the env var is set,
  so the entire integration-only package is silently skipped in CI.
- Wire the helper into the three setupTestDB* functions in
  tests/transactions/ for local runs (where TestMain doesn't fire when
  using -run on individual tests).

Local nightly runs / dev workstations leave VEZA_SKIP_INTEGRATION unset
and exercise the full suite against testcontainers as before.
2026-04-14 11:45:19 +02:00
..
integration STABILISATION: phase 3–5 – API contract, tests & chat-server hardening 2025-12-06 17:21:59 +01:00
servicemocks stabilizing veza-backend-api: phase 1 2025-12-16 11:23:49 -05:00
benchmark.go adding initial backend API (Go) 2025-12-03 20:29:37 +01:00
db.go v0.9.4 2026-03-05 23:03:43 +01:00
db_cleanup_test.go chore(v0.102): consolidate remaining changes — docs, frontend, backend 2026-02-20 13:02:12 +01:00
db_test.go chore(v0.102): consolidate remaining changes — docs, frontend, backend 2026-02-20 13:02:12 +01:00
db_utils.go adding initial backend API (Go) 2025-12-03 20:29:37 +01:00
fixtures.go stabilizing veza-backend-api: phase 1 2025-12-16 11:23:49 -05:00
fixtures_factory_test.go.disabled adding initial backend API (Go) 2025-12-03 20:29:37 +01:00
fixtures_test.go chore(v0.102): consolidate remaining changes — docs, frontend, backend 2026-02-20 13:02:12 +01:00
golden.go stabilizing veza-backend-api: phase 1 2025-12-16 11:23:49 -05:00
golden_test.go stabilizing veza-backend-api: phase 1 2025-12-16 11:23:49 -05:00
main_test.go test(backend): gate testcontainers tests behind VEZA_SKIP_INTEGRATION 2026-04-14 11:45:19 +02:00
parallel.go stabilizing veza-backend-api: phase 1 2025-12-16 11:23:49 -05:00
parallel_test.go stabilizing veza-backend-api: phase 1 2025-12-16 11:23:49 -05:00
performance.go adding initial backend API (Go) 2025-12-03 20:29:37 +01:00
performance_test.go stabilizing veza-backend-api: phase 1 2025-12-16 11:23:49 -05:00
README.md adding initial backend API (Go) 2025-12-03 20:29:37 +01:00
setup.go test(backend): gate testcontainers tests behind VEZA_SKIP_INTEGRATION 2026-04-14 11:45:19 +02:00
setup_redis.go stabilizing veza-backend-api: phase 1 2025-12-16 11:23:49 -05:00
setup_test_helper.go chore(v0.102): consolidate remaining changes — docs, frontend, backend 2026-02-20 13:02:12 +01:00
skip.go test(backend): gate testcontainers tests behind VEZA_SKIP_INTEGRATION 2026-04-14 11:45:19 +02:00
table_test.go adding initial backend API (Go) 2025-12-03 20:29:37 +01:00
table_test_test.go adding initial backend API (Go) 2025-12-03 20:29:37 +01:00

Test Utilities Package

Ce package fournit des utilitaires pour faciliter l'écriture de tests dans le projet Veza.

Fonctions disponibles

Gestion de la base de données de test

SetupTestDB() *gorm.DB

Crée une base de données de test en mémoire avec toutes les tables nécessaires. Utilise SQLite en mémoire pour des tests rapides sans dépendance externe.

Exemple d'utilisation:

func TestMyFeature(t *testing.T) {
    db := testutils.SetupTestDB()
    defer testutils.CleanupTestDB(db)
    
    // Votre code de test ici
}

CleanupTestDB(db *gorm.DB) error

Ferme proprement la base de données de test.

ResetTestDB(db *gorm.DB) error

Supprime toutes les données de la base de données de test. Utile pour réinitialiser l'état entre les tests.

GetDBStats(db *gorm.DB) (*sql.DBStats, error)

Retourne les statistiques de la base de données de test.

Fixtures de données

Utilisateurs

  • CreateTestUser(db *gorm.DB) (*models.User, error): Crée un utilisateur de test avec des valeurs par défaut.
  • CreateTestUserWithCustomData(db *gorm.DB, username, email string) (*models.User, error): Crée un utilisateur de test avec des données personnalisées.
  • CreateTestAdmin(db *gorm.DB) (*models.User, error): Crée un utilisateur administrateur de test.
  • CreateMultipleTestUsers(db *gorm.DB, count int) ([]*models.User, error): Crée plusieurs utilisateurs de test.

Tracks

  • CreateTestTrack(db *gorm.DB, creatorID int64) (*models.Track, error): Crée un track de test.
  • CreateTestTrackWithCustomData(db *gorm.DB, creatorID int64, title, artist string) (*models.Track, error): Crée un track de test avec des données personnalisées.
  • CreateMultipleTestTracks(db *gorm.DB, creatorID int64, count int) ([]*models.Track, error): Crée plusieurs tracks de test.

Autres

  • CreateTestPlaylist(db *gorm.DB, userID int64) (*models.Playlist, error): Crée une playlist de test.
  • CreateTestRoom(db *gorm.DB, createdBy int64) (*models.Room, error): Crée une room de test.
  • CreateTestMessage(db *gorm.DB, roomID, userID int64, content string) (*models.Message, error): Crée un message de test.

Exemple complet

package mypackage_test

import (
    "testing"
    "veza-backend-api/internal/testutils"
    "github.com/stretchr/testify/assert"
)

func TestMyFeature(t *testing.T) {
    // Setup
    db := testutils.SetupTestDB()
    defer testutils.CleanupTestDB(db)
    
    // Créer des données de test
    user, err := testutils.CreateTestUser(db)
    assert.NoError(t, err)
    
    track, err := testutils.CreateTestTrack(db, user.ID)
    assert.NoError(t, err)
    
    // Votre test ici
    assert.Equal(t, user.ID, track.CreatorID)
    
    // Cleanup (optionnel si on utilise defer)
    // testutils.ResetTestDB(db)
}

Notes importantes

  • La base de données de test utilise SQLite en mémoire, donc les données sont perdues après la fermeture.
  • Les contraintes de clés étrangères sont respectées.
  • Le modèle Session n'est pas inclus dans les migrations automatiques car il utilise uuid.UUID avec gen_random_uuid() qui n'est pas supporté par SQLite.