d67f3669d6
- nuovo tests/e2e/helpers.cjs: openController (viewport portrait per il layout mobile), openDisplay, resetGame, addPoints - resetGame gestisce il dialog di vittoria persistente e reimposta i nomi di default (lo stato è condiviso e persistente: serve per il determinismo) - full-match/game-simulation: gestito il dialog SET VINTO automatico a 25/15 - basic-flow/game-operations: migrati agli helper condivisi
82 lines
2.9 KiB
JavaScript
82 lines
2.9 KiB
JavaScript
// 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,
|
|
};
|