- Reorganize into apps/, packages/, docs/, e2e/, pocketbase/ directories - Add Dockerfiles for web, worker, and PocketBase services - Add docker-compose.yml for local orchestration - Add turbo.json for monorepo task management - Add Playwright e2e test infrastructure - Add PocketBase backend with migrations - Remove Vite/Next.js/ESLint/PostCSS config files - Update package.json with workspace dependencies - Add .env.example and .dockerignore
95 lines
3.5 KiB
TypeScript
95 lines
3.5 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import { login } from './helpers/auth';
|
|
|
|
test.describe('Calendar', () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
await login(page);
|
|
await page.goto('/calendar');
|
|
// Wait for the calendar page to load
|
|
await expect(page.getByRole('heading', { name: /calendar/i })).toBeVisible();
|
|
});
|
|
|
|
test.describe('Calendar page', () => {
|
|
test('should display calendar heading and tagline', async ({ page }) => {
|
|
await expect(page.getByRole('heading', { name: /calendar/i })).toBeVisible();
|
|
await expect(page.getByText(/your commitments, in time/i)).toBeVisible();
|
|
});
|
|
|
|
test('should show filters sidebar', async ({ page }) => {
|
|
await expect(page.getByText(/filters/i).first()).toBeVisible();
|
|
});
|
|
});
|
|
|
|
test.describe('Calendar filters', () => {
|
|
test('should show entity type filter checkboxes', async ({ page }) => {
|
|
// Tasks, Habits, Projects, Milestones checkboxes
|
|
await expect(page.getByLabel('Tasks')).toBeVisible();
|
|
await expect(page.getByLabel('Habits')).toBeVisible();
|
|
await expect(page.getByLabel('Projects')).toBeVisible();
|
|
await expect(page.getByLabel('Milestones')).toBeVisible();
|
|
});
|
|
|
|
test('should toggle entity type filters', async ({ page }) => {
|
|
const tasksCheckbox = page.getByLabel('Tasks');
|
|
const initialState = await tasksCheckbox.isChecked();
|
|
|
|
await tasksCheckbox.click();
|
|
await page.waitForTimeout(300);
|
|
|
|
// State should have toggled
|
|
const newState = await tasksCheckbox.isChecked();
|
|
expect(newState).toBe(!initialState);
|
|
});
|
|
|
|
test('should show domain filter checkboxes', async ({ page }) => {
|
|
// Domain checkboxes: personal, work, ots
|
|
await expect(page.getByLabel('personal')).toBeVisible();
|
|
await expect(page.getByLabel('work')).toBeVisible();
|
|
await expect(page.getByLabel('ots')).toBeVisible();
|
|
});
|
|
|
|
test('should toggle domain filters', async ({ page }) => {
|
|
const personalCheckbox = page.getByLabel('personal');
|
|
await personalCheckbox.click();
|
|
await page.waitForTimeout(300);
|
|
|
|
// Clear filters button should appear
|
|
await expect(page.getByRole('button', { name: /clear filters/i })).toBeVisible();
|
|
});
|
|
|
|
test('should clear all domain filters', async ({ page }) => {
|
|
// Select a domain first
|
|
await page.getByLabel('personal').click();
|
|
await page.waitForTimeout(300);
|
|
|
|
// Clear filters
|
|
await page.getByRole('button', { name: /clear filters/i }).click();
|
|
await page.waitForTimeout(300);
|
|
|
|
// Clear filters button should disappear
|
|
await expect(page.getByRole('button', { name: /clear filters/i })).not.toBeVisible();
|
|
});
|
|
});
|
|
|
|
test.describe('Calendar view', () => {
|
|
test('should render the calendar component', async ({ page }) => {
|
|
// The calendar should be visible after loading
|
|
// Wait for the lazy-loaded calendar
|
|
await page.waitForTimeout(3_000);
|
|
|
|
// Calendar should be rendered (react-big-calendar)
|
|
// We verify the container is present
|
|
const calendarContainer = page.locator('.rbc-calendar, [class*="calendar"]').first();
|
|
// Just verify the page loaded without errors
|
|
await expect(page.getByRole('heading', { name: /calendar/i })).toBeVisible();
|
|
});
|
|
});
|
|
|
|
test.describe('Calendar legend', () => {
|
|
test('should show calendar legend', async ({ page }) => {
|
|
await expect(page.getByText(/tasks show on due date/i)).toBeVisible();
|
|
await expect(page.getByText(/projects show on deadline/i)).toBeVisible();
|
|
});
|
|
});
|
|
});
|