2026-07-16 06:19:58 -04:00
|
|
|
import { test, expect } from '@playwright/test';
|
|
|
|
|
import { login } from './helpers/auth';
|
|
|
|
|
import { testTasks } from './helpers/fixtures';
|
|
|
|
|
|
2026-08-10 08:53:18 +00:00
|
|
|
test.describe('Tasks', () => {
|
2026-07-16 06:19:58 -04:00
|
|
|
test.beforeEach(async ({ page }) => {
|
|
|
|
|
await login(page);
|
|
|
|
|
await page.goto('/tasks');
|
|
|
|
|
await expect(page.getByRole('heading', { name: /tasks/i })).toBeVisible();
|
|
|
|
|
});
|
|
|
|
|
|
2026-08-10 08:53:18 +00:00
|
|
|
test('shows the kanban board with the four status columns', async ({ page }) => {
|
|
|
|
|
await expect(page.getByRole('heading', { name: 'Todo' })).toBeVisible();
|
|
|
|
|
await expect(page.getByRole('heading', { name: 'In Progress' })).toBeVisible();
|
|
|
|
|
await expect(page.getByRole('heading', { name: 'Done' })).toBeVisible();
|
|
|
|
|
await expect(page.getByRole('heading', { name: 'Cancelled' })).toBeVisible();
|
2026-07-16 06:19:58 -04:00
|
|
|
});
|
|
|
|
|
|
2026-08-10 08:53:18 +00:00
|
|
|
test('creates a task via the New Task dialog and shows it on the board', async ({ page }) => {
|
|
|
|
|
await page.getByRole('button', { name: /new task/i }).click();
|
2026-07-16 06:19:58 -04:00
|
|
|
|
2026-08-10 08:53:18 +00:00
|
|
|
const dialog = page.getByRole('dialog');
|
|
|
|
|
await expect(dialog).toBeVisible();
|
|
|
|
|
await expect(dialog.getByRole('heading', { name: 'New Task' })).toBeVisible();
|
2026-07-16 06:19:58 -04:00
|
|
|
|
2026-08-10 08:53:18 +00:00
|
|
|
await dialog.getByLabel('Title').fill(testTasks.title);
|
|
|
|
|
await dialog.getByLabel('Description').fill(testTasks.description);
|
|
|
|
|
await dialog.getByRole('button', { name: /create task/i }).click();
|
2026-07-16 06:19:58 -04:00
|
|
|
|
2026-08-10 08:53:18 +00:00
|
|
|
// The dialog closes and the task appears in the Todo column.
|
|
|
|
|
await expect(dialog).toBeHidden();
|
|
|
|
|
await expect(page.getByText(testTasks.title, { exact: true })).toBeVisible({
|
|
|
|
|
timeout: 10_000,
|
2026-07-16 06:19:58 -04:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2026-09-10 10:49:41 +00:00
|
|
|
test('opens the task detail panel when a task card is clicked', async ({ page }) => {
|
2026-08-10 08:53:18 +00:00
|
|
|
// Make sure a task exists before trying to open it.
|
|
|
|
|
if (!(await page.getByText(testTasks.title, { exact: true }).isVisible().catch(() => false))) {
|
|
|
|
|
await page.getByRole('button', { name: /new task/i }).click();
|
|
|
|
|
const dialog = page.getByRole('dialog');
|
|
|
|
|
await dialog.getByLabel('Title').fill(testTasks.title);
|
|
|
|
|
await dialog.getByRole('button', { name: /create task/i }).click();
|
|
|
|
|
await expect(page.getByText(testTasks.title, { exact: true })).toBeVisible({ timeout: 10_000 });
|
|
|
|
|
}
|
2026-07-16 06:19:58 -04:00
|
|
|
|
2026-08-10 08:53:18 +00:00
|
|
|
await page.getByText(testTasks.title, { exact: true }).first().click();
|
2026-07-16 06:19:58 -04:00
|
|
|
|
2026-09-10 10:49:41 +00:00
|
|
|
// Clicking a card opens the slide-over detail panel.
|
|
|
|
|
await expect(page.getByText('Task details')).toBeVisible({ timeout: 10_000 });
|
|
|
|
|
|
|
|
|
|
// The panel offers a link to the full detail page.
|
|
|
|
|
await page.getByRole('button', { name: /open full page/i }).click();
|
2026-08-10 08:53:18 +00:00
|
|
|
await page.waitForURL('**/tasks/*', { timeout: 10_000 });
|
2026-07-16 06:19:58 -04:00
|
|
|
|
2026-08-10 08:53:18 +00:00
|
|
|
// The detail page renders the task title as a heading.
|
|
|
|
|
await expect(
|
|
|
|
|
page.getByRole('heading', { name: testTasks.title, level: 3 }),
|
|
|
|
|
).toBeVisible({ timeout: 10_000 });
|
2026-07-16 06:19:58 -04:00
|
|
|
});
|
|
|
|
|
|
2026-09-10 10:49:41 +00:00
|
|
|
test('switches between board, list, and calendar views', async ({ page }) => {
|
2026-08-10 08:53:18 +00:00
|
|
|
await page.getByRole('tab', { name: /list view/i }).click();
|
|
|
|
|
await expect(page.getByRole('columnheader', { name: 'Title' })).toBeVisible();
|
2026-07-16 06:19:58 -04:00
|
|
|
|
2026-09-10 10:49:41 +00:00
|
|
|
await page.getByRole('tab', { name: /calendar view/i }).click();
|
|
|
|
|
await expect(page.getByText(/today/i).first()).toBeVisible();
|
|
|
|
|
|
2026-08-10 08:53:18 +00:00
|
|
|
await page.getByRole('tab', { name: /board view/i }).click();
|
|
|
|
|
await expect(page.getByRole('heading', { name: 'Todo' })).toBeVisible();
|
2026-07-16 06:19:58 -04:00
|
|
|
});
|
|
|
|
|
});
|