Implements robust testing setup with Playwright global auth, reusable test helpers, Docker support, and CI/CD integration with Gitea Actions. ## Changes ### Playwright Setup - Add global auth setup with storage state reuse (tests/playwright/auth.setup.ts) - Fix auth setup to clear existing state before fresh login - Create reusable performOAuthLogin helper (tests/playwright/helpers.ts) - Configure dotenv loading for environment variables in playwright.config.ts ### Magnitude Configuration - Update to use Claude Sonnet 4.5 (claude-sonnet-4-5-20250514) - Create reusable loginFlow helper (tests/magnitude/helpers.ts) - Fix smoke test to check login page instead of non-existent homepage ### Docker Support - Add Dockerfile.playwright with non-root user (pwuser) for security - Uses official Playwright Docker image (mcr.microsoft.com/playwright:v1.49.1-noble) - Provides consistent testing environment across users and CI/CD ### CI/CD Integration - Add Gitea Actions workflow (.gitea/workflows/magnitude.yml) - Runs Magnitude tests on every push and PR - Starts SurrealDB and Next.js dev server automatically - Uploads test results as artifacts (30-day retention) ### Documentation - Add comprehensive testing setup docs to AGENTS.md: - Playwright Docker setup instructions - CI/CD with Gitea Actions - Testing framework separation (Playwright vs Magnitude) - Required secrets for CI/CD ### Testing Best Practices - Separate Playwright (manual + global auth) from Magnitude (automated E2E) - Reusable helpers reduce code duplication - Both frameworks work independently ## Testing - ✅ Playwright auth setup test passes (5.6s) - ✅ Magnitude smoke test passes - ✅ OAuth flow works correctly with helper function 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
60 lines
1.8 KiB
TypeScript
60 lines
1.8 KiB
TypeScript
/**
|
|
* Reusable test helpers for Magnitude tests
|
|
*
|
|
* These helpers encapsulate common test patterns to reduce code duplication
|
|
* and make tests more maintainable.
|
|
*/
|
|
|
|
const TEST_HANDLE = process.env.TEST_BLUESKY_HANDLE;
|
|
const TEST_PASSWORD = process.env.TEST_BLUESKY_PASSWORD;
|
|
|
|
if (!TEST_HANDLE || !TEST_PASSWORD) {
|
|
throw new Error('TEST_BLUESKY_HANDLE and TEST_BLUESKY_PASSWORD must be set in .env');
|
|
}
|
|
|
|
/**
|
|
* Performs complete OAuth login flow
|
|
*
|
|
* This function navigates to the login page and completes the full OAuth flow:
|
|
* 1. Navigate to /login
|
|
* 2. Enter handle and click "Log in with Bluesky"
|
|
* 3. Wait for redirect to Bluesky OAuth page
|
|
* 4. Enter password and click "Sign in"
|
|
* 5. Click "Authorize" button
|
|
* 6. Wait for redirect to /chat
|
|
*
|
|
* @param agent - The Magnitude test agent
|
|
*/
|
|
export async function loginFlow(agent: any) {
|
|
// Navigate to login page
|
|
await agent.act('Navigate to /login');
|
|
|
|
// Fill in handle and initiate OAuth
|
|
await agent.act(`Type "${TEST_HANDLE}" into the "Your Handle" input field`);
|
|
await agent.act('Click the "Log in with Bluesky" button');
|
|
|
|
// Wait for redirect to Bluesky OAuth page
|
|
await agent.check('The page URL contains "bsky.social"');
|
|
|
|
// Fill in credentials on Bluesky OAuth page
|
|
await agent.act(`Type "${TEST_HANDLE}" into the username/identifier field`);
|
|
await agent.act(`Type "${TEST_PASSWORD}" into the password field`);
|
|
|
|
// Submit login form
|
|
await agent.act('Click the submit/authorize button');
|
|
|
|
// Wait for and click authorize button
|
|
await agent.act('Click the "Authorize" button');
|
|
|
|
// Verify successful login
|
|
await agent.check('The page URL contains "/chat"');
|
|
}
|
|
|
|
/**
|
|
* Test credentials for use in tests that need them directly
|
|
*/
|
|
export const TEST_CREDENTIALS = {
|
|
handle: TEST_HANDLE,
|
|
password: TEST_PASSWORD,
|
|
} as const;
|