71 lines
2.6 KiB
TypeScript
71 lines
2.6 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import { seedLoreWithFolder, deleteLore, getLoreById, type SeededLore } from '../../fixtures/api';
|
|
|
|
test.describe('Lore inline edit (on detail page)', () => {
|
|
let seeded: SeededLore;
|
|
|
|
test.beforeEach(async ({ request }) => {
|
|
seeded = await seedLoreWithFolder(request);
|
|
});
|
|
|
|
test.afterEach(async ({ request }) => {
|
|
if (seeded?.id) await deleteLore(request, seeded.id);
|
|
});
|
|
|
|
test('renames the lore inline and persists the change', async ({ page, request }) => {
|
|
const newName = `${seeded.name} renamed`;
|
|
const newDescription = 'Nouvelle description éditée via UI';
|
|
|
|
await page.goto(`/lore/${seeded.id}`);
|
|
|
|
await expect(page.locator('.detail-header h1')).toHaveText(seeded.name);
|
|
|
|
await page.getByRole('button', { name: /^Modifier$/i }).click();
|
|
|
|
const nameInput = page.getByLabel(/^Nom$/);
|
|
const descInput = page.getByLabel(/^Description$/);
|
|
await expect(nameInput).toHaveValue(seeded.name);
|
|
|
|
await nameInput.fill(newName);
|
|
await descInput.fill(newDescription);
|
|
|
|
await page.getByRole('button', { name: /^Sauvegarder$/i }).click();
|
|
|
|
// Sortie du mode édition : le header bascule en mode lecture avec la nouvelle valeur.
|
|
await expect(page.locator('.detail-header h1')).toHaveText(newName);
|
|
await expect(page.locator('.detail-header .description')).toHaveText(newDescription);
|
|
|
|
const persisted = await getLoreById(request, seeded.id);
|
|
expect(persisted.name).toBe(newName);
|
|
expect(persisted.description).toBe(newDescription);
|
|
});
|
|
|
|
test('save button is disabled when name is emptied during edit', async ({ page }) => {
|
|
await page.goto(`/lore/${seeded.id}`);
|
|
await page.getByRole('button', { name: /^Modifier$/i }).click();
|
|
|
|
const saveBtn = page.getByRole('button', { name: /^Sauvegarder$/i });
|
|
await expect(saveBtn).toBeEnabled();
|
|
|
|
await page.getByLabel(/^Nom$/).fill('');
|
|
await expect(saveBtn).toBeDisabled();
|
|
|
|
await page.getByLabel(/^Nom$/).fill(' ');
|
|
await expect(saveBtn).toBeDisabled();
|
|
});
|
|
|
|
test('cancel discards the in-flight edits', async ({ page, request }) => {
|
|
await page.goto(`/lore/${seeded.id}`);
|
|
await page.getByRole('button', { name: /^Modifier$/i }).click();
|
|
|
|
await page.getByLabel(/^Nom$/).fill('Name jamais sauvegardé');
|
|
await page.getByRole('button', { name: /^Annuler$/i }).click();
|
|
|
|
// Retour en mode lecture avec le nom d'origine.
|
|
await expect(page.locator('.detail-header h1')).toHaveText(seeded.name);
|
|
|
|
const persisted = await getLoreById(request, seeded.id);
|
|
expect(persisted.name).toBe(seeded.name);
|
|
});
|
|
});
|