/** * Global Setup for FoundryVTT E2E Tests * * Ce script prépare l'environnement avant l'exécution des tests : * - Démarre le serveur FoundryVTT (si non déjà démarré) * - Crée un monde de test * - Configure les utilisateurs de test * - Installe le module Scrying Pool */ import { chromium } from '@playwright/test'; // Configuration du monde de test const FOUNDRY_BASE_URL = 'http://localhost:30000'; const TEST_WORLD_NAME = 'VVM-E2E-Test-World'; const TEST_GM_USER = 'TestGM'; const TEST_PLAYER_USER = 'TestPlayer'; // Stockage global pour l'état const globalSetup = { browser: null, context: null, page: null, worldCreated: false, }; /** * Crée un monde de test dans FoundryVTT */ async function createTestWorld(page) { console.log('🌍 Creating test world...'); // Naviguer vers la page de gestion des mondes await page.goto(`${FOUNDRY_BASE_URL}/setup`); // Attendre que la page se charge await page.waitForSelector('#world-list', { timeout: 30000 }); // Vérifier si le monde de test existe déjà const worldExists = await page.locator(`#world-list [data-world-id]:has-text("${TEST_WORLD_NAME}")`).count(); if (worldExists > 0) { console.log(`✅ Test world "${TEST_WORLD_NAME}" already exists`); return; } // Créer un nouveau monde await page.locator('button:has-text("Create World")').click(); await page.waitForSelector('#create-world-dialog', { timeout: 10000 }); // Remplir le formulaire await page.locator('#create-world-dialog input[name="worldName"]').fill(TEST_WORLD_NAME); await page.locator('#create-world-dialog input[name="system"]').fill('dnd5e'); // Système par défaut // Créer le monde await page.locator('#create-world-dialog button:has-text("Create")').click(); // Attendre la confirmation await page.waitForSelector(`#world-list [data-world-id]:has-text("${TEST_WORLD_NAME}")`, { timeout: 15000 }); console.log(`✅ Created test world: ${TEST_WORLD_NAME}`); globalSetup.worldCreated = true; } /** * Configure les utilisateurs de test */ async function configureTestUsers(page) { console.log('👥 Configuring test users...'); // Naviguer vers la gestion des utilisateurs await page.goto(`${FOUNDRY_BASE_URL}/setup/users`); await page.waitForSelector('#users-list', { timeout: 30000 }); // Vérifier/Créer l'utilisateur GM const gmExists = await page.locator(`#users-list [data-user-id]:has-text("${TEST_GM_USER}")`).count(); if (gmExists === 0) { await page.locator('button:has-text("Add User")').click(); await page.waitForSelector('#add-user-dialog', { timeout: 10000 }); await page.locator('#add-user-dialog input[name="username"]').fill(TEST_GM_USER); await page.locator('#add-user-dialog input[name="password"]').fill('test123'); await page.locator('#add-user-dialog select[name="role"]').selectOption('Game Master'); await page.locator('#add-user-dialog button:has-text("Add")').click(); await page.waitForSelector(`#users-list [data-user-id]:has-text("${TEST_GM_USER}")`, { timeout: 10000 }); console.log(`✅ Created GM user: ${TEST_GM_USER}`); } // Vérifier/Créer l'utilisateur Player const playerExists = await page.locator(`#users-list [data-user-id]:has-text("${TEST_PLAYER_USER}")`).count(); if (playerExists === 0) { await page.locator('button:has-text("Add User")').click(); await page.waitForSelector('#add-user-dialog', { timeout: 10000 }); await page.locator('#add-user-dialog input[name="username"]').fill(TEST_PLAYER_USER); await page.locator('#add-user-dialog input[name="password"]').fill('test123'); await page.locator('#add-user-dialog select[name="role"]').selectOption('Player'); await page.locator('#add-user-dialog button:has-text("Add")').click(); await page.waitForSelector(`#users-list [data-user-id]:has-text("${TEST_PLAYER_USER}")`, { timeout: 10000 }); console.log(`✅ Created Player user: ${TEST_PLAYER_USER}`); } } /** * Installe le module Scrying Pool */ async function installVVMModule(page) { console.log('📦 Installing Scrying Pool module...'); // Naviguer vers la gestion des modules await page.goto(`${FOUNDRY_BASE_URL}/setup/modules`); await page.waitForSelector('#modules-list', { timeout: 30000 }); // Vérifier si le module est déjà installé const moduleInstalled = await page.locator(`#modules-list [data-module-id="scrying-pool"]`).count(); if (moduleInstalled > 0) { console.log('✅ Scrying Pool module already installed'); return; } // Installer le module depuis le fichier local // Note: En environnement de test, le module devrait déjà être dans le dossier modules/ // Sinon, il faut le copier manuellement console.log('⚠️ Module must be manually placed in FoundryVTT modules/ folder'); console.log(' Copy scrying-pool/ to foundrydata-dev/Data/modules/'); } /** * Sauvegarde l'état pour globalTeardown */ async function saveState() { process.env.FOUNDRY_TEST_WORLD = TEST_WORLD_NAME; process.env.FOUNDRY_TEST_GM = TEST_GM_USER; process.env.FOUNDRY_TEST_PLAYER = TEST_PLAYER_USER; } // Exécuter le setup async function globalSetup() { console.log('\n🚀 Starting FoundryVTT E2E Test Setup...\n'); // Créer le navigateur const browser = await chromium.launch({ headless: true, timeout: 60000, }); const context = await browser.newContext({ viewport: { width: 1920, height: 1080 }, userAgent: 'VVM-E2E-Setup/1.0', }); const page = await context.newPage(); try { // Se connecter (FoundryVTT local n'a pas d'authentification par défaut) await page.goto(FOUNDRY_BASE_URL, { timeout: 30000 }); // Créer le monde de test await createTestWorld(page); // Configurer les utilisateurs await configureTestUsers(page); // Installer le module await installVVMModule(page); // Sauvegarder l'état await saveState(); console.log('\n✅ FoundryVTT E2E Test Setup Complete!\n'); console.log('📋 Configuration:'); console.log(` - World: ${TEST_WORLD_NAME}`); console.log(` - GM User: ${TEST_GM_USER}`); console.log(` - Player User: ${TEST_PLAYER_USER}`); console.log(` - Foundry URL: ${FOUNDRY_BASE_URL}`); console.log('\n💡 Ensure FoundryVTT server is running on localhost:30000'); console.log('💡 Ensure Scrying Pool module is in modules/ folder\n'); } catch (error) { console.error('❌ Setup failed:', error); throw error; } finally { await page.close(); await context.close(); await browser.close(); } } export default globalSetup;