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 de tests coté java + config Suppression de classes inutilisées coté Angular
112 lines
4.5 KiB
TypeScript
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();
|
|
});
|
|
});
|