# 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:**
```go
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

```go
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.

