|
|
|
@ -1,4 +1,13 @@
|
|
|
|
import { expect, test } from '@playwright/test'
|
|
|
|
import { expect, test, type Page } from '@playwright/test'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async function setInputValue(selector: string, value: string, page: Page): Promise<void> {
|
|
|
|
|
|
|
|
await page.locator(selector).evaluate((el, next) => {
|
|
|
|
|
|
|
|
const input = el as HTMLInputElement
|
|
|
|
|
|
|
|
input.value = next
|
|
|
|
|
|
|
|
input.dispatchEvent(new Event('input', { bubbles: true }))
|
|
|
|
|
|
|
|
input.dispatchEvent(new Event('change', { bubbles: true }))
|
|
|
|
|
|
|
|
}, value)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
test.describe('critical frontend flows - extended', () => {
|
|
|
|
test.describe('critical frontend flows - extended', () => {
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
|
|
@ -20,13 +29,7 @@ test.describe('critical frontend flows - extended', () => {
|
|
|
|
|
|
|
|
|
|
|
|
test('start new game from home and render first playable question', async ({ page }) => {
|
|
|
|
test('start new game from home and render first playable question', async ({ page }) => {
|
|
|
|
await page.goto('/')
|
|
|
|
await page.goto('/')
|
|
|
|
const homeNameInput = page.getByTestId('home-player-name-input')
|
|
|
|
await setInputValue('[data-testid="home-player-name-input"]', 'E2E Player', page)
|
|
|
|
await homeNameInput.evaluate((el) => {
|
|
|
|
|
|
|
|
const input = el as HTMLInputElement
|
|
|
|
|
|
|
|
input.value = 'E2E Player'
|
|
|
|
|
|
|
|
input.dispatchEvent(new Event('input', { bubbles: true }))
|
|
|
|
|
|
|
|
input.dispatchEvent(new Event('change', { bubbles: true }))
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
await page.getByRole('button', { name: 'Démarrer la partie' }).click()
|
|
|
|
await page.getByRole('button', { name: 'Démarrer la partie' }).click()
|
|
|
|
|
|
|
|
|
|
|
|
await expect(page).toHaveURL(/\/game$/)
|
|
|
|
await expect(page).toHaveURL(/\/game$/)
|
|
|
|
@ -46,38 +49,44 @@ test.describe('critical frontend flows - extended', () => {
|
|
|
|
|
|
|
|
|
|
|
|
await expect(page.getByText(/Indice:/i)).toBeVisible()
|
|
|
|
await expect(page.getByText(/Indice:/i)).toBeVisible()
|
|
|
|
|
|
|
|
|
|
|
|
const answerInput = page.getByLabel('Ta réponse')
|
|
|
|
await setInputValue('[data-testid="game-answer-input"]', '2', page)
|
|
|
|
await answerInput.evaluate((el) => {
|
|
|
|
await page.getByRole('button', { name: 'Envoyer' }).click()
|
|
|
|
const input = el as HTMLInputElement
|
|
|
|
|
|
|
|
input.value = '2'
|
|
|
|
await expect(page).toHaveURL(/\/game$/)
|
|
|
|
input.dispatchEvent(new Event('input', { bubbles: true }))
|
|
|
|
await expect(page.getByText('Score: 1')).toBeVisible()
|
|
|
|
input.dispatchEvent(new Event('change', { bubbles: true }))
|
|
|
|
await expect(page.getByText('Quelle planète est surnommée la planète rouge ?')).toBeVisible()
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
await setInputValue('[data-testid="game-answer-input"]', 'mars', page)
|
|
|
|
await page.getByRole('button', { name: 'Envoyer' }).click()
|
|
|
|
await page.getByRole('button', { name: 'Envoyer' }).click()
|
|
|
|
|
|
|
|
|
|
|
|
await expect(page).toHaveURL(/\/results$/)
|
|
|
|
await expect(page).toHaveURL(/\/results$/)
|
|
|
|
await expect(page.getByText('Score final : 1')).toBeVisible()
|
|
|
|
await expect(page.getByText('Score final : 3')).toBeVisible()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
test.fixme('after 3 wrong answers, game advances to next question', async ({ page }) => {
|
|
|
|
test('after 3 wrong answers, game advances to next question', async ({ page }) => {
|
|
|
|
await page.goto('/game')
|
|
|
|
await page.goto('/game')
|
|
|
|
await page.getByLabel('Ta réponse').fill('wrong')
|
|
|
|
await setInputValue('[data-testid="game-answer-input"]', 'wrong', page)
|
|
|
|
await page.getByRole('button', { name: 'Envoyer' }).click()
|
|
|
|
await page.getByRole('button', { name: 'Envoyer' }).click()
|
|
|
|
await page.getByLabel('Ta réponse').fill('wrong')
|
|
|
|
await setInputValue('[data-testid="game-answer-input"]', 'wrong', page)
|
|
|
|
await page.getByRole('button', { name: 'Envoyer' }).click()
|
|
|
|
await page.getByRole('button', { name: 'Envoyer' }).click()
|
|
|
|
await page.getByLabel('Ta réponse').fill('wrong')
|
|
|
|
await setInputValue('[data-testid="game-answer-input"]', 'wrong', page)
|
|
|
|
await page.getByRole('button', { name: 'Envoyer' }).click()
|
|
|
|
await page.getByRole('button', { name: 'Envoyer' }).click()
|
|
|
|
|
|
|
|
|
|
|
|
await expect(page.getByText('Question 2')).toBeVisible()
|
|
|
|
await expect(page).toHaveURL(/\/game$/)
|
|
|
|
|
|
|
|
await expect(page.getByText('Quelle planète est surnommée la planète rouge ?')).toBeVisible()
|
|
|
|
await expect(page.getByText("Plus d'essais.")).not.toBeVisible()
|
|
|
|
await expect(page.getByText("Plus d'essais.")).not.toBeVisible()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
test.fixme('session timeout ends game and redirects to results', async ({ page }) => {
|
|
|
|
test('session timeout ends game and redirects to results', async ({ page }) => {
|
|
|
|
|
|
|
|
await page.goto('/')
|
|
|
|
|
|
|
|
await page.evaluate(() => {
|
|
|
|
|
|
|
|
localStorage.setItem('kf.e2e.timerMs', '300')
|
|
|
|
|
|
|
|
})
|
|
|
|
await page.goto('/game')
|
|
|
|
await page.goto('/game')
|
|
|
|
await expect(page.getByRole('heading', { name: 'Partie' })).toBeVisible()
|
|
|
|
await expect(page.getByRole('heading', { name: 'Partie' })).toBeVisible()
|
|
|
|
|
|
|
|
|
|
|
|
await expect(page).toHaveURL(/\/results$/)
|
|
|
|
await expect(page).toHaveURL(/\/results$/)
|
|
|
|
await expect(page.getByText(/Temps écoulé/i)).toBeVisible()
|
|
|
|
await expect(page.getByText('Score final : 0')).toBeVisible()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
test('results remain visible after page reload', async ({ page }) => {
|
|
|
|
test('results remain visible after page reload', async ({ page }) => {
|
|
|
|
@ -105,21 +114,42 @@ test.describe('critical frontend flows - extended', () => {
|
|
|
|
await expect(page.getByText('Position leaderboard : #2')).toBeVisible()
|
|
|
|
await expect(page.getByText('Position leaderboard : #2')).toBeVisible()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
test.fixme('leaderboard shows empty and error states from API', async ({ page }) => {
|
|
|
|
test('leaderboard shows empty and error states from API', async ({ page }) => {
|
|
|
|
|
|
|
|
await page.goto('/')
|
|
|
|
|
|
|
|
await page.evaluate(() => {
|
|
|
|
|
|
|
|
localStorage.setItem('kf.leaderboard.mode', 'api')
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
await page.route('**/leaderboard/top10', async (route) => {
|
|
|
|
|
|
|
|
await route.fulfill({
|
|
|
|
|
|
|
|
status: 200,
|
|
|
|
|
|
|
|
contentType: 'application/json',
|
|
|
|
|
|
|
|
body: JSON.stringify({ items: [] }),
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
})
|
|
|
|
await page.goto('/leaderboard')
|
|
|
|
await page.goto('/leaderboard')
|
|
|
|
await expect(page.getByText('Aucun score pour le moment.')).toBeVisible()
|
|
|
|
await expect(page.getByText('Aucun score pour le moment.')).toBeVisible()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
await page.unroute('**/leaderboard/top10')
|
|
|
|
|
|
|
|
await page.route('**/leaderboard/top10', async (route) => {
|
|
|
|
|
|
|
|
await route.fulfill({
|
|
|
|
|
|
|
|
status: 500,
|
|
|
|
|
|
|
|
contentType: 'application/json',
|
|
|
|
|
|
|
|
body: JSON.stringify({ error: 'boom' }),
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
})
|
|
|
|
await page.getByRole('button', { name: 'Rafraîchir' }).click()
|
|
|
|
await page.getByRole('button', { name: 'Rafraîchir' }).click()
|
|
|
|
await expect(page.getByText(/Erreur|Impossible/i)).toBeVisible()
|
|
|
|
await expect(
|
|
|
|
|
|
|
|
page.getByText('Impossible de charger le leaderboard. Veuillez réessayer.')
|
|
|
|
|
|
|
|
).toBeVisible()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
test.fixme('admin can create, edit, then delete a question', async ({ page }) => {
|
|
|
|
test('admin can create, edit, then delete a question', async ({ page }) => {
|
|
|
|
await page.goto('/admin/questions')
|
|
|
|
await page.goto('/admin/questions')
|
|
|
|
|
|
|
|
|
|
|
|
await page.getByTestId('admin-theme-input').fill('Science')
|
|
|
|
await setInputValue('[data-testid="admin-theme-input"]', 'Science', page)
|
|
|
|
await page.getByTestId('admin-question-input').fill('Quelle planète est rouge ?')
|
|
|
|
await setInputValue('[data-testid="admin-question-input"]', 'Quelle planète est rouge ?', page)
|
|
|
|
await page.getByTestId('admin-answer-input').fill('Mars')
|
|
|
|
await setInputValue('[data-testid="admin-answer-input"]', 'Mars', page)
|
|
|
|
await page.getByTestId('admin-hint-input').fill('4e planète')
|
|
|
|
await setInputValue('[data-testid="admin-hint-input"]', '4e planète', page)
|
|
|
|
await page.getByTestId('admin-create-question').click()
|
|
|
|
await page.getByTestId('admin-create-question').click()
|
|
|
|
await expect(page.getByText('Quelle planète est rouge ?')).toBeVisible()
|
|
|
|
await expect(page.getByText('Quelle planète est rouge ?')).toBeVisible()
|
|
|
|
|
|
|
|
|
|
|
|
@ -127,9 +157,11 @@ test.describe('critical frontend flows - extended', () => {
|
|
|
|
.getByRole('button', { name: /Modifier/i })
|
|
|
|
.getByRole('button', { name: /Modifier/i })
|
|
|
|
.first()
|
|
|
|
.first()
|
|
|
|
.click()
|
|
|
|
.click()
|
|
|
|
await page
|
|
|
|
await setInputValue(
|
|
|
|
.getByTestId('admin-question-input')
|
|
|
|
'[data-testid="admin-question-input"]',
|
|
|
|
.fill('Quelle planète est appelée planète rouge ?')
|
|
|
|
'Quelle planète est appelée planète rouge ?',
|
|
|
|
|
|
|
|
page
|
|
|
|
|
|
|
|
)
|
|
|
|
await page.getByRole('button', { name: /Enregistrer la modification/i }).click()
|
|
|
|
await page.getByRole('button', { name: /Enregistrer la modification/i }).click()
|
|
|
|
await expect(page.getByText('Quelle planète est appelée planète rouge ?')).toBeVisible()
|
|
|
|
await expect(page.getByText('Quelle planète est appelée planète rouge ?')).toBeVisible()
|
|
|
|
|
|
|
|
|
|
|
|
@ -158,13 +190,7 @@ test.describe('critical frontend flows - mobile viewport', () => {
|
|
|
|
localStorage.clear()
|
|
|
|
localStorage.clear()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
const mobileNameInput = page.getByTestId('home-player-name-input')
|
|
|
|
await setInputValue('[data-testid="home-player-name-input"]', 'Mobile Player', page)
|
|
|
|
await mobileNameInput.evaluate((el) => {
|
|
|
|
|
|
|
|
const input = el as HTMLInputElement
|
|
|
|
|
|
|
|
input.value = 'Mobile Player'
|
|
|
|
|
|
|
|
input.dispatchEvent(new Event('input', { bubbles: true }))
|
|
|
|
|
|
|
|
input.dispatchEvent(new Event('change', { bubbles: true }))
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
await page.getByRole('button', { name: 'Démarrer la partie' }).click()
|
|
|
|
await page.getByRole('button', { name: 'Démarrer la partie' }).click()
|
|
|
|
|
|
|
|
|
|
|
|
await expect(page).toHaveURL(/\/game$/)
|
|
|
|
await expect(page).toHaveURL(/\/game$/)
|
|
|
|
|