From 34ef41c96f6f2e360b15b77379357819a4efdb06 Mon Sep 17 00:00:00 2001 From: iven Date: Fri, 10 Apr 2026 21:38:34 +0800 Subject: [PATCH] =?UTF-8?q?fix(test):=20P1-02=20browser=20chat=20=E2=80=94?= =?UTF-8?q?=20add=20SaaS=20auth=20fixture=20for=20non-Tauri=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause: Playwright external Chromium is not a Tauri runtime, so isTauriRuntime() returns false. The app needs SaaS session to route chat through relay, but tests never logged in. Fix: Auto-detect non-Tauri mode and pre-login via SaaS API, injecting session into localStorage before tests run. --- desktop/tests/e2e/specs/smoke_chat.spec.ts | 43 +++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/desktop/tests/e2e/specs/smoke_chat.spec.ts b/desktop/tests/e2e/specs/smoke_chat.spec.ts index 8d3e9bb..c3a402f 100644 --- a/desktop/tests/e2e/specs/smoke_chat.spec.ts +++ b/desktop/tests/e2e/specs/smoke_chat.spec.ts @@ -6,12 +6,53 @@ * * 前提条件: * - Desktop App 运行在 http://localhost:1420 (pnpm tauri dev) + * - SaaS Server 运行在 http://localhost:8080 (浏览器模式需要) * - 后端服务可用 (SaaS 或 Kernel) * * 运行: cd desktop && npx playwright test smoke_chat */ -import { test, expect, type Page } from '@playwright/test'; +import { test as base, expect, type Page } from '@playwright/test'; + +const SaaS_BASE = 'http://localhost:8080/api/v1'; +const ADMIN_USER = 'admin'; +const ADMIN_PASS = 'admin123'; + +// Extend test with SaaS login fixture for browser-mode tests +const test = base.extend<{ + saasAuthenticated: void; +}>({ + saasAuthenticated: [async ({ page }, use) => { + // Check if running in Tauri — if so, no SaaS login needed + const isTauri = await page.evaluate(() => !!(window as any).__TAURI_INTERNALS__).catch(() => false); + + if (!isTauri) { + // Browser mode: need SaaS session before chat can work + // Login via SaaS API and store session in localStorage + try { + const loginRes = await page.request.post(`${SaaS_BASE}/auth/login`, { + data: { username: ADMIN_USER, password: ADMIN_PASS }, + }); + if (loginRes.ok()) { + const loginJson = await loginRes.json(); + // Inject SaaS session into localStorage so the app can connect + await page.evaluate((session) => { + localStorage.setItem('zclaw-saas-session', JSON.stringify({ + saasUrl: 'http://localhost:8080', + token: session.token, + account: session.account, + })); + }, loginJson); + } else { + console.log(`SaaS login failed (${loginRes.status()}), browser chat may not work`); + } + } catch (e) { + console.log('SaaS server not reachable, browser chat will not work:', (e as Error).message); + } + } + await use(); + }, { auto: true }], +}); test.setTimeout(120000);