Flow H, three screens behind a role check: find an account, work the ingestion error queue, read and export the audit log. Superadmins can change a role, never their own. The error queue merges ingest errors and dead jobs into one table with a cursor that pages both sources; only a job can be retried and only an ingest row resolved, with a note that migration 003 gives it somewhere to live. writeAudit no longer defaults a missing subject to the actor, which had been recording a user search as staff looking themselves up. Omitting the subject still means acting on yourself; null now means the action has no subject, which is what a search, a retry and an export are. Reading the log is not audited. Exporting it is: a copy leaving the building is a different act from looking. e2e/global-setup.ts asks for every screen once before the suite starts, so a dev server's first-request compile is paid before the first test rather than by it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
27 lines
1.1 KiB
TypeScript
27 lines
1.1 KiB
TypeScript
import { defineConfig, devices } from '@playwright/test';
|
|
|
|
/**
|
|
* Runs against a running stack rather than starting one, so the same specs cover the
|
|
* compose stack and a local `pnpm dev`. Point E2E_BASE_URL at whichever you are using.
|
|
*
|
|
* The host matters as much as the port: better-auth checks the request Origin against
|
|
* APP_PUBLIC_URL, and http://localhost and http://127.0.0.1 are different origins. This
|
|
* default matches apps/web/.env.example PORT and apps/api/.env.example APP_PUBLIC_URL.
|
|
*/
|
|
const baseURL = process.env['E2E_BASE_URL'] ?? 'http://localhost:3005';
|
|
|
|
export default defineConfig({
|
|
testDir: './e2e',
|
|
fullyParallel: true,
|
|
forbidOnly: Boolean(process.env['CI']),
|
|
retries: process.env['CI'] ? 2 : 0,
|
|
reporter: process.env['CI'] ? 'github' : 'list',
|
|
// Compiles every screen before the first test asks for one. See the file for why.
|
|
globalSetup: './e2e/global-setup.ts',
|
|
use: { baseURL, trace: 'on-first-retry' },
|
|
projects: [
|
|
{ name: 'mobile', use: { ...devices['Pixel 7'] } },
|
|
{ name: 'desktop', use: { ...devices['Desktop Chrome'] } },
|
|
],
|
|
});
|