diff --git a/backend/package-lock.json b/backend/package-lock.json index fafb01e..f3e6fe3 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -15,6 +15,26 @@ "jsonwebtoken": "^9.0.3", "mysql2": "^3.18.2", "zod": "^4.3.6" + }, + "devDependencies": { + "@playwright/test": "^1.58.2", + "playwright": "^1.58.2" + } + }, + "node_modules/@playwright/test": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", + "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" } }, "node_modules/@types/node": { @@ -378,6 +398,21 @@ "node": ">= 0.8" } }, + "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/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -794,6 +829,38 @@ "url": "https://opencollective.com/express" } }, + "node_modules/playwright": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", diff --git a/backend/package.json b/backend/package.json index fb1a3c5..af10e91 100644 --- a/backend/package.json +++ b/backend/package.json @@ -10,7 +10,8 @@ "dev": "node --watch src/server.js", "db:init": "node src/db/init.js", "db:seed": "node src/db/seed.js", - "test:smoke": "node scripts/smoke-test.mjs" + "test:smoke": "node scripts/smoke-test.mjs", + "test:integration": "node scripts/integration-test.mjs" }, "keywords": [], "author": "", @@ -23,5 +24,9 @@ "jsonwebtoken": "^9.0.3", "mysql2": "^3.18.2", "zod": "^4.3.6" + }, + "devDependencies": { + "@playwright/test": "^1.58.2", + "playwright": "^1.58.2" } } diff --git a/backend/playwright.config.js b/backend/playwright.config.js new file mode 100644 index 0000000..35e3964 --- /dev/null +++ b/backend/playwright.config.js @@ -0,0 +1,25 @@ +const { devices } = require('@playwright/test'); + +/** @type {import('@playwright/test').PlaywrightTestConfig} */ +const config = { + testDir: './scripts', + timeout: 30000, + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: 'html', + use: { + actionTimeout: 0, + baseURL: 'http://localhost:3000', + trace: 'on-first-retry', + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}; + +module.exports = config; \ No newline at end of file diff --git a/backend/scripts/integration-test.mjs b/backend/scripts/integration-test.mjs new file mode 100644 index 0000000..25b652c --- /dev/null +++ b/backend/scripts/integration-test.mjs @@ -0,0 +1,6 @@ +import { test, expect } from '@playwright/test'; + +test('API server starts and returns 200', async ({ page }) => { + await page.goto('http://localhost:3000/api/health'); + await expect(page.status()).toBe(200); +}); \ No newline at end of file diff --git a/docs/runtime/next_actions_helpyourneighbour.md b/docs/runtime/next_actions_helpyourneighbour.md new file mode 100644 index 0000000..c3ac8a2 --- /dev/null +++ b/docs/runtime/next_actions_helpyourneighbour.md @@ -0,0 +1,2 @@ +# Auto Next Actions (helpyourneighbour) +Generated: 2026-03-05T23:29:37Z