Files
clawpanel/tests/web-headless-reload-policy.test.js
2026-06-06 18:32:37 +08:00

66 lines
2.4 KiB
JavaScript

import test from 'node:test'
import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
const tauriApi = readFileSync(new URL('../src/lib/tauri-api.js', import.meta.url), 'utf8')
const wsClient = readFileSync(new URL('../src/lib/ws-client.js', import.meta.url), 'utf8')
const main = readFileSync(new URL('../src/main.js', import.meta.url), 'utf8')
const chat = readFileSync(new URL('../src/pages/chat.js', import.meta.url), 'utf8')
test('Web/headless 模式配置写入不能隐式 reload Gateway', () => {
assert.match(
tauriApi,
/function\s+_debouncedReloadGateway\(\)\s*\{[\s\S]*?if\s*\(\s*!isTauriRuntime\(\)\s*\)\s*return/,
'tauri-api 的防抖 reload 必须在 Web/headless 模式直接跳过',
)
})
test('Web/headless 模式自动配对重连不能隐式 reload Gateway', () => {
assert.match(
wsClient,
/import\s+\{\s*api\s*,\s*isTauriRuntime\s*\}\s+from\s+['"]\.\/tauri-api\.js['"]/,
'ws-client 必须能判断当前是否为 Tauri 桌面端',
)
assert.match(
wsClient,
/if\s*\(\s*isTauriRuntime\(\)\s*\)\s*\{[\s\S]*?await\s+api\.reloadGateway\(\)/,
'自动配对后的 reload 只能在 Tauri 桌面端执行',
)
})
test('Web/headless 模式启动自动连接不能隐式 reload Gateway', () => {
assert.match(
main,
/if\s*\(\s*needReload\s*&&\s*isTauriRuntime\(\)\s*\)\s*\{[\s\S]*?await\s+api\.reloadGateway\(\)/,
'启动自动连接合并 reload 只能在 Tauri 桌面端执行',
)
})
test('Web/headless 模式聊天连接修复不自动 reload Gateway', () => {
assert.match(
chat,
/if\s*\(\s*isTauriRuntime\(\)\s*\)\s*\{[\s\S]*?await\s+api\.reloadGateway\(\)/,
'聊天页连接修复按钮只能在 Tauri 桌面端自动 reload',
)
})
test('聊天发送按钮会在输入状态变化时重新同步 disabled 状态', () => {
assert.match(
chat,
/<button class="chat-send-btn" id="chat-send-btn" type="button" disabled>/,
'发送按钮必须是普通按钮,避免表单/浏览器默认行为干扰点击状态',
)
for (const eventName of ['compositionend', 'change', 'keyup']) {
assert.match(
chat,
new RegExp(`_textarea\\.addEventListener\\('${eventName}',\\s*updateSendState\\)`),
`textarea ${eventName} 事件必须同步发送按钮状态`,
)
}
assert.match(
chat,
/requestAnimationFrame\(updateSendState\)/,
'页面初始化后需要再同步一次发送按钮状态,覆盖自动填充或恢复输入内容',
)
})