import { test, expect } from '@playwright/test'; import { seedCampaign, seedArc, deleteCampaign, getArcById, type SeededCampaign, type SeededArc, } from '../../fixtures/api'; test.describe('Arc edit', () => { let campaign: SeededCampaign; let arc: SeededArc; test.beforeEach(async ({ request }) => { campaign = await seedCampaign(request); arc = await seedArc(request, { campaignId: campaign.id }); }); test.afterEach(async ({ request }) => { if (campaign?.id) await deleteCampaign(request, campaign.id); }); test('form is prefilled with the arc name', async ({ page }) => { await page.goto(`/campaigns/${campaign.id}/arcs/${arc.id}/edit`); await expect(page.getByLabel(/Titre de l'arc/i)).toHaveValue(arc.name); }); test('edits all narrative fields and persists them to API', async ({ page, request }) => { const newName = `${arc.name} renamed`; const values = { description: "Un arc sombre où la trahison s'installe.", themes: 'Trahison, rédemption, dette de sang.', stakes: 'La survie du royaume est en jeu.', gmNotes: 'Révéler le traître en scène 3.', rewards: 'Relique ancienne + alliance avec le clan nordique.', resolution: 'Le héros pardonne au traître ou le tue.', }; await page.goto(`/campaigns/${campaign.id}/arcs/${arc.id}/edit`); // Attend que le formulaire soit prerempli par le ngOnInit (HTTP async) avant // de fill — sinon le patchValue du load arrive APRES nos fills et ecrase // les valeurs, le test echoue alors a la verif persisted.name. await expect(page.getByLabel(/Titre de l'arc/i)).toHaveValue(arc.name); await page.getByLabel(/Titre de l'arc/i).fill(newName); await page.getByLabel(/Synopsis de l'arc/i).fill(values.description); await page.getByLabel(/Thèmes principaux/i).fill(values.themes); await page.getByLabel(/Enjeux globaux/i).fill(values.stakes); await page.getByLabel(/Notes et planification du MJ/i).fill(values.gmNotes); await page.getByLabel(/Récompenses et progression/i).fill(values.rewards); await page.getByLabel(/Dénouement prévu/i).fill(values.resolution); await page.getByRole('button', { name: /^Sauvegarder$/i }).click(); await expect(page).toHaveURL(new RegExp(`/campaigns/${campaign.id}/arcs/${arc.id}$`)); const persisted = await getArcById(request, arc.id); expect(persisted.name).toBe(newName); expect(persisted.description).toBe(values.description); expect(persisted.themes).toBe(values.themes); expect(persisted.stakes).toBe(values.stakes); expect(persisted.gmNotes).toBe(values.gmNotes); expect(persisted.rewards).toBe(values.rewards); expect(persisted.resolution).toBe(values.resolution); }); test('save button is disabled when name is empty', async ({ page }) => { await page.goto(`/campaigns/${campaign.id}/arcs/${arc.id}/edit`); const nameField = page.getByLabel(/Titre de l'arc/i); const saveBtn = page.getByRole('button', { name: /^Sauvegarder$/i }); await expect(saveBtn).toBeEnabled(); await nameField.fill(''); await expect(saveBtn).toBeDisabled(); await nameField.fill('Valid'); await expect(saveBtn).toBeEnabled(); }); });