Why: phase 4 runs after the RDM phase already forced the password change, so the initial-password attempt 401s and the sidebar never renders. Evidence: phase-4 failure log shows the login form still up at the 15s .tsb-tool timeout; rdm-audit spec already carries this branch. Impact: plain-base login helper mirrors rdm-audit's gate-aware login. Refs: 2026-10-12 diagnostic report, increment 2.
54 lines
3.1 KiB
TypeScript
54 lines
3.1 KiB
TypeScript
// 增量 2 验收(2026-10-12 诊断报告):普通基座(无 rdm.inspect.* 命令面)不展示
|
||
// 「追溯审计」入口,且不发出任何 rdm.* 命令请求——消除「入口可达、进入即 400」。
|
||
// 驱动:scripts/e2e.sh 第 4 阶段——RDM 组合验收跑完后,同一数据目录换基座 CLI
|
||
//(agent-system serve,同源同 pin)服务,同一 preview 指向它,只跑本文件。
|
||
// 环境契约与 rdm-audit.playwright.ts 一致(e2e.sh 注入)。
|
||
import { test, expect, type Page } from '@playwright/test'
|
||
|
||
const OWNER = process.env.E2E_OWNER || 'e2e-auditor'
|
||
const PASSWORD = process.env.E2E_PASSWORD || 'E2eAudit#2026'
|
||
const PASSWORD2 = process.env.E2E_PASSWORD2 || 'E2eAudit#2026b'
|
||
|
||
// 仅第 4 阶段(普通基座)启用:RDM 组合主跑(第 3 阶段)扫全目录时本文件自跳过,
|
||
// 否则「入口隐藏」断言会跑在入口本就可见的 RDM 组合上。
|
||
test.skip(!(process.env.PLAYWRIGHT_BASE_URL && process.env.E2E_PLAIN_BASE),
|
||
'set PLAYWRIGHT_BASE_URL + E2E_PLAIN_BASE (scripts/e2e.sh phase 4 drives this suite)')
|
||
|
||
// 与 rdm-audit spec 同一账号:若数据库仍是初始密码则先过强制改密门。
|
||
async function login(page: Page) {
|
||
await page.goto('/')
|
||
await page.getByPlaceholder('由管理员分配').fill(OWNER)
|
||
await page.getByPlaceholder('初始密码或常用密码').fill(PASSWORD)
|
||
await page.getByRole('button', { name: '登录', exact: true }).click()
|
||
const gate = page.getByText('修改密码')
|
||
const gated = await gate.waitFor({ state: 'visible', timeout: 5_000 }).then(() => true).catch(() => false)
|
||
if (gated) {
|
||
const pwInputs = page.locator('.lg-card input[type="password"]')
|
||
await pwInputs.nth(0).fill(PASSWORD)
|
||
await pwInputs.nth(1).fill(PASSWORD2)
|
||
await pwInputs.nth(2).fill(PASSWORD2)
|
||
await page.getByRole('button', { name: '设置新密码并进入' }).click()
|
||
} else {
|
||
// 已改密(RDM 阶段完成):改用新密码重登。
|
||
await page.getByPlaceholder('初始密码或常用密码').fill(PASSWORD2)
|
||
await page.getByRole('button', { name: '登录', exact: true }).click()
|
||
}
|
||
}
|
||
|
||
test('普通基座:命令面无 rdm.inspect.* → 审计入口隐藏、无 rdm 请求', async ({ page }) => {
|
||
const rdmRequests: string[] = []
|
||
page.on('request', r => {
|
||
if (r.url().includes('/api/commands/rdm.')) rdmRequests.push(r.url())
|
||
})
|
||
await login(page)
|
||
// 登录成功标志:侧栏常驻「代理」与「文件」体系工具(均为无条件内置)。
|
||
await expect(page.locator('.tsb-tool', { hasText: '代理' })).toBeVisible({ timeout: 15_000 })
|
||
await expect(page.locator('.tsb-tool', { hasText: '文件' })).toBeVisible()
|
||
// 能力探测(GET /api/commands)返回普通基座清单后,审计入口保持隐藏。
|
||
await expect(page.locator('.tsb-tool', { hasText: '追溯审计' })).toHaveCount(0)
|
||
await page.waitForTimeout(500)
|
||
await expect(page.locator('.tsb-tool', { hasText: '追溯审计' })).toHaveCount(0)
|
||
// 入口不存在则不应有任何 rdm.* 命令请求(原缺陷路径是进入即 400)。
|
||
expect(rdmRequests).toEqual([])
|
||
})
|