mirror of
https://gitee.com/pnoker/iot-dc3.git
synced 2026-10-31 10:11:49 +08:00
Land the v7 three-terminal UX decision: drop the width/pointer-based 44px touch enlargement so one 32px density holds across desktop, tablet, and mobile, and rebuild entity pages on a responsive record list (ResponsiveRecordList + EntityMobileCard + per-entity mobile summaries). Tighten the nginx security headers (CSP frame-ancestors 'none', X-Frame-Options DENY) to match the static e2e server. Complete the dc3-web audit remediation, including the remaining LOW items from docs/dc3-web-low-defects-handoff.md: streaming-safe message loads in the agentic store, mock menu reparent cycle rejection, paged-list page clamping, fetch/axios mock request normalization, per-table attribute catalogs, post-flush alarm watchers, rowKey-agnostic delete state, localized card text fallbacks, and e2e-server port fail-fast. Gate: vue-tsc, eslint, vitest 687 passed, responsive e2e 64 passed. Co-Authored-By: Claude Code <noreply@anthropic.com>
97 lines
3.0 KiB
TypeScript
97 lines
3.0 KiB
TypeScript
/*
|
|
* Copyright 2016-present the IoT DC3 original author or authors.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as
|
|
* published by the Free Software Foundation, either version 3 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
import {defineConfig, devices} from '@playwright/test';
|
|
|
|
const baseURL = process.env.E2E_BASE_URL || 'http://127.0.0.1:4174';
|
|
const startServer = process.env.E2E_START_SERVER !== '0';
|
|
const serverCommand = process.env.E2E_SERVER_MODE === 'mock' ? 'pnpm run serve:e2e:mock' : 'pnpm run serve:e2e';
|
|
const workers = Number(process.env.E2E_WORKERS || 1);
|
|
|
|
export default defineConfig({
|
|
testDir: './tests/e2e/specs',
|
|
timeout: 60_000,
|
|
expect: {
|
|
timeout: 10_000,
|
|
},
|
|
fullyParallel: false,
|
|
forbidOnly: Boolean(process.env.CI),
|
|
retries: process.env.CI ? 2 : 0,
|
|
workers,
|
|
reporter: [
|
|
['list'],
|
|
['html', {open: 'never', outputFolder: 'playwright-report'}],
|
|
['json', {outputFile: 'test-results/e2e-results.json'}],
|
|
],
|
|
use: {
|
|
baseURL,
|
|
headless: process.env.E2E_HEADLESS !== 'false',
|
|
trace: 'retain-on-failure',
|
|
screenshot: 'only-on-failure',
|
|
video: 'retain-on-failure',
|
|
actionTimeout: 15_000,
|
|
navigationTimeout: 30_000,
|
|
},
|
|
webServer: startServer
|
|
? {
|
|
command: serverCommand,
|
|
url: baseURL,
|
|
reuseExistingServer: false,
|
|
timeout: 120_000,
|
|
}
|
|
: undefined,
|
|
projects: [
|
|
// Canonical desktop suite (existing).
|
|
{
|
|
name: 'chromium',
|
|
use: {...devices['Desktop Chrome']},
|
|
},
|
|
// Three-terminal gate (docs/design/frontend-three-terminal-ux.md,
|
|
// A2/A3): the same specs must hold on desktop, tablet, and mobile.
|
|
// Gate specs live in tests/e2e/specs/responsive.spec.ts; the
|
|
// overflow + shell assertions run under all three viewports.
|
|
{
|
|
name: 'chromium-desktop',
|
|
use: {...devices['Desktop Chrome'], viewport: {width: 1440, height: 900}},
|
|
},
|
|
{
|
|
name: 'chromium-tablet',
|
|
// Explicitly chromium: the iPad device preset would switch to
|
|
// webkit. Touch semantics (hasTouch) still apply to match a real
|
|
// tablet primary pointer.
|
|
use: {
|
|
browserName: 'chromium',
|
|
viewport: {width: 834, height: 1112},
|
|
deviceScaleFactor: 2,
|
|
hasTouch: true,
|
|
isMobile: false,
|
|
},
|
|
},
|
|
{
|
|
name: 'chromium-mobile',
|
|
use: {
|
|
browserName: 'chromium',
|
|
viewport: {width: 393, height: 851},
|
|
deviceScaleFactor: 2.75,
|
|
hasTouch: true,
|
|
isMobile: true,
|
|
},
|
|
},
|
|
],
|
|
outputDir: 'test-results/e2e-artifacts',
|
|
});
|