diff --git a/.gitignore b/.gitignore index 577d560..3156228 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ data/ .env .env.local *.log +test-results/ +playwright-report/ diff --git a/package-lock.json b/package-lock.json index dff37ea..762f541 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "zod": "^3.23.8" }, "devDependencies": { + "@playwright/test": "^1.59.1", "@sveltejs/adapter-node": "^5.2.0", "@sveltejs/kit": "^2.8.0", "@sveltejs/vite-plugin-svelte": "^4.0.0", @@ -1220,6 +1221,22 @@ "node": ">=14" } }, + "node_modules/@playwright/test": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", + "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.59.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.29", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", @@ -3744,6 +3761,53 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/playwright": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", + "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.59.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", + "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/postcss": { "version": "8.5.10", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", diff --git a/package.json b/package.json index 4626755..b6d9b86 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,12 @@ "test:watch": "vitest", "lint": "eslint .", "format": "prettier --write .", - "render:icons": "node scripts/render-icons.mjs" + "render:icons": "node scripts/render-icons.mjs", + "test:e2e": "playwright test", + "test:e2e:ui": "playwright test --ui" }, "devDependencies": { + "@playwright/test": "^1.59.1", "@sveltejs/adapter-node": "^5.2.0", "@sveltejs/kit": "^2.8.0", "@sveltejs/vite-plugin-svelte": "^4.0.0", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..ff9e209 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from '@playwright/test'; + +// E2E-Tests nutzen den SvelteKit-Preview-Build. `npm run build` muss +// vor den Tests gelaufen sein — Playwright startet dann nur den +// Preview-Server (kein Dev-Server, damit der SW registrierbar ist). +export default defineConfig({ + testDir: 'tests/e2e', + fullyParallel: false, + reporter: 'list', + use: { + baseURL: 'http://localhost:4173', + headless: true, + serviceWorkers: 'allow' + }, + webServer: { + command: 'npm run preview', + url: 'http://localhost:4173', + reuseExistingServer: !process.env.CI, + timeout: 30_000 + } +}); diff --git a/tests/e2e/smoke.spec.ts b/tests/e2e/smoke.spec.ts new file mode 100644 index 0000000..0072823 --- /dev/null +++ b/tests/e2e/smoke.spec.ts @@ -0,0 +1,6 @@ +import { test, expect } from '@playwright/test'; + +test('home loads', async ({ page }) => { + await page.goto('/'); + await expect(page.locator('h1')).toContainText('Kochwas'); +});