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.
48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
/** Shared seed data for integration and e2e tests against a real ephemeral PocketBase. */
|
|
|
|
export interface FixtureCategory {
|
|
name: string
|
|
slug: string
|
|
}
|
|
|
|
export interface FixtureArticle {
|
|
title: string
|
|
slug: string
|
|
content: string
|
|
category: string
|
|
/** `null` = draft (never returned by the public API). */
|
|
publishedAt: string | null
|
|
authorName?: string
|
|
}
|
|
|
|
export const FIXTURE_CATEGORIES: FixtureCategory[] = [
|
|
{ name: 'Economia', slug: 'economia' },
|
|
{ name: 'Attualità', slug: 'attualita' },
|
|
]
|
|
|
|
export const FIXTURE_ARTICLES: FixtureArticle[] = [
|
|
{
|
|
title: 'Articolo pubblicato',
|
|
slug: 'articolo-pubblicato',
|
|
content: '# Titolo\n\nCorpo **markdown** di prova con [un link](https://example.com).',
|
|
category: 'economia',
|
|
publishedAt: '2025-01-15 10:00:00',
|
|
authorName: 'Redazione',
|
|
},
|
|
{
|
|
title: 'Articolo in bozza',
|
|
slug: 'articolo-bozza',
|
|
content: 'Contenuto non ancora pubblicato.',
|
|
category: 'economia',
|
|
publishedAt: null,
|
|
},
|
|
{
|
|
title: 'Secondo articolo pubblicato',
|
|
slug: 'secondo-articolo',
|
|
content: 'Un altro articolo pubblicato, in un\'altra categoria.',
|
|
category: 'attualita',
|
|
publishedAt: '2025-02-01 08:00:00',
|
|
authorName: 'Redazione',
|
|
},
|
|
]
|