Files
app/tests/magnitude/helpers.ts
Albert 1ff9a2cf4b feat: Add comprehensive testing infrastructure
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>
2025-11-10 13:51:09 +00:00

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;