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. |
||
|---|---|---|
| .. | ||
| integration | ||
| servicemocks | ||
| benchmark.go | ||
| db.go | ||
| db_cleanup_test.go | ||
| db_test.go | ||
| db_utils.go | ||
| fixtures.go | ||
| fixtures_factory_test.go.disabled | ||
| fixtures_test.go | ||
| golden.go | ||
| golden_test.go | ||
| main_test.go | ||
| parallel.go | ||
| parallel_test.go | ||
| performance.go | ||
| performance_test.go | ||
| README.md | ||
| setup.go | ||
| setup_redis.go | ||
| setup_test_helper.go | ||
| skip.go | ||
| table_test.go | ||
| table_test_test.go | ||
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
Sessionn'est pas inclus dans les migrations automatiques car il utiliseuuid.UUIDavecgen_random_uuid()qui n'est pas supporté par SQLite.