QA: unit tests for API logic, Playwright smoke tests, pre-push check, manual QA checklist

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-08 20:11:07 +03:30
co-authored by Cursor
parent e6755d0c2e
commit 46a7693ea0
17 changed files with 827 additions and 1 deletions
+50
View File
@@ -0,0 +1,50 @@
import { defineConfig } from '@playwright/test';
import { existsSync, readFileSync } from 'node:fs';
/** e2e/.env (gitignored): E2E_USER, E2E_PASSWORD, ... */
const envFile = 'e2e/.env';
if (existsSync(envFile)) {
for (const line of readFileSync(envFile, 'utf8').split(/\r?\n/)) {
const m = line.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);
if (m && process.env[m[1]!] === undefined) process.env[m[1]!] = m[2]!.replace(/^["']|["']$/g, '');
}
}
const baseURL = process.env.E2E_BASE_URL || 'http://127.0.0.1:5173';
const isLocal = /^https?:\/\/(127\.0\.0\.1|localhost)/.test(baseURL);
export default defineConfig({
testDir: 'e2e',
timeout: 60_000,
expect: { timeout: 15_000 },
fullyParallel: false,
workers: 1,
retries: 0,
reporter: [['list'], ['html', { open: 'never' }]],
use: {
baseURL,
channel: process.env.E2E_CHANNEL || (process.platform === 'win32' ? 'msedge' : undefined),
locale: 'fa-IR',
timezoneId: 'Asia/Tehran',
viewport: { width: 1366, height: 860 },
screenshot: 'only-on-failure',
trace: 'retain-on-failure',
},
projects: [
{ name: 'setup', testMatch: /auth\.setup\.ts/ },
{
name: 'smoke',
testMatch: /.*\.spec\.ts/,
dependencies: ['setup'],
use: { storageState: 'e2e/.auth/user.json' },
},
],
webServer: isLocal
? {
command: 'npm run dev:web',
url: baseURL,
reuseExistingServer: true,
timeout: 120_000,
}
: undefined,
});