// Helper condivisi per gli E2E. // Nota: lo stato di gioco è UNICO e persistente sul server, quindi ogni test // deve riportarlo a zero (resetGame) e gestire eventuali dialog rimasti aperti // dal test precedente. const CONTROLLER_URL = 'http://localhost:3000/controller'; const DISPLAY_URL = 'http://localhost:3000'; // Apre il controller in viewport portrait (layout "mobile", su cui si basano i // selettori dei test) e attende la connessione WebSocket. async function openController(context) { const page = await context.newPage(); await page.setViewportSize({ width: 390, height: 844 }); await page.goto(CONTROLLER_URL); await page.waitForSelector('.conn-bar.connected'); return page; } // Apre il display. async function openDisplay(context) { const page = await context.newPage(); await page.goto(DISPLAY_URL); return page; } // Chiude l'eventuale dialog di fine set / fine partita (può essersi aperto in // automatico al caricamento se lo stato persistito era già "vinto"). async function chiudiDialogVittoria(page) { if (await page.locator('.dialog-winner').isVisible().catch(() => false)) { const chiudi = page.getByRole('button', { name: 'CHIUDI' }); if (await chiudi.isVisible().catch(() => false)) { await chiudi.click(); } else { await page.getByText('INDIETRO').click(); } await page.waitForTimeout(150); } } // Reset completo dello stato dal controller: // 1) chiude un eventuale dialog di vittoria, 2) azzera, 3) nel dialog di // configurazione che doReset riapre, reimposta nomi di default e conferma. // Reimpostare i nomi rende lo stato deterministico (lo stato è condiviso e // persistente: senza questo i nomi di un test precedente "sporcano" gli altri, // in particolare gli screenshot di visual-regression). async function resetGame(page) { await chiudiDialogVittoria(page); await page.getByText(/Reset/i).first().click(); const btnConfirm = page.locator('.dialog .btn-confirm'); if (await btnConfirm.isVisible().catch(() => false)) { await btnConfirm.click(); } const cfg = page.locator('.dialog-config'); if (await cfg.isVisible().catch(() => false)) { const inputs = page.locator('.dialog-config .input-field'); await inputs.first().fill('Antoniana'); await inputs.nth(1).fill('Guest'); await page.locator('.dialog-config .btn-confirm').click(); } await page.waitForTimeout(300); } // Incrementa N punti per una squadra cliccando il punteggio. async function addPoints(page, team, count) { const selector = team === 'home' ? '.team-score.home-bg' : '.team-score.guest-bg'; for (let i = 0; i < count; i++) { await page.locator(selector).click(); await page.waitForTimeout(30); } await page.waitForTimeout(100); } module.exports = { CONTROLLER_URL, DISPLAY_URL, openController, openDisplay, chiudiDialogVittoria, resetGame, addPoints, };