52 lines
2.2 KiB
TypeScript
52 lines
2.2 KiB
TypeScript
import test from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
import { parseCurrentUser, parseMenuTree } from '../../src/api/session-model.ts'
|
|
|
|
const BASE = process.env.AIIMAGE_LIVE_BASE || 'http://127.0.0.1:18080'
|
|
const USER = process.env.AIIMAGE_LIVE_USER || ''
|
|
const PASS = process.env.AIIMAGE_LIVE_PASS || ''
|
|
const DEVICE = 'claude-live-device'
|
|
|
|
const HAS_CREDS = Boolean(USER && PASS)
|
|
|
|
async function loginToken(): Promise<string> {
|
|
const res = await fetch(`${BASE}/login`, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ username: USER, password: PASS, deviceId: DEVICE }),
|
|
})
|
|
const body = (await res.json()) as { success?: boolean; message?: string; data?: { token?: string } }
|
|
if (!body.success || !body.data?.token) throw new Error(body.message || 'login failed')
|
|
return body.data.token
|
|
}
|
|
|
|
function authHeaders(token: string): Record<string, string> {
|
|
return { Authorization: `Bearer ${token}` }
|
|
}
|
|
|
|
test('test_live_023_current_user_real_request', { skip: !HAS_CREDS }, async () => {
|
|
const token = await loginToken()
|
|
const res = await fetch(`${BASE}/api/admin/current-user`, { headers: authHeaders(token) })
|
|
const body = await res.json()
|
|
const user = parseCurrentUser(body)
|
|
assert.equal(typeof user.id, 'number')
|
|
assert.ok(user.username.length > 0)
|
|
assert.ok(['super_admin', 'admin', 'normal'].includes(user.role))
|
|
})
|
|
|
|
test('test_live_024_menu_tree_real_request', { skip: !HAS_CREDS }, async () => {
|
|
const token = await loginToken()
|
|
const res = await fetch(`${BASE}/api/admin/current-user/menus`, { headers: authHeaders(token) })
|
|
const body = await res.json()
|
|
const tree = parseMenuTree(body)
|
|
assert.ok(Array.isArray(tree))
|
|
assert.ok(tree.length > 0, 'super_admin 应能拿到全部 admin 菜单树')
|
|
// 兼容两种后端形态:嵌套 children 分组 或 扁平 group-* 标记项(原始字段 route_path)。
|
|
const accountGroup = tree.find((n) => n.children?.length)
|
|
const hasMarkers = tree.some((n) => {
|
|
const route = (n as { route_path?: string; route?: string }).route_path || (n as { route?: string }).route || ''
|
|
return route.startsWith('group-')
|
|
})
|
|
assert.ok(accountGroup || hasMarkers, '菜单树应按分组组织(嵌套或 group-* 标记)')
|
|
})
|