test(e2e): helper condivisi e refactor degli spec di gioco
- 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
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
// 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,
|
||||
};
|
||||
Reference in New Issue
Block a user