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,37 @@
|
||||
import type { Page } from '@playwright/test';
|
||||
import { TEST_USER } from './fixtures';
|
||||
|
||||
/**
|
||||
* Log the test user in via the login page.
|
||||
*
|
||||
* This hits the real UI flow (fill form → submit) so the auth cookie is
|
||||
* set exactly as a real user would experience it.
|
||||
*/
|
||||
export async function login(
|
||||
page: Page,
|
||||
overrides?: { email?: string; password?: string },
|
||||
) {
|
||||
const { email, password } = { ...TEST_USER, ...overrides };
|
||||
|
||||
await page.goto('/login');
|
||||
await page.getByLabel('Email').fill(email);
|
||||
await page.getByLabel('Password').fill(password);
|
||||
await page.getByRole('button', { name: /sign in/i }).click();
|
||||
|
||||
// Wait for navigation away from login page
|
||||
await page.waitForURL('**/dashboard', { timeout: 15_000 });
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure the user is logged out by clearing cookies.
|
||||
*/
|
||||
export async function logout(page: Page) {
|
||||
await page.context().clearCookies();
|
||||
}
|
||||
|
||||
/**
|
||||
* Navigate to the login page.
|
||||
*/
|
||||
export async function goToLogin(page: Page) {
|
||||
await page.goto('/login');
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
import type { Page } from '@playwright/test';
|
||||
|
||||
/** Test user credentials – matches PocketBase seed data or test fixtures. */
|
||||
export const TEST_USER = {
|
||||
email: 'test@example.com',
|
||||
password: 'testpassword123',
|
||||
};
|
||||
|
||||
/** Fake credentials that should always fail login. */
|
||||
export const INVALID_USER = {
|
||||
email: 'nonexistent@example.com',
|
||||
password: 'wrongpassword',
|
||||
};
|
||||
|
||||
/** Unique timestamp suffix to avoid collisions in concurrent test runs. */
|
||||
const ts = Date.now();
|
||||
|
||||
export const testTasks = {
|
||||
title: `E2E Test Task ${ts}`,
|
||||
editedTitle: `E2E Test Task Edited ${ts}`,
|
||||
description: 'This task was created by the E2E test suite.',
|
||||
domain: 'personal',
|
||||
priority: 'high' as const,
|
||||
};
|
||||
|
||||
export const testHabits = {
|
||||
name: `E2E Test Habit ${ts}`,
|
||||
description: 'A habit created by the E2E test suite.',
|
||||
};
|
||||
|
||||
export const testProjects = {
|
||||
name: `E2E Test Project ${ts}`,
|
||||
description: 'A project created by the E2E test suite.',
|
||||
};
|
||||
|
||||
export const testNotes = {
|
||||
title: `E2E Test Note ${ts}`,
|
||||
content: 'This note was created by the E2E test suite.',
|
||||
domain: 'personal',
|
||||
};
|
||||
|
||||
export const testReports = {
|
||||
title: `E2E Test Report ${ts}`,
|
||||
content: 'This report was created by the E2E test suite.',
|
||||
};
|
||||
|
||||
export const testDomains = {
|
||||
name: `e2e-domain-${ts}`,
|
||||
};
|
||||
Reference in New Issue
Block a user