# 📖 Guide Complet du SystĂšme de Fixtures Veza ## Table des MatiĂšres 1. [Introduction](#-introduction) 2. [Installation et Configuration](#-installation-et-configuration) 3. [Concepts Fondamentaux](#-concepts-fondamentaux) 4. [GĂ©nĂ©ration de DonnĂ©es](#-gĂ©nĂ©ration-de-donnĂ©es) 5. [IntĂ©gration avec les Services](#-intĂ©gration-avec-les-services) 6. [ScĂ©narios de Test](#-scĂ©narios-de-test) 7. [CLI et Outils](#-cli-et-outils) 8. [Cas d'Usage AvancĂ©s](#-cas-dusage-avancĂ©s) 9. [DĂ©pannage](#-dĂ©pannage) 10. [Meilleures Pratiques](#-meilleures-pratiques) ## 🎯 Introduction Le systĂšme de fixtures Veza est conçu pour fournir des donnĂ©es de test cohĂ©rentes, rĂ©alistes et reproductibles pour l'ensemble de la plateforme Veza. Il s'adresse aux dĂ©veloppeurs, testeurs, et Ă©quipes DevOps qui ont besoin de donnĂ©es fiables pour leurs environnements de dĂ©veloppement, test, et dĂ©monstration. ### Objectifs Principaux - **CohĂ©rence** : DonnĂ©es liĂ©es et cohĂ©rentes entre tous les services - **RĂ©alisme** : DonnĂ©es qui reflĂštent des cas d'usage rĂ©els - **ReproductibilitĂ©** : MĂȘme seed = mĂȘmes donnĂ©es - **ScalabilitĂ©** : De 10 Ă  10,000+ entitĂ©s - **SimplicitĂ©** : Interface intuitive et documentation claire ### Public Cible - **DĂ©veloppeurs Frontend/Backend** : DonnĂ©es pour dĂ©veloppement local - **Testeurs QA** : ScĂ©narios de test automatisĂ©s - **DevOps** : IntĂ©gration CI/CD et environnements - **Product Managers** : DĂ©mos avec donnĂ©es rĂ©alistes ## 🔧 Installation et Configuration ### PrĂ©requis SystĂšme ```bash # Versions minimales requises node --version # >= 18.0.0 npm --version # >= 8.0.0 psql --version # >= 13.0 (pour chat-server) redis-cli --version # >= 6.0 (pour streaming) ``` ### Installation Automatique ```bash # Cloner le projet git clone https://github.com/your-org/veza-platform.git cd veza-platform/fixtures # Installation complĂšte ./tools/scripts/install.sh # VĂ©rification npm run status ``` ### Installation Manuelle ```bash # Installation des dĂ©pendances npm install # Build du systĂšme npm run build # Configuration environnement cp ../env.example .env nano .env ``` ### Configuration DĂ©taillĂ©e #### Variables d'Environnement ```bash # .env - Configuration principale # Base de donnĂ©es DB_HOST=localhost DB_PORT=5432 DB_USERNAME=veza DB_PASSWORD=veza_password DB_MAIN=veza_dev DB_CHAT=veza_chat DB_TEST=veza_test # Redis REDIS_HOST=localhost REDIS_PORT=6379 REDIS_PASSWORD= # Fixtures FIXTURES_SEED=veza-platform-2025 FIXTURES_LOCALE=fr ``` #### Configuration AvancĂ©e ```typescript // fixtures/environments/custom.ts export const customConfig: Partial = { generation: { users: { count: 150, adminCount: 5, artistCount: 30, producerCount: 15, }, audio: { trackCount: 750, albumCount: 75, playlistCount: 150, } }, services: { web: { port: 3001 }, chat: { port: 8081, wsPort: 8082 } } } ``` ### VĂ©rification de l'Installation ```bash # Test complet du systĂšme npm run validate # Diagnostic dĂ©taillĂ© ./tools/scripts/install.sh doctor # GĂ©nĂ©ration de test npm run generate -- --env development --dry-run ``` ## 🧠 Concepts Fondamentaux ### Architecture en Couches ``` ┌─────────────────────────────────────┐ │ Interface Layer │ │ CLI Tools | Programmatic API │ ├────────────────────────────────────── │ Scenario Layer │ │ User Journey | Performance | E2E │ ├────────────────────────────────────── │ Service Integration │ │ Web | Chat | Stream | Backend │ ├────────────────────────────────────── │ Core Layer │ │ Generators | Relations | Validation │ ├────────────────────────────────────── │ Configuration Layer │ │ Environments | Seeds | Settings │ └─────────────────────────────────────┘ ``` ### EntitĂ©s Principales #### Utilisateurs ```typescript interface User { id: string // UUID unique username: string // Nom d'utilisateur unique email: string // Email unique role: UserRole // admin | artist | producer | user status: UserStatus // active | inactive | suspended stats: UserStats // Statistiques d'activitĂ© preferences: UserPreferences // PrĂ©fĂ©rences utilisateur } ``` #### Contenu Audio ```typescript interface Audio { id: string // UUID unique title: string // Titre du morceau artist: string // Nom de l'artiste genre: AudioGenre // Genre musical metadata: AudioMetadata // MĂ©tadonnĂ©es techniques stats: AudioStats // Statistiques d'Ă©coute uploadedById: string // ID de l'utilisateur } ``` #### Conversations ```typescript interface Conversation { id: string // UUID unique type: ConversationType // direct | group | channel participantIds: string[] // IDs des participants lastMessageId?: string // ID du dernier message lastActivityAt: Date // DerniĂšre activitĂ© } ``` ### SystĂšme de Relations Le `DataRelationManager` maintient automatiquement la cohĂ©rence entre les entitĂ©s : ```typescript // Exemple de relations automatiques const user = UserGenerator.generate() const track = AudioGenerator.generate({ uploadedById: user.id }) const playlist = AudioGenerator.generatePlaylist({ createdById: user.id, trackIds: [track.id] }) // Le systĂšme maintient automatiquement : // - user.stats.tracksUploaded++ // - user.stats.playlistsCreated++ // - Relations bidirectionnelles ``` ## 📊 GĂ©nĂ©ration de DonnĂ©es ### GĂ©nĂ©rateurs Disponibles #### UserGenerator ```typescript import { UserGenerator } from '@veza/fixtures' // Utilisateur basique const user = UserGenerator.generate() // Utilisateur avec options const artist = UserGenerator.generate({ role: 'artist', isVerified: true, withAvatar: true, withBio: true }) // Utilisateurs spĂ©cialisĂ©s const admin = UserGenerator.generateAdmin() const producer = UserGenerator.generateProducer() const testUser = UserGenerator.generateTestUser('john_doe') // GĂ©nĂ©ration en lot const users = UserGenerator.generateBatch(50) // Distribution rĂ©aliste const distributedUsers = UserGenerator.generateWithDistribution() ``` **Options AvancĂ©es :** ```typescript const customUser = UserGenerator.generate({ role: 'artist', status: 'active', isVerified: true, emailVerified: true, withAvatar: true, withBio: true, withStats: true, createdAt: new Date('2024-01-01'), lastSeenAt: new Date() }) ``` #### AudioGenerator ```typescript import { AudioGenerator } from '@veza/fixtures' // Track simple const track = AudioGenerator.generate() // Track avec genre spĂ©cifique const electroTrack = AudioGenerator.generate({ genre: 'electronic', isPopular: true, uploadedById: artist.id }) // Album complet const album = AudioGenerator.generateAlbum(12, { genre: 'rock', uploadedById: artist.id }) // Playlist thĂ©matique const workoutPlaylist = AudioGenerator.generatePlaylist({ theme: 'workout', trackCount: 25, createdById: user.id, visibility: 'public' }) // Collection par genre const jazzCollection = AudioGenerator.generateGenreCollection('jazz', 100) ``` **Contenu Utilisateur :** ```typescript // Contenu basĂ© sur le rĂŽle const artistContent = AudioGenerator.generateUserContent(artist.id, 'artist') // Retourne : { tracks: Audio[], albums: Album[], playlists: Playlist[] } const userContent = AudioGenerator.generateUserContent(user.id, 'user') // Retourne : { tracks: [], albums: [], playlists: Playlist[] } ``` #### ConversationGenerator ```typescript import { ConversationGenerator } from '@veza/fixtures' // Conversation directe const directChat = ConversationGenerator.generateConversation({ type: 'direct', participantIds: [user1.id, user2.id], messageCount: 25 }) // Groupe de discussion const groupChat = ConversationGenerator.generateConversation({ type: 'group', participantIds: [user1.id, user2.id, user3.id, user4.id], messageCount: 100, timeSpan: 'month' }) // Canal public const channel = ConversationGenerator.generateConversation({ type: 'channel', participantIds: userIds, // Beaucoup d'utilisateurs isPrivate: false, messageCount: 500 }) // Messages avec relations const messages = ConversationGenerator.generateMessages( conversation.id, conversation.participantIds, 50, { timeSpan: 'week' } ) ``` **ScĂ©narios PrĂ©-dĂ©finis :** ```typescript // ScĂ©nario de collaboration studio const studioScenario = ConversationGenerator.generateScenario( ConversationGenerator.SCENARIOS[0], // 'Studio Collaboration' [producer.id, artist1.id, artist2.id, engineer.id] ) // Autres scĂ©narios disponibles : // - Music Discovery // - Event Planning // - Producer Feedback ``` ### Dataset Complet avec Relations ```typescript import { DataRelationManager } from '@veza/fixtures' // GĂ©nĂ©ration complĂšte avec relations cohĂ©rentes const dataset = DataRelationManager.generateCompleteDataset() console.log(dataset) // { // users: User[], // tracks: Audio[], // playlists: Playlist[], // conversations: Conversation[], // messages: Message[] // } // Validation des relations const validation = DataRelationManager.validateRelations() if (!validation.isValid) { console.error('Erreurs de relation:', validation.errors) } // Statistiques const stats = DataRelationManager.getStatistics() console.log('Statistiques:', stats) ``` ### Personnalisation des GĂ©nĂ©rateurs #### Configuration Faker ```typescript import { vezaFaker } from '@veza/fixtures' // Personnaliser les noms d'artistes vezaFaker.music.artistName = () => { const prefixes = ['DJ', 'MC', 'Lil', 'Big'] const names = ['Beats', 'Flow', 'Sound', 'Vibe'] return `${vezaFaker.helpers.arrayElement(prefixes)} ${vezaFaker.helpers.arrayElement(names)}` } // Personnaliser les titres de morceaux vezaFaker.music.songTitle = () => { const adjectives = ['Electric', 'Cosmic', 'Urban', 'Mystic'] const nouns = ['Dreams', 'Nights', 'Vibes', 'Echoes'] return `${vezaFaker.helpers.arrayElement(adjectives)} ${vezaFaker.helpers.arrayElement(nouns)}` } ``` #### Hooks de GĂ©nĂ©ration ```typescript // Hook aprĂšs gĂ©nĂ©ration d'utilisateur DataRelationManager.onUserGenerated((user) => { console.log(`✅ Utilisateur créé: ${user.username} (${user.role})`) // Logique personnalisĂ©e if (user.role === 'artist') { // CrĂ©er automatiquement du contenu pour les artistes const content = AudioGenerator.generateUserContent(user.id, 'artist') console.log(`đŸŽ” ${content.tracks.length} tracks créées pour ${user.username}`) } }) ``` ## 🔗 IntĂ©gration avec les Services ### Web Service (Frontend) #### Configuration MSW ```typescript import { WebFixtures } from '@veza/fixtures' // Initialisation avec utilisateur spĂ©cifique await WebFixtures.initialize(userId) // RĂ©cupĂ©ration des handlers MSW const handlers = WebFixtures.getMSWHandlers() // IntĂ©gration avec MSW import { setupServer } from 'msw/node' const server = setupServer(...handlers) ``` #### État d'Authentification ```typescript // L'Ă©tat d'auth est automatiquement configurĂ© dans localStorage const currentUser = WebFixtures.getCurrentUser() const authToken = WebFixtures.getAuthToken() // DonnĂ©es disponibles dans localStorage : // - 'auth-storage' : État Zustand // - 'access_token' : Token JWT // - 'user-preferences' : PrĂ©fĂ©rences utilisateur // - 'recent-activity' : ActivitĂ© rĂ©cente ``` #### Endpoints MockĂ©s ```typescript // Endpoints automatiquement disponibles : POST /api/auth/login POST /api/auth/register POST /api/auth/refresh GET /api/users/me PUT /api/users/me GET /api/dashboard GET /api/tracks GET /api/playlists GET /api/conversations GET /api/search ``` ### Chat Server (Backend) #### Configuration Base de DonnĂ©es ```typescript import { ChatServerFixtures } from '@veza/fixtures' // Initialisation des connexions await ChatServerFixtures.initialize() // Seeding de la base de donnĂ©es PostgreSQL await ChatServerFixtures.seedDatabase() // Seeding du cache Redis await ChatServerFixtures.seedRedis() // VĂ©rification de santĂ© const health = await ChatServerFixtures.healthCheck() console.log(health) // { database: true, redis: true, dataConsistency: true } ``` #### DonnĂ©es GĂ©nĂ©rĂ©es ```typescript // Base de donnĂ©es PostgreSQL : // - Table users (avec profils complets) // - Table conversations (avec mĂ©tadonnĂ©es) // - Table conversation_members (relations) // - Table messages (avec contenu rĂ©aliste) // Cache Redis : // - Sessions utilisateur actives // - MĂ©tadonnĂ©es de conversations // - Indicateurs de frappe // - Statuts de livraison des messages ``` #### ÉvĂ©nements WebSocket ```typescript // GĂ©nĂ©ration d'Ă©vĂ©nements temps rĂ©el const events = ChatServerFixtures.generateWebSocketEvents() events.forEach(event => { console.log(`${event.type}: ${event.data}`) }) // Types d'Ă©vĂ©nements : // - user_connected / user_disconnected // - message_sent / message_received // - typing_start / typing_stop // - conversation_joined / conversation_left ``` ### Stream Server (Backend) #### Sessions de Streaming ```typescript import { StreamServerFixtures } from '@veza/fixtures' // Initialisation await StreamServerFixtures.initialize() // Seeding des donnĂ©es de streaming await StreamServerFixtures.seedStreamingData() // GĂ©nĂ©ration de session const session = StreamServerFixtures.generateStreamingSession( user.id, track.id ) console.log(session) // { // id: 'stream_session_id', // userId: 'user_id', // trackId: 'track_id', // quality: 'high', // bitrate: 320, // startTime: Date, // device: { type: 'desktop', os: 'macOS' }, // network: { type: 'wifi', speed: 50 }, // status: 'active' // } ``` #### Analytics et MĂ©triques ```typescript // Analytics de streaming const analytics = StreamServerFixtures.generateStreamingAnalytics() console.log(analytics) // { // overview: { totalSessions, activeSessions, totalDuration }, // byQuality: [{ quality: 'high', count: 150 }], // byPlatform: [{ platform: 'web', count: 300 }], // realtime: { currentListeners, peakListeners, bandwidth } // } ``` #### Queue de Traitement ```typescript // Jobs de traitement audio const jobs = StreamServerFixtures.generateAudioProcessingJobs(tracks) jobs.forEach(job => { console.log(`${job.type}: ${job.status} (${job.progress}%)`) }) // Types de jobs : // - transcode : Conversion de format // - analyze : Analyse audio // - thumbnail : GĂ©nĂ©ration de miniatures // - waveform : GĂ©nĂ©ration de waveform // - metadata : Extraction de mĂ©tadonnĂ©es ``` ## 🎬 ScĂ©narios de Test ### ScĂ©nario d'Onboarding ```typescript import { NewUserOnboardingScenario } from '@veza/fixtures' // Configuration du scĂ©nario const context = await NewUserOnboardingScenario.setup() console.log('Nouvel utilisateur:', context.user.username) console.log('Étapes d\'onboarding:', context.initialData.onboardingSteps.length) console.log('Tracks recommandĂ©es:', context.initialData.recommendedTracks.length) // Simulation de complĂ©tion const completion = NewUserOnboardingScenario.simulateOnboardingCompletion(context) console.log('Étapes complĂ©tĂ©es:', completion.completedSteps.length) console.log('PremiĂšre playlist:', completion.generatedContent.firstPlaylist.title) // Validation const validation = NewUserOnboardingScenario.validateScenario(context) console.log('Validation:', validation.isValid ? '✅ PASS' : '❌ FAIL') ``` #### Étapes d'Onboarding GĂ©nĂ©rĂ©es 1. **Bienvenue** - Message d'accueil personnalisĂ© 2. **VĂ©rification Email** - Code de vĂ©rification 3. **Profil** - ComplĂ©tion du profil utilisateur 4. **PrĂ©fĂ©rences Musicales** - SĂ©lection des genres 5. **PremiĂšre Playlist** - CrĂ©ation d'une playlist 6. **CommunautĂ©** - Rejoindre les discussions ### ScĂ©nario de Charge Haute ```typescript import { HighLoadScenario } from '@veza/fixtures' // Configuration du test de charge const context = await HighLoadScenario.setup({ name: 'Heavy Load Test', peakUsers: 1000, duration: 600, // 10 minutes expectedThroughput: 500 // req/s }) console.log(`Test de charge: ${context.loadProfile.peakUsers} utilisateurs`) console.log(`Sessions streaming: ${context.streamingSessions.length}`) console.log(`Flood de messages: ${context.messageFlood.length}`) // Simulation d'exĂ©cution const simulation = HighLoadScenario.simulateLoadTest(context) console.log('Plan d\'exĂ©cution:', simulation.executionPlan.length, 'phases') console.log('RĂ©sultats attendus:', simulation.expectedResults.throughput) ``` #### MĂ©triques de Performance ```typescript // MĂ©triques systĂšme attendues const metrics = context.systemMetrics console.log('Charge CPU attendue:', metrics.expectedLoad.cpuUsage, '%') console.log('Utilisation mĂ©moire:', metrics.expectedLoad.memoryUsage, '%') console.log('Connexions DB:', metrics.expectedLoad.databaseConnections) console.log('Streams concurrent:', metrics.performanceTargets.concurrentStreams) ``` ### ScĂ©nario d'IntĂ©gration Cross-Service ```typescript import { CrossServiceCommunicationScenario } from '@veza/fixtures' // Configuration du test d'intĂ©gration const context = await CrossServiceCommunicationScenario.setup() console.log('Services testĂ©s:', context.testFlow.services) console.log('Participants:', context.participants.length) console.log('Interactions:', context.expectedInteractions.length) // Simulation d'exĂ©cution const simulation = await CrossServiceCommunicationScenario.simulateIntegrationTest(context) console.log('RĂ©sultats d\'exĂ©cution:', simulation.executionResults.length) console.log('MĂ©triques de performance:', simulation.performanceMetrics.length) console.log('Rapport de cohĂ©rence:', simulation.dataConsistencyReport) ``` #### Parcours Utilisateur GĂ©nĂ©rĂ© ```typescript // GĂ©nĂ©ration d'un parcours utilisateur rĂ©aliste const { journey, expectedDataFlow, validationPoints } = CrossServiceCommunicationScenario.generateUserJourney() journey.forEach((step, index) => { console.log(`${index + 1}. ${step.description}`) console.log(` Services: ${step.expectedServices.join(', ')}`) console.log(` DurĂ©e: ${step.duration}ms`) }) // Exemple de parcours : // 1. User logs in via web interface // Services: web, backend-api // DurĂ©e: 2000ms // 2. Load user dashboard with personalized content // Services: web, backend-api, stream-server // DurĂ©e: 1500ms // 3. Start streaming an audio track // Services: web, stream-server // DurĂ©e: 500ms ``` ## đŸ› ïž CLI et Outils ### Commandes Principales #### Generate - GĂ©nĂ©ration de DonnĂ©es ```bash # GĂ©nĂ©ration basique veza-fixtures generate # Environnement spĂ©cifique veza-fixtures generate --env staging # Taille personnalisĂ©e veza-fixtures generate --users 500 --tracks 2000 --conversations 100 # Avec seed spĂ©cifique veza-fixtures generate --seed "my-custom-seed-2025" # Format d'export veza-fixtures generate --format sql --output ./exports/staging # Mode dry-run (simulation) veza-fixtures generate --dry-run ``` #### Seed - Population des Services ```bash # Tous les services veza-fixtures seed --service all # Service spĂ©cifique veza-fixtures seed --service web # Avec nettoyage prĂ©alable veza-fixtures seed --clean --service chat-server # Avec validation veza-fixtures seed --service all --validate # Environnement spĂ©cifique veza-fixtures seed --env staging --service stream-server ``` #### Validate - Validation des DonnĂ©es ```bash # Validation complĂšte veza-fixtures validate # Relations seulement veza-fixtures validate --check-relations # Performance seulement veza-fixtures validate --check-performance # Service spĂ©cifique veza-fixtures validate --service chat-server # Avec rapport veza-fixtures validate --report validation-report.json ``` #### Clean - Nettoyage ```bash # Nettoyage interactif veza-fixtures clean # Service spĂ©cifique veza-fixtures clean --service web # Force (sans confirmation) veza-fixtures clean --service all --force # Environnement spĂ©cifique veza-fixtures clean --env testing --force ``` #### Scenario - Gestion des ScĂ©narios ```bash # Lister les scĂ©narios veza-fixtures scenario --list # Lancer un scĂ©nario veza-fixtures scenario --run onboarding # CrĂ©er un nouveau scĂ©nario veza-fixtures scenario --create my-scenario --interactive # ScĂ©narios disponibles : # - onboarding : Parcours nouvel utilisateur # - high-load : Test de charge haute # - integration : Test d'intĂ©gration cross-service ``` #### Status - État du SystĂšme ```bash # État basique veza-fixtures status # Informations dĂ©taillĂ©es veza-fixtures status --verbose # Environnement spĂ©cifique veza-fixtures status --env staging ``` ### Options Globales ```bash # Toutes les commandes supportent : --env # Environnement (development, testing, staging, demo) --verbose # Mode verbeux --help # Aide de la commande ``` ### Scripts NPM ```bash # Scripts disponibles dans package.json npm run generate # GĂ©nĂ©ration avec options par dĂ©faut npm run seed # Seeding de tous les services npm run validate # Validation complĂšte npm run clean # Nettoyage interactif npm run status # État du systĂšme # Scripts avec fixtures npm run dev:with-fixtures # DĂ©veloppement avec donnĂ©es npm run test:with-fixtures # Tests avec donnĂ©es fraĂźches npm run e2e:with-fixtures # Tests E2E avec donnĂ©es ``` ### Configuration CLI ```bash # Configuration globale via variables d'environnement export FIXTURES_ENV=staging export FIXTURES_SEED=my-seed-2025 export FIXTURES_LOCALE=en # Ou via fichier .env echo "FIXTURES_ENV=staging" >> .env ``` ## 🚀 Cas d'Usage AvancĂ©s ### DĂ©veloppement Local #### Setup Rapide ```bash # Terminal 1 : Services infrastructure docker-compose up postgres redis # Terminal 2 : Fixtures cd fixtures npm run generate -- --env development npm run seed -- --service all # Terminal 3 : Application cd ../apps/web npm run dev ``` #### Workflow de DĂ©veloppement ```typescript // scripts/dev-setup.js import { quickStart } from '@veza/fixtures' async function setupDevEnvironment() { console.log('🚀 Configuration environnement de dĂ©veloppement...') const result = await quickStart({ environment: 'development', services: ['web', 'chat'], scenario: 'onboarding' }) console.log('✅ Environnement prĂȘt!') console.log(`📊 ${result.stats.users} utilisateurs gĂ©nĂ©rĂ©s`) console.log(`đŸŽ” ${result.stats.tracks} tracks disponibles`) return result } setupDevEnvironment() ``` ### Tests AutomatisĂ©s #### Tests d'IntĂ©gration ```typescript // tests/integration/user-flow.test.ts import { WebFixtures, ChatServerFixtures } from '@veza/fixtures' import { NewUserOnboardingScenario } from '@veza/fixtures' describe('User Flow Integration', () => { beforeAll(async () => { // Setup fixtures await WebFixtures.initialize() await ChatServerFixtures.initialize() }) it('should complete user onboarding flow', async () => { const scenario = await NewUserOnboardingScenario.setup() // Test login const response = await fetch('/api/auth/login', { method: 'POST', body: JSON.stringify(scenario.testData.loginCredentials) }) expect(response.ok).toBe(true) // Test dashboard load const dashboard = await fetch('/api/dashboard') const data = await dashboard.json() expect(data.user.username).toBe(scenario.user.username) expect(data.recommendations).toHaveLength(20) }) }) ``` #### Tests de Performance ```typescript // tests/performance/load.test.ts import { HighLoadScenario } from '@veza/fixtures' describe('Performance Tests', () => { it('should handle high concurrent load', async () => { const scenario = await HighLoadScenario.setup({ peakUsers: 500, duration: 300 }) const startTime = Date.now() // Simulate concurrent requests const promises = scenario.concurrentUsers.map(user => simulateUserSession(user) ) const results = await Promise.all(promises) const duration = Date.now() - startTime expect(duration).toBeLessThan(scenario.loadProfile.duration * 1000) expect(results.filter(r => r.success).length).toBeGreaterThan(450) // 90% success rate }) }) ``` ### DĂ©mos et PrĂ©sentations #### Dataset de DĂ©mo ```bash # GĂ©nĂ©ration de donnĂ©es de dĂ©mo professionnelles veza-fixtures generate \ --env demo \ --users 30 \ --tracks 100 \ --conversations 10 \ --seed "demo-2025-client-presentation" # Seeding pour dĂ©mo veza-fixtures seed --service all --env demo ``` #### ScĂ©narios de DĂ©mo ```typescript // scripts/demo-setup.js import { UserGenerator, AudioGenerator, ConversationGenerator, DataRelationManager } from '@veza/fixtures' async function createDemoScenario() { // CrĂ©er des personnages de dĂ©mo const ceo = UserGenerator.generate({ role: 'admin', firstName: 'Marie', lastName: 'Dubois', username: 'marie_ceo', isVerified: true }) const artist = UserGenerator.generate({ role: 'artist', firstName: 'Alex', lastName: 'Martin', username: 'alex_music', isVerified: true }) // CrĂ©er du contenu de dĂ©mo const album = AudioGenerator.generateAlbum(8, { uploadedById: artist.id, genre: 'electronic' }) // CrĂ©er une conversation de dĂ©mo const conversation = ConversationGenerator.generateConversation({ type: 'group', participantIds: [ceo.id, artist.id], messageCount: 15 }) console.log('✅ ScĂ©nario de dĂ©mo créé') console.log(`đŸ‘€ CEO: ${ceo.username}`) console.log(`đŸŽ” Artiste: ${artist.username}`) console.log(`💿 Album: ${album.title} (${album.tracks.length} tracks)`) } ``` ### Environnements Multi-Stages #### Configuration par Environnement ```typescript // fixtures/environments/index.ts export const environments = { development: { users: { count: 50 }, audio: { trackCount: 200 }, database: { host: 'localhost' } }, testing: { users: { count: 20 }, audio: { trackCount: 50 }, database: { host: 'test-db' } }, staging: { users: { count: 200 }, audio: { trackCount: 1000 }, database: { host: 'staging-db.example.com' } }, production: { // Pas de fixtures en production enabled: false } } ``` #### DĂ©ploiement AutomatisĂ© ```yaml # .github/workflows/deploy-staging.yml name: Deploy to Staging on: push: branches: [develop] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup fixtures working-directory: fixtures run: | npm ci npm run build - name: Seed staging data run: | npm run generate -- --env staging npm run seed -- --service all --env staging - name: Validate deployment run: | npm run validate -- --env staging ``` ### Monitoring et Alerting #### MĂ©triques de SantĂ© ```typescript // scripts/health-monitor.js import { WebFixtures, ChatServerFixtures, StreamServerFixtures } from '@veza/fixtures' async function monitorHealth() { const results = { web: { status: 'healthy', issues: [] }, chat: await ChatServerFixtures.healthCheck(), stream: await StreamServerFixtures.healthCheck() } // Alerting logic Object.entries(results).forEach(([service, health]) => { if (!health.database || !health.redis) { console.error(`🚹 Service ${service} unhealthy:`, health) // Send alert to monitoring system } }) return results } // Run every 5 minutes setInterval(monitorHealth, 5 * 60 * 1000) ``` ## 🔧 DĂ©pannage ### ProblĂšmes Courants #### Erreur de Connexion Base de DonnĂ©es ```bash # SymptĂŽme ❌ Chat server health check failed: connect ECONNREFUSED # Solution # 1. VĂ©rifier que PostgreSQL est dĂ©marrĂ© sudo systemctl status postgresql # 2. VĂ©rifier la configuration cat .env | grep DB_ # 3. Tester la connexion psql -h localhost -U veza -d veza_dev # 4. Diagnostic complet ./tools/scripts/install.sh doctor ``` #### DonnĂ©es IncohĂ©rentes ```bash # SymptĂŽme ⚠ Data validation warnings: User has tracks but no playlists # Solution # 1. Nettoyer les donnĂ©es veza-fixtures clean --force # 2. RĂ©gĂ©nĂ©rer avec validation veza-fixtures generate --env development veza-fixtures validate --check-relations # 3. Si le problĂšme persiste npm run test -- --testPathPattern="relations" ``` #### Performance Lente ```bash # SymptĂŽme ⏱ Generation took 45s for 100 users (expected: <10s) # Solutions # 1. RĂ©duire la taille du dataset veza-fixtures generate --users 50 --tracks 100 # 2. VĂ©rifier la mĂ©moire disponible free -h # 3. Profiler la gĂ©nĂ©ration NODE_OPTIONS="--max-old-space-size=4096" npm run generate # 4. Mode debug DEBUG=veza:performance npm run generate ``` #### Erreurs de Validation ```bash # SymptĂŽme ❌ Validation failed: Invalid email format # Solution # 1. VĂ©rifier la configuration Faker cat fixtures/core/utils/faker-config.ts # 2. RĂ©gĂ©nĂ©rer avec seed diffĂ©rent veza-fixtures generate --seed "new-seed-$(date +%s)" # 3. Forcer la validation stricte npm run validate -- --strict ``` ### Logs et Debug #### Activation des Logs ```bash # Logs dĂ©taillĂ©s DEBUG=veza:* npm run generate # Logs spĂ©cifiques DEBUG=veza:generators npm run generate DEBUG=veza:relations npm run validate DEBUG=veza:services npm run seed ``` #### Fichiers de Log ```bash # Logs CLI tail -f ~/.veza-fixtures/logs/cli.log # Logs de gĂ©nĂ©ration tail -f ~/.veza-fixtures/logs/generation.log # Logs de validation tail -f ~/.veza-fixtures/logs/validation.log ``` #### Mode Verbose ```bash # Toutes les commandes supportent --verbose veza-fixtures generate --verbose veza-fixtures seed --verbose --service chat-server veza-fixtures validate --verbose --check-relations ``` ### RĂ©cupĂ©ration d'Erreurs #### Nettoyage Complet ```bash # Nettoyage de tout le systĂšme ./tools/scripts/install.sh uninstall ./tools/scripts/install.sh install # Ou nettoyage sĂ©lectif veza-fixtures clean --service all --force rm -rf fixtures/exports/* rm -rf fixtures/node_modules npm install && npm run build ``` #### RĂ©initialisation de Base de DonnĂ©es ```sql -- PostgreSQL DROP DATABASE IF EXISTS veza_dev; DROP DATABASE IF EXISTS veza_test; DROP DATABASE IF EXISTS veza_chat; CREATE DATABASE veza_dev; CREATE DATABASE veza_test; CREATE DATABASE veza_chat; ``` ```bash # Redis redis-cli FLUSHALL ``` ### Support et Aide #### Diagnostic Automatique ```bash # Diagnostic complet du systĂšme ./tools/scripts/install.sh doctor # Rapport de diagnostic veza-fixtures status --verbose > diagnostic-report.txt ``` #### Collecte d'Informations ```bash # Informations systĂšme node --version npm --version psql --version redis-server --version # Configuration fixtures cat .env npm list --depth=0 # Logs rĂ©cents tail -n 50 ~/.veza-fixtures/logs/*.log ``` ## 🏆 Meilleures Pratiques ### GĂ©nĂ©ration de DonnĂ©es #### CohĂ©rence et RĂ©alisme ```typescript // ✅ Bon : Relations cohĂ©rentes const artist = UserGenerator.generateArtist() const tracks = AudioGenerator.generateUserContent(artist.id, 'artist') // ❌ Éviter : Relations incohĂ©rentes const user = UserGenerator.generate({ role: 'user' }) const tracks = AudioGenerator.generateBatch(100, { uploadedById: user.id }) // IncohĂ©rent ``` #### Seeds Reproductibles ```typescript // ✅ Bon : Seeds descriptifs et versionnĂ©s const seed = 'veza-demo-2025-v1.2' const config = loadConfig('demo') config.seed = seed // ❌ Éviter : Seeds alĂ©atoires const seed = Math.random().toString() ``` #### Taille de Dataset AppropriĂ©e ```typescript // ✅ Bon : Taille adaptĂ©e Ă  l'usage const devConfig = { users: { count: 50 }, // DĂ©veloppement : petit dataset tracks: { trackCount: 200 } } const testConfig = { users: { count: 20 }, // Tests : dataset minimal tracks: { trackCount: 50 } } const stagingConfig = { users: { count: 500 }, // Staging : dataset rĂ©aliste tracks: { trackCount: 2000 } } ``` ### IntĂ©gration Services #### Initialisation OrdonnĂ©e ```typescript // ✅ Bon : Ordre d'initialisation logique async function setupServices() { // 1. GĂ©nĂ©ration des donnĂ©es const dataset = DataRelationManager.generateCompleteDataset() // 2. Services de base (base de donnĂ©es) await ChatServerFixtures.initialize() await ChatServerFixtures.seedDatabase() // 3. Services de cache await ChatServerFixtures.seedRedis() await StreamServerFixtures.initialize() await StreamServerFixtures.seedStreamingData() // 4. Services frontend (derniers) await WebFixtures.initialize() } ``` #### Gestion des Erreurs ```typescript // ✅ Bon : Gestion d'erreurs robuste async function seedService(serviceName: string) { try { await serviceFixtures[serviceName].initialize() await serviceFixtures[serviceName].seed() console.log(`✅ ${serviceName} seeded successfully`) } catch (error) { console.error(`❌ Failed to seed ${serviceName}:`, error) // Cleanup partial state await serviceFixtures[serviceName].cleanup() throw error } } ``` ### Tests et Validation #### Tests IsolĂ©s ```typescript // ✅ Bon : Isolation des tests describe('UserGenerator', () => { beforeEach(() => { UserGenerator.clearCache() DataRelationManager.clearAll() }) it('should generate unique usernames', () => { const users = UserGenerator.generateBatch(10) const usernames = users.map(u => u.username) expect(new Set(usernames).size).toBe(usernames.length) }) }) ``` #### Validation SystĂ©matique ```typescript // ✅ Bon : Validation aprĂšs chaque gĂ©nĂ©ration function generateAndValidate() { const dataset = DataRelationManager.generateCompleteDataset() const validation = DataRelationManager.validateRelations() if (!validation.isValid) { throw new Error(`Data validation failed: ${validation.errors.join(', ')}`) } return dataset } ``` ### Performance #### GĂ©nĂ©ration Lazy ```typescript // ✅ Bon : GĂ©nĂ©ration Ă  la demande class LazyDataGenerator { private users: User[] | null = null getUsers(): User[] { if (!this.users) { this.users = UserGenerator.generateWithDistribution() } return this.users } } ``` #### Mise en Cache Intelligente ```typescript // ✅ Bon : Cache avec invalidation class CachedGenerator { private cache = new Map() generate(key: string, generator: () => any) { if (!this.cache.has(key)) { this.cache.set(key, generator()) } return this.cache.get(key) } invalidate(key: string) { this.cache.delete(key) } } ``` ### Maintenance #### Documentation Ă  Jour ```typescript // ✅ Bon : Documentation inline /** * GĂ©nĂšre un utilisateur artiste avec contenu musical associĂ© * * @param options - Options de gĂ©nĂ©ration * @param options.trackCount - Nombre de tracks Ă  gĂ©nĂ©rer (dĂ©faut: 5-15) * @param options.isVerified - Si l'artiste est vĂ©rifiĂ© (dĂ©faut: 60% de chance) * @returns Utilisateur artiste avec contenu associĂ© * * @example * const artist = generateArtistWithContent({ trackCount: 10, isVerified: true }) */ function generateArtistWithContent(options: ArtistOptions = {}) { // ImplĂ©mentation } ``` #### Monitoring Proactif ```typescript // ✅ Bon : MĂ©triques et alertes class FixturesMonitor { static recordGenerationTime(operation: string, duration: number) { if (duration > PERFORMANCE_THRESHOLDS[operation]) { console.warn(`⚠ Slow ${operation}: ${duration}ms`) // Send to monitoring system } } static recordValidationFailure(type: string, error: string) { console.error(`❌ Validation failure [${type}]: ${error}`) // Send alert } } ``` ### SĂ©curitĂ© #### DonnĂ©es Sensibles ```typescript // ✅ Bon : Pas de donnĂ©es sensibles rĂ©elles const fakePassword = vezaFaker.internet.password() const hashedPassword = '$2a$10$dummy.hash.for.development' // ❌ Éviter : Vraies donnĂ©es sensibles const realPassword = 'admin123' // Risque de sĂ©curitĂ© ``` #### Environnements SĂ©parĂ©s ```typescript // ✅ Bon : Configuration par environnement const config = { development: { allowRealData: false }, testing: { allowRealData: false }, staging: { allowRealData: false }, production: { enabled: false } // Pas de fixtures en prod } ``` --- Ce guide couvre tous les aspects du systĂšme de fixtures Veza. Pour des questions spĂ©cifiques ou des cas d'usage non couverts, consultez la documentation API ou contactez l'Ă©quipe de support.