Files
Oxicloud/tests/e2e/spa/coverage-helpers.ts
T
2026-08-09 13:10:09 +02:00

52 lines
2.0 KiB
TypeScript

import * as fs from 'fs';
import * as path from 'path';
import { Page, expect } from '@playwright/test';
import { test as base, TEST_ADMIN } from './helpers';
/**
* `test` for the SvelteKit SPA coverage suite. Extends the shared `test`
* (JS-error guard + container/stack support) with an auto fixture that, after
* every test, reads the Istanbul `window.__coverage__` accumulated by the
* instrumented build and appends it to `.nyc_output/` for an nyc report.
*
* Import `test`/`expect` from here in every `spa/*.spec.ts`.
*/
const NYC_DIR = path.join(__dirname, '..', '.nyc_output');
export const test = base.extend<{ collectCoverage: void }>({
collectCoverage: [
async ({ page }, use, testInfo) => {
await use();
// The instrumented bundle accumulates into window.__coverage__ across
// SPA navigations; read it once at test end. May be undefined if the
// page never loaded the app (pure-API test) — skip those.
const coverage = await page
.evaluate(() => (window as unknown as { __coverage__?: unknown }).__coverage__)
.catch(() => undefined);
if (coverage) {
const file = path.join(
NYC_DIR,
`coverage-${testInfo.workerIndex}-${testInfo.testId}.json`,
);
fs.writeFileSync(file, JSON.stringify(coverage));
}
},
{ auto: true },
],
});
export { expect, TEST_ADMIN };
/**
* Sign in through the SvelteKit login UI and wait until the app shell is
* mounted. Uses stable `data-testid` selectors (kept in VITE_E2E builds).
*/
export async function uiLogin(page: Page, admin = TEST_ADMIN): Promise<void> {
await page.goto('/login');
await page.getByTestId('login-username-input').fill(admin.username);
await page.getByTestId('login-password-input').fill(admin.password);
await page.getByTestId('login-submit-btn').click();
await page.waitForURL('**/files**', { timeout: 15_000 });
await expect(page.getByTestId('appshell-logo-link')).toBeVisible({ timeout: 15_000 });
}