Some checks failed
Deploy Web Apps / deploy (push) Has been cancelled
Queue Release Build / prepare (push) Successful in 21s
Queue Release Build / build-linux (push) Successful in 27m44s
Queue Release Build / build-windows (push) Successful in 32m16s
Queue Release Build / finalize (push) Successful in 1m54s
176 lines
5.4 KiB
Markdown
176 lines
5.4 KiB
Markdown
# Project Setup — Playwright E2E for MetoYou
|
|
|
|
Before creating any tests or changing them read AGENTS.md for a understanding how the application works.
|
|
|
|
## First-Time Scaffold
|
|
|
|
### 1. Install Dependencies
|
|
|
|
From the **repository root**:
|
|
|
|
```bash
|
|
npm install -D @playwright/test
|
|
npx playwright install --with-deps chromium
|
|
```
|
|
|
|
Only Chromium is needed — WebRTC fake media flags are Chromium-only. Add Firefox/WebKit later if needed for non-WebRTC tests.
|
|
|
|
### 2. Create Directory Structure
|
|
|
|
```bash
|
|
mkdir -p e2e/{tests/{auth,chat,voice,settings},fixtures,pages,helpers}
|
|
```
|
|
|
|
### 3. Create Config
|
|
|
|
Create `e2e/playwright.config.ts`:
|
|
|
|
```typescript
|
|
import { defineConfig, devices } from '@playwright/test';
|
|
|
|
export default defineConfig({
|
|
testDir: './tests',
|
|
timeout: 60_000,
|
|
expect: { timeout: 10_000 },
|
|
retries: process.env.CI ? 2 : 0,
|
|
workers: 1,
|
|
reporter: [['html', { outputFolder: '../test-results/html-report' }], ['list']],
|
|
outputDir: '../test-results/artifacts',
|
|
use: {
|
|
baseURL: 'http://localhost:4200',
|
|
trace: 'on-first-retry',
|
|
screenshot: 'only-on-failure',
|
|
video: 'on-first-retry',
|
|
permissions: ['microphone', 'camera'],
|
|
},
|
|
projects: [
|
|
{
|
|
name: 'chromium',
|
|
use: {
|
|
...devices['Desktop Chrome'],
|
|
launchOptions: {
|
|
args: [
|
|
'--use-fake-device-for-media-stream',
|
|
'--use-fake-ui-for-media-stream',
|
|
],
|
|
},
|
|
},
|
|
},
|
|
],
|
|
webServer: [
|
|
{
|
|
command: 'cd ../server && npm run dev',
|
|
port: 3001,
|
|
reuseExistingServer: !process.env.CI,
|
|
timeout: 30_000,
|
|
},
|
|
{
|
|
command: 'cd ../toju-app && npx ng serve',
|
|
port: 4200,
|
|
reuseExistingServer: !process.env.CI,
|
|
timeout: 60_000,
|
|
},
|
|
],
|
|
});
|
|
```
|
|
|
|
### 4. Create Base Fixture
|
|
|
|
Create `e2e/fixtures/base.ts`:
|
|
|
|
```typescript
|
|
import { test as base } from '@playwright/test';
|
|
|
|
export const test = base.extend({
|
|
// Add common fixtures here as the test suite grows
|
|
// Examples: authenticated page, test data seeding, etc.
|
|
});
|
|
|
|
export { expect } from '@playwright/test';
|
|
```
|
|
|
|
### 5. Create Multi-Client Fixture
|
|
|
|
Create `e2e/fixtures/multi-client.ts` — see [multi-client-webrtc.md](./multi-client-webrtc.md) for the full fixture code.
|
|
|
|
### 6. Create WebRTC Helpers
|
|
|
|
Create `e2e/helpers/webrtc-helpers.ts` — see [multi-client-webrtc.md](./multi-client-webrtc.md) for helper functions.
|
|
|
|
### 7. Create Isolated Test Server Launcher
|
|
|
|
The app requires a signal server. Tests use an isolated instance with its own temporary database so test data never pollutes the dev environment.
|
|
|
|
Create `e2e/helpers/start-test-server.js` — a Node.js script that:
|
|
1. Creates a temp directory under the OS tmpdir
|
|
2. Writes a `data/variables.json` with `serverPort: 3099`, `serverProtocol: "http"`
|
|
3. Spawns `ts-node server/src/index.ts` with `cwd` set to the temp dir
|
|
4. Cleans up the temp dir on exit
|
|
|
|
The server's `getRuntimeBaseDir()` returns `process.cwd()`, so setting cwd to the temp dir makes the database go to `<tmpdir>/data/metoyou.sqlite`. Module resolution (`require`/`import`) uses `__dirname`, so server source and `node_modules` resolve correctly from the real `server/` directory.
|
|
|
|
Playwright's `webServer` config calls this script and waits for port 3099 to be ready.
|
|
|
|
### 8. Create Test Endpoint Seeder
|
|
|
|
The Angular app reads signal endpoints from `localStorage['metoyou_server_endpoints']`. By default it falls back to production URLs in `environment.ts`. For tests, seed localStorage with a single endpoint pointing at `http://localhost:3099`.
|
|
|
|
Create `e2e/helpers/seed-test-endpoint.ts` — called automatically by the multi-client fixture after creating each browser context. The flow is:
|
|
1. Navigate to `/` (establishes the origin for localStorage)
|
|
2. Set `metoyou_server_endpoints` to `[{ id: 'e2e-test-server', url: 'http://localhost:3099', ... }]`
|
|
3. Set `metoyou_removed_default_server_keys` to suppress production endpoints
|
|
4. Reload the page so the app picks up the test endpoint
|
|
|
|
### 9. Add npm Scripts
|
|
|
|
Add to root `package.json`:
|
|
|
|
```json
|
|
{
|
|
"scripts": {
|
|
"test:e2e": "cd e2e && npx playwright test",
|
|
"test:e2e:ui": "cd e2e && npx playwright test --ui",
|
|
"test:e2e:debug": "cd e2e && npx playwright test --debug",
|
|
"test:e2e:report": "cd e2e && npx playwright show-report ../test-results/html-report"
|
|
}
|
|
}
|
|
```
|
|
|
|
### 8. Update .gitignore
|
|
|
|
Add to `.gitignore`:
|
|
|
|
```
|
|
# Playwright
|
|
test-results/
|
|
e2e/playwright-report/
|
|
```
|
|
|
|
### 9. Generate Test Audio Fixture (Optional)
|
|
|
|
For voice tests with controlled audio input:
|
|
|
|
```bash
|
|
# Requires ffmpeg
|
|
ffmpeg -f lavfi -i "sine=frequency=440:duration=5" -ar 48000 -ac 1 e2e/fixtures/test-tone-440hz.wav
|
|
```
|
|
|
|
## Existing Dev Stack Integration
|
|
|
|
The tests assume the standard MetoYou dev stack:
|
|
|
|
- **Signaling server** at `http://localhost:3001` (via `server/npm run dev`)
|
|
- **Angular dev server** at `http://localhost:4200` (via `toju-app/npx ng serve`)
|
|
|
|
The `webServer` config in `playwright.config.ts` starts these automatically if not already running. When running `npm run dev` (full Electron stack) separately, tests will reuse the existing servers.
|
|
|
|
## Test Data Requirements
|
|
|
|
E2E tests need user accounts to log in with. Options:
|
|
|
|
1. **Seed via API** — create users in `test.beforeAll` via the server REST API
|
|
2. **Pre-seeded database** — maintain a test SQLite database with known accounts
|
|
3. **Register in test** — use the `/register` flow as a setup step (slower but self-contained)
|
|
|
|
Recommended: Option 3 for initial setup, migrate to Option 1 as the test suite grows.
|