91 lines
3.3 KiB
TypeScript
91 lines
3.3 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import {
|
|
seedLoreWithFolder,
|
|
seedTemplate,
|
|
deleteLore,
|
|
getPagesForLore,
|
|
type SeededLore,
|
|
type SeededTemplate,
|
|
} from '../../fixtures/api';
|
|
|
|
test.describe('Page creation', () => {
|
|
let seeded: SeededLore;
|
|
let template: SeededTemplate;
|
|
|
|
test.beforeEach(async ({ request }) => {
|
|
seeded = await seedLoreWithFolder(request);
|
|
template = await seedTemplate(request, {
|
|
loreId: seeded.id,
|
|
defaultNodeId: seeded.rootFolderId,
|
|
fieldNames: ['Apparence', 'Motivation'],
|
|
});
|
|
});
|
|
|
|
test.afterEach(async ({ request }) => {
|
|
if (seeded?.id) await deleteLore(request, seeded.id);
|
|
});
|
|
|
|
test('creates an empty page from a template and redirects to edit', async ({ page, request }) => {
|
|
const pageTitle = `Maître Eldrin ${Date.now()}`;
|
|
|
|
await page.goto(`/lore/${seeded.id}/pages/create`);
|
|
|
|
await expect(page.getByRole('heading', { name: /Créer une nouvelle Page/i })).toBeVisible();
|
|
|
|
await page.getByLabel(/Titre de la page/i).fill(pageTitle);
|
|
|
|
await page.locator('.template-card', { hasText: template.name }).click();
|
|
await expect(page.locator('.template-card.selected', { hasText: template.name })).toBeVisible();
|
|
|
|
await expect(page.locator('#page-node')).toHaveValue(seeded.rootFolderId);
|
|
|
|
await page.getByRole('button', { name: /^Créer la page$/i }).click();
|
|
|
|
await expect(page).toHaveURL(new RegExp(`/lore/${seeded.id}/pages/[^/]+/edit$`));
|
|
|
|
const pages = await getPagesForLore(request, seeded.id);
|
|
const created = pages.find((p) => p.title === pageTitle);
|
|
expect(created).toBeDefined();
|
|
expect(created?.templateId).toBe(template.id);
|
|
expect(created?.nodeId).toBe(seeded.rootFolderId);
|
|
});
|
|
|
|
test('submit is disabled until title, template and folder are set', async ({ page }) => {
|
|
await page.goto(`/lore/${seeded.id}/pages/create`);
|
|
|
|
const submit = page.getByRole('button', { name: /^Créer la page$/i });
|
|
await expect(submit).toBeDisabled();
|
|
|
|
await page.getByLabel(/Titre de la page/i).fill('Un titre');
|
|
await expect(submit).toBeDisabled();
|
|
|
|
await page.locator('.template-card', { hasText: template.name }).click();
|
|
await expect(submit).toBeEnabled();
|
|
});
|
|
|
|
test('entering on a folder-scoped route preselects that folder', async ({ page, request }) => {
|
|
const pageTitle = `Page scoped ${Date.now()}`;
|
|
|
|
const secondFolderRes = await request.post('/api/lore-nodes', {
|
|
data: { loreId: seeded.id, name: 'Autre dossier', icon: 'folder', description: '' },
|
|
});
|
|
expect(secondFolderRes.ok()).toBeTruthy();
|
|
const secondFolderId = (await secondFolderRes.json()).id;
|
|
|
|
await page.goto(`/lore/${seeded.id}/nodes/${secondFolderId}/pages/create`);
|
|
|
|
const nodeSelect = page.locator('#page-node');
|
|
await expect(nodeSelect).toHaveValue(secondFolderId);
|
|
await expect(nodeSelect).toBeDisabled();
|
|
|
|
await page.getByLabel(/Titre de la page/i).fill(pageTitle);
|
|
await page.locator('.template-card', { hasText: template.name }).click();
|
|
await page.getByRole('button', { name: /^Créer la page$/i }).click();
|
|
|
|
await expect(page).toHaveURL(new RegExp(`/lore/${seeded.id}/pages/[^/]+/edit$`));
|
|
|
|
const pages = await getPagesForLore(request, seeded.id);
|
|
expect(pages.find((p) => p.title === pageTitle)?.nodeId).toBe(secondFolderId);
|
|
});
|
|
});
|