Files
LoreMind/web/e2e/tests/game-system/game-system-sections.spec.ts
IETM_FIXE\ietm6 5aa08a3a27
Some checks failed
Tests unitaires / Brain (Python · pytest + couverture) (push) Successful in 21s
Tests unitaires / Web (Angular · vitest + couverture) (push) Successful in 30s
Tests unitaires / Core (Java · mvn test + JaCoCo) (push) Successful in 2m22s
Build & Push Images / build (brain) (push) Successful in 1m16s
E2E Tests / e2e (push) Failing after 5m24s
Build & Push Images / build (core) (push) Successful in 3m5s
Build & Push Images / build-switcher (push) Successful in 50s
Build & Push Images / build (web) (push) Successful in 1m56s
Correction du worflow release : on ne fait plus les tests (évite le doublons de test avec le ci.yml).
Correction de tests coté java + config
Suppression de classes inutilisées coté Angular
2026-06-19 00:36:30 +02:00

112 lines
4.5 KiB
TypeScript

import { test, expect } from '@playwright/test';
import {
seedGameSystem,
deleteGameSystem,
type SeededGameSystem,
} from '../../fixtures/api';
test.describe('GameSystem rule sections editor', () => {
let gs: SeededGameSystem;
test.beforeEach(async ({ request }) => {
// On part d'un GameSystem vide (pas de regles seedees) — chaque test gere
// ses propres ajouts pour eviter les couplages.
gs = await seedGameSystem(request);
});
test.afterEach(async ({ request }) => {
if (gs?.id) await deleteGameSystem(request, gs.id);
});
test('adds a suggested section, fills it, and persists it', async ({ page, request }) => {
const sectionContent = 'Initiative à d20, action+bonus+mouvement, dégâts par dés.';
await page.goto(`/game-systems/${gs.id}/edit`);
// Attendre le chargement du form (nom prerempli).
await expect(page.getByLabel(/^Nom/i)).toHaveValue(gs.name);
// Empty state visible tant qu'aucune section n'est ajoutee.
await expect(page.locator('.section-list .empty-hint')).toBeVisible();
// Ajout via la chip suggeree "Combat".
await page.locator('.add-row .chip', { hasText: 'Combat' }).click();
// Une section-card est apparue avec titre "Combat" prerempli + textarea visible.
const card = page.locator('.section-card').first();
await expect(card).toBeVisible();
await expect(card.locator('.section-title-input')).toHaveValue('Combat');
await card.locator('.section-content').fill(sectionContent);
// Save + retour a la liste.
await page.getByRole('button', { name: /^Sauvegarder$/i }).click();
await expect(page).toHaveURL(/\/game-systems$/);
// Verification cote API : le markdown contient bien la section + son contenu.
const persisted = await request.get(`/api/game-systems/${gs.id}`).then((r) => r.json());
expect(persisted.rulesMarkdown).toContain('## Combat');
expect(persisted.rulesMarkdown).toContain(sectionContent);
});
test('disables a suggested chip after it has been used', async ({ page }) => {
await page.goto(`/game-systems/${gs.id}/edit`);
await expect(page.getByLabel(/^Nom/i)).toHaveValue(gs.name);
const combatChip = page.locator('.add-row .chip', { hasText: 'Combat' });
await expect(combatChip).toBeEnabled();
await combatChip.click();
// Apres ajout, la chip "Combat" est desactivee (suggestion deja utilisee).
await expect(combatChip).toBeDisabled();
});
test('adds a custom blank section via "Autre…" and lets the user name it', async ({ page }) => {
await page.goto(`/game-systems/${gs.id}/edit`);
await expect(page.getByLabel(/^Nom/i)).toHaveValue(gs.name);
await page.locator('.add-row .chip-custom', { hasText: /Autre/i }).click();
// Section vierge ajoutee : titre vide, prete a remplir.
const card = page.locator('.section-card').first();
await expect(card).toBeVisible();
const titleInput = card.locator('.section-title-input');
await expect(titleInput).toHaveValue('');
await titleInput.fill('Sorts');
await expect(titleInput).toHaveValue('Sorts');
});
test('removes a section', async ({ page }) => {
await page.goto(`/game-systems/${gs.id}/edit`);
await expect(page.getByLabel(/^Nom/i)).toHaveValue(gs.name);
await page.locator('.add-row .chip', { hasText: 'Combat' }).click();
await page.locator('.add-row .chip', { hasText: 'Classes' }).click();
await expect(page.locator('.section-card')).toHaveCount(2);
// Supprime la premiere section (Combat).
await page.locator('.section-card').first().locator('.btn-remove').click();
await expect(page.locator('.section-card')).toHaveCount(1);
await expect(page.locator('.section-card').first().locator('.section-title-input')).toHaveValue('Classes');
});
test('collapses and expands a section', async ({ page }) => {
await page.goto(`/game-systems/${gs.id}/edit`);
await expect(page.getByLabel(/^Nom/i)).toHaveValue(gs.name);
await page.locator('.add-row .chip', { hasText: 'Combat' }).click();
const card = page.locator('.section-card').first();
// Par defaut deployee : textarea visible.
await expect(card.locator('.section-content')).toBeVisible();
// Clic sur le bouton collapse → textarea masquee.
await card.locator('.btn-collapse').click();
await expect(card.locator('.section-content')).toHaveCount(0);
// Re-clic → re-deployee.
await card.locator('.btn-collapse').click();
await expect(card.locator('.section-content')).toBeVisible();
});
});