test: add mvp verification plan
This commit is contained in:
@@ -9,3 +9,11 @@ docker compose -f infra/docker-compose.yml up -d
|
||||
Set-Location backend
|
||||
go run ./cmd/api
|
||||
```
|
||||
|
||||
## Frontend
|
||||
|
||||
The web client uses Svelte and TypeScript only. The login shell lets users enter a server IP address or domain name, which is saved as the API base URL.
|
||||
|
||||
## Verification
|
||||
|
||||
See `docs/mvp-verification.md` for backend, web, desktop, PostgreSQL, and manual MVP verification steps.
|
||||
|
||||
9
apps/web/e2e/project-workbench.spec.ts
Normal file
9
apps/web/e2e/project-workbench.spec.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { expect, test } from '@playwright/test';
|
||||
|
||||
test('project workbench shell renders', async ({ page }) => {
|
||||
await page.goto('/');
|
||||
await expect(page.getByText('项目工作台')).toBeVisible();
|
||||
await expect(page.getByLabel('服务器登录')).toBeVisible();
|
||||
await expect(page.getByLabel('服务器 IP 或域名')).toBeVisible();
|
||||
await expect(page.getByLabel('项目总览')).toBeVisible();
|
||||
});
|
||||
64
apps/web/package-lock.json
generated
64
apps/web/package-lock.json
generated
@@ -12,6 +12,7 @@
|
||||
"svelte": "^5.42.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "^1.61.1",
|
||||
"@testing-library/jest-dom": "^6.9.1",
|
||||
"@testing-library/svelte": "^5.2.9",
|
||||
"@tsconfig/svelte": "^5.0.5",
|
||||
@@ -724,6 +725,22 @@
|
||||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||
}
|
||||
},
|
||||
"node_modules/@playwright/test": {
|
||||
"version": "1.61.1",
|
||||
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.61.1.tgz",
|
||||
"integrity": "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"playwright": "1.61.1"
|
||||
},
|
||||
"bin": {
|
||||
"playwright": "cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@rollup/rollup-android-arm-eabi": {
|
||||
"version": "4.62.2",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz",
|
||||
@@ -2000,6 +2017,53 @@
|
||||
"url": "https://github.com/sponsors/jonschlinkert"
|
||||
}
|
||||
},
|
||||
"node_modules/playwright": {
|
||||
"version": "1.61.1",
|
||||
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz",
|
||||
"integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"playwright-core": "1.61.1"
|
||||
},
|
||||
"bin": {
|
||||
"playwright": "cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"fsevents": "2.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/playwright-core": {
|
||||
"version": "1.61.1",
|
||||
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz",
|
||||
"integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==",
|
||||
"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.19",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz",
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
"svelte": "^5.42.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "^1.61.1",
|
||||
"@testing-library/jest-dom": "^6.9.1",
|
||||
"@testing-library/svelte": "^5.2.9",
|
||||
"@tsconfig/svelte": "^5.0.5",
|
||||
|
||||
20
apps/web/playwright.config.ts
Normal file
20
apps/web/playwright.config.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import { defineConfig, devices } from '@playwright/test';
|
||||
|
||||
export default defineConfig({
|
||||
testDir: './e2e',
|
||||
webServer: {
|
||||
command: 'npm run dev -- --host 127.0.0.1',
|
||||
url: 'http://127.0.0.1:5173',
|
||||
reuseExistingServer: !process.env.CI,
|
||||
},
|
||||
use: {
|
||||
baseURL: 'http://127.0.0.1:5173',
|
||||
trace: 'on-first-retry',
|
||||
},
|
||||
projects: [
|
||||
{
|
||||
name: 'chromium',
|
||||
use: { ...devices['Desktop Chrome'] },
|
||||
},
|
||||
],
|
||||
});
|
||||
@@ -1,5 +1,6 @@
|
||||
import './index.css';
|
||||
import App from './app/App.svelte';
|
||||
import { mount } from 'svelte';
|
||||
|
||||
const target = document.getElementById('app');
|
||||
|
||||
@@ -7,4 +8,4 @@ if (!target) {
|
||||
throw new Error('Missing #app mount target');
|
||||
}
|
||||
|
||||
new App({ target });
|
||||
mount(App, { target });
|
||||
|
||||
4
apps/web/test-results/.last-run.json
Normal file
4
apps/web/test-results/.last-run.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"status": "passed",
|
||||
"failedTests": []
|
||||
}
|
||||
@@ -8,6 +8,7 @@ export default defineConfig({
|
||||
},
|
||||
test: {
|
||||
environment: 'jsdom',
|
||||
exclude: ['node_modules/**', 'dist/**', 'e2e/**'],
|
||||
globals: true,
|
||||
},
|
||||
});
|
||||
|
||||
64
docs/mvp-verification.md
Normal file
64
docs/mvp-verification.md
Normal file
@@ -0,0 +1,64 @@
|
||||
# MVP Verification
|
||||
|
||||
## Backend
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
Set-Location backend
|
||||
go test ./... -v
|
||||
```
|
||||
|
||||
Expected: all backend tests pass.
|
||||
|
||||
## PostgreSQL Integration
|
||||
|
||||
Use this test database URL when live PostgreSQL verification is required:
|
||||
|
||||
```text
|
||||
postgres://postgres:Weidong2023~!@8.137.107.29:19432/agent_dev?sslmode=disable
|
||||
```
|
||||
|
||||
Do not hardcode this value into application source files. Pass it through `DATABASE_URL`.
|
||||
|
||||
## Web
|
||||
|
||||
The frontend is Svelte-only.
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
Set-Location apps/web
|
||||
npm test -- --run
|
||||
npm run build
|
||||
npx playwright test
|
||||
```
|
||||
|
||||
Expected: component tests, production build, and smoke test pass.
|
||||
|
||||
## Desktop
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
Set-Location apps/web
|
||||
npm run build
|
||||
Set-Location ../desktop
|
||||
npm run build
|
||||
```
|
||||
|
||||
Expected: Tauri desktop bundle builds when Rust/Cargo is installed. On this machine, verification currently fails before compilation because `cargo` is not available in PATH.
|
||||
|
||||
## Manual MVP Flow
|
||||
|
||||
1. Open the client and enter the server IP or domain on the login screen.
|
||||
2. Create or log in as a private-deployment user.
|
||||
3. Create a project.
|
||||
4. Add text to project inbox.
|
||||
5. Click Analyze/Organize.
|
||||
6. Confirm one task and one note from the suggestion list.
|
||||
7. Assign the task to another system user.
|
||||
8. Explicitly share one note with the task.
|
||||
9. Search for text from the note body in global search.
|
||||
10. Open an AI session under the project and reference the note.
|
||||
11. Use Tauri quick capture to send text into the active project inbox.
|
||||
Reference in New Issue
Block a user