import { test, expect } from '@playwright/test'; import { seedCampaign, deleteCampaign, getNpcsByCampaign, type SeededCampaign, } from '../../fixtures/api'; test.describe('NPC creation', () => { let campaign: SeededCampaign; test.beforeEach(async ({ request }) => { campaign = await seedCampaign(request); }); test.afterEach(async ({ request }) => { if (campaign?.id) await deleteCampaign(request, campaign.id); }); test('creates an NPC and redirects to the NPC detail page', async ({ page, request }) => { // Note : depuis la refonte 2026-04-30 les fiches PNJ utilisent des champs // templates dynamiques pilotes par le GameSystem (plus de markdownContent // libre). La campagne seedee n'a pas de GameSystem donc on ne fill que le // nom — c'est suffisant pour valider la creation + la redirection. const npcName = `Borin le forgeron ${Date.now()}`; await page.goto(`/campaigns/${campaign.id}/npcs/create`); await expect(page.getByRole('heading', { name: /Nouveau PNJ/i })).toBeVisible(); await page.getByLabel(/Nom du PNJ/i).fill(npcName); await page.getByRole('button', { name: /^Créer$/i }).click(); // Redirection vers la fiche du PNJ après création await expect(page).toHaveURL(new RegExp(`/campaigns/${campaign.id}/npcs/\\d+$`)); // Persistance vérifiée via API const npcs = await getNpcsByCampaign(request, campaign.id); const created = npcs.find((n) => n.name === npcName); expect(created).toBeDefined(); }); test('submit is disabled when name is empty', async ({ page }) => { await page.goto(`/campaigns/${campaign.id}/npcs/create`); const submit = page.getByRole('button', { name: /^Créer$/i }); await expect(submit).toBeDisabled(); await page.getByLabel(/Nom du PNJ/i).fill('Elara'); await expect(submit).toBeEnabled(); await page.getByLabel(/Nom du PNJ/i).fill(' '); await expect(submit).toBeDisabled(); }); test('NPC appears in the sidebar PNJ branch', async ({ page, request }) => { const npcName = `Sidebar test ${Date.now()}`; await page.goto(`/campaigns/${campaign.id}/npcs/create`); await page.getByLabel(/Nom du PNJ/i).fill(npcName); await page.getByRole('button', { name: /^Créer$/i }).click(); await expect(page).toHaveURL(new RegExp(`/campaigns/${campaign.id}/npcs/\\d+$`)); // Le nœud "PNJ" doit apparaître dans la sidebar avec le nouveau PNJ. // On clique sur le nœud PNJ pour le déplier au cas où il serait fermé, // puis on vérifie que le PNJ est listé. const pnjNode = page.getByRole('button', { name: /^PNJ\b/ }).or( page.locator('.tree-item', { hasText: 'PNJ' }).first(), ); await expect(pnjNode.first()).toBeVisible(); // Vérification fallback via API : la liste contient bien le PNJ créé. const npcs = await getNpcsByCampaign(request, campaign.id); expect(npcs.map((n) => n.name)).toContain(npcName); }); });