Files

48 lines
2.0 KiB
TypeScript
Raw Permalink Normal View History

import { test, expect } from '@playwright/test';
import { login } from './helpers/auth';
import { testProjects } from './helpers/fixtures';
test.describe('Projects', () => {
test.beforeEach(async ({ page }) => {
await login(page);
await page.goto('/projects');
await expect(page.getByRole('heading', { name: /projects/i })).toBeVisible();
});
test('creates a project via the New Project dialog', async ({ page }) => {
await page.getByRole('button', { name: /new project/i }).click();
const dialog = page.getByRole('dialog');
await expect(dialog).toBeVisible();
await expect(dialog.getByRole('heading', { name: 'New Project' })).toBeVisible();
await dialog.getByLabel('Name').fill(testProjects.name);
await dialog.getByLabel('Description').fill(testProjects.description);
await dialog.getByRole('button', { name: /create project/i }).click();
// The dialog closes and the project card appears in the grid.
await expect(dialog).toBeHidden();
await expect(page.getByText(testProjects.name, { exact: true })).toBeVisible({
timeout: 10_000,
});
});
test('opens the project detail page from a project card', async ({ page }) => {
// Ensure the fixture project exists.
if (!(await page.getByText(testProjects.name, { exact: true }).isVisible().catch(() => false))) {
await page.getByRole('button', { name: /new project/i }).click();
const dialog = page.getByRole('dialog');
await dialog.getByLabel('Name').fill(testProjects.name);
await dialog.getByRole('button', { name: /create project/i }).click();
await expect(page.getByText(testProjects.name, { exact: true })).toBeVisible({ timeout: 10_000 });
}
await page.getByText(testProjects.name, { exact: true }).first().click();
await page.waitForURL('**/projects/*', { timeout: 10_000 });
await expect(
page.getByRole('heading', { name: testProjects.name, level: 3 }),
).toBeVisible({ timeout: 10_000 });
});
});