tests/{unit,integration,e2e}/, at the repo root (not under frontend/,
since e2e exercises the frontend and PocketBase together) — all
against real code rather than mocks:
- unit/: Vitest (nuxt environment) — pure functions in server/utils
and shared/utils, plus components/composables via
@nuxt/test-utils/runtime's mountSuspended.
- integration/: Vitest (node environment) — @nuxt/test-utils/e2e's
setup() builds and runs the real Nitro server against a real
ephemeral PocketBase instance, exercising the actual /content/* and
/admin routes end to end.
- e2e/: Playwright, a real browser against the built app and another
ephemeral PocketBase, covering the user-facing flows (home, blog
archive, article detail incl. JSON-LD, category filter, 404s, the
/admin redirect).
The Vitest/Playwright tooling (and node_modules) stays in frontend/,
the repo's only npm project; its configs just point at ../tests/.
Playwright resolves packages from the node_modules nearest each spec
file, so `npm run test:e2e` first symlinks tests/node_modules to
frontend/node_modules (pretest:e2e, idempotent, gitignored).
tests/support/pocketbase.ts is the shared piece behind integration
and e2e: it downloads the same pinned PocketBase binary
pocketbase/Dockerfile uses, starts it against the real
pocketbase/pb_migrations/ (not a copy), and seeds it from
tests/support/fixtures.ts — so these tests run against the exact
schema and API rules that ship to production, catching the class of
bug that only shows up when PocketBase actually enforces them (e.g. a
wrong filter/fields query string silently returning nothing, or too
much).
CLAUDE.md and docs/frontend.md document the new npm scripts and the
single-test commands for each layer.
39 lines
1.1 KiB
JSON
39 lines
1.1 KiB
JSON
{
|
|
"name": "frontend",
|
|
"type": "module",
|
|
"private": true,
|
|
"scripts": {
|
|
"build": "nuxt build",
|
|
"dev": "nuxt dev",
|
|
"generate": "nuxt generate",
|
|
"preview": "nuxt preview",
|
|
"postinstall": "nuxt prepare",
|
|
"typecheck": "nuxt typecheck",
|
|
"lint": "eslint .",
|
|
"test:unit": "vitest run --config vitest.unit.config.ts",
|
|
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
"pretest:e2e": "ln -sfn ../frontend/node_modules ../tests/node_modules",
|
|
"test:e2e": "playwright test",
|
|
"test": "npm run test:unit && npm run test:integration && npm run test:e2e"
|
|
},
|
|
"dependencies": {
|
|
"marked": "^18.0.11",
|
|
"nuxt": "^4.5.2",
|
|
"simple-icons": "^16.28.0",
|
|
"vue": "^3.5.41",
|
|
"vue-router": "^5.2.0"
|
|
},
|
|
"devDependencies": {
|
|
"@nuxt/eslint": "^1.17.0",
|
|
"@nuxt/test-utils": "^4.3.2",
|
|
"@playwright/test": "^1.63.0",
|
|
"@vitest/coverage-v8": "^5.0.0",
|
|
"@vue/test-utils": "^2.5.0",
|
|
"eslint": "^10.10.0",
|
|
"happy-dom": "^20.14.3",
|
|
"typescript": "^5.9.3",
|
|
"vitest": "^5.0.0",
|
|
"vue-tsc": "^3.3.11"
|
|
}
|
|
}
|