refactor: migrate to monorepo structure with Docker, PocketBase, and e2e tests
- 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
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
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();
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user