96 lines
3.4 KiB
TypeScript
96 lines
3.4 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import {
|
|
seedLoreWithFolder,
|
|
seedTemplate,
|
|
seedPage,
|
|
deleteLore,
|
|
getPageById,
|
|
type SeededLore,
|
|
type SeededTemplate,
|
|
type SeededPage,
|
|
} from '../../fixtures/api';
|
|
|
|
test.describe('Page edit', () => {
|
|
let seeded: SeededLore;
|
|
let template: SeededTemplate;
|
|
let pageEntity: SeededPage;
|
|
|
|
test.beforeEach(async ({ request }) => {
|
|
seeded = await seedLoreWithFolder(request);
|
|
template = await seedTemplate(request, {
|
|
loreId: seeded.id,
|
|
defaultNodeId: seeded.rootFolderId,
|
|
fieldNames: ['Apparence', 'Motivation'],
|
|
});
|
|
pageEntity = await seedPage(request, {
|
|
loreId: seeded.id,
|
|
nodeId: seeded.rootFolderId,
|
|
templateId: template.id,
|
|
});
|
|
});
|
|
|
|
test.afterEach(async ({ request }) => {
|
|
if (seeded?.id) await deleteLore(request, seeded.id);
|
|
});
|
|
|
|
test('edits title, dynamic fields, notes and persists to API', async ({ page, request }) => {
|
|
const newTitle = `Maître Eldrin ${Date.now()}`;
|
|
const apparence = 'Vieil homme au regard perçant.';
|
|
const motivation = 'Protéger la cité à tout prix.';
|
|
const notes = 'MJ : il connaît le secret du roi.';
|
|
|
|
await page.goto(`/lore/${seeded.id}/pages/${pageEntity.id}/edit`);
|
|
|
|
await expect(page.locator('input[name="title"]')).toHaveValue(pageEntity.title);
|
|
|
|
await page.locator('input[name="title"]').fill(newTitle);
|
|
await page.getByPlaceholder('Valeur pour Apparence...').fill(apparence);
|
|
await page.getByPlaceholder('Valeur pour Motivation...').fill(motivation);
|
|
await page.locator('textarea[name="notes"]').fill(notes);
|
|
|
|
await page.getByRole('button', { name: /^Sauvegarder$/i }).click();
|
|
|
|
await expect(page).toHaveURL(new RegExp(`/lore/${seeded.id}/pages/${pageEntity.id}$`));
|
|
|
|
const persisted = await getPageById(request, pageEntity.id);
|
|
expect(persisted.title).toBe(newTitle);
|
|
expect(persisted.values?.['Apparence']).toBe(apparence);
|
|
expect(persisted.values?.['Motivation']).toBe(motivation);
|
|
expect(persisted.notes).toBe(notes);
|
|
});
|
|
|
|
test('adds a tag via chips input and persists it', async ({ page, request }) => {
|
|
await page.goto(`/lore/${seeded.id}/pages/${pageEntity.id}/edit`);
|
|
|
|
const chipsInput = page.locator('app-chips-input input');
|
|
await chipsInput.fill('dangereux');
|
|
await chipsInput.press('Enter');
|
|
await chipsInput.fill('ancien');
|
|
await chipsInput.press('Enter');
|
|
|
|
await expect(page.locator('app-chips-input').getByText('dangereux')).toBeVisible();
|
|
await expect(page.locator('app-chips-input').getByText('ancien')).toBeVisible();
|
|
|
|
await page.getByRole('button', { name: /^Sauvegarder$/i }).click();
|
|
await expect(page).toHaveURL(new RegExp(`/lore/${seeded.id}/pages/${pageEntity.id}$`));
|
|
|
|
const persisted = await getPageById(request, pageEntity.id);
|
|
expect(persisted.tags).toEqual(expect.arrayContaining(['dangereux', 'ancien']));
|
|
});
|
|
|
|
test('save button is disabled when title is empty', async ({ page }) => {
|
|
await page.goto(`/lore/${seeded.id}/pages/${pageEntity.id}/edit`);
|
|
|
|
const titleInput = page.locator('input[name="title"]');
|
|
const saveBtn = page.getByRole('button', { name: /^Sauvegarder$/i });
|
|
|
|
await expect(saveBtn).toBeEnabled();
|
|
await titleInput.fill('');
|
|
await expect(saveBtn).toBeDisabled();
|
|
await titleInput.fill(' ');
|
|
await expect(saveBtn).toBeDisabled();
|
|
await titleInput.fill('OK');
|
|
await expect(saveBtn).toBeEnabled();
|
|
});
|
|
});
|