77d049990c
新增 task-permission.ts(授权用户列表解析/已授权 id/保存负载/变更判定), image-video-api.ts 增加 fetch/saveImageVideoPermissions(GET|PUT /image-video- task-permissions)。 TDD: task-108.test.ts 8 用例先 RED 后 GREEN。
73 lines
3.1 KiB
TypeScript
73 lines
3.1 KiB
TypeScript
import test from 'node:test'
|
||
import assert from 'node:assert/strict'
|
||
import { readSource } from './helpers.ts'
|
||
import {
|
||
grantedUserIds,
|
||
parseTaskPermissionPayload,
|
||
permissionSelectionChanged,
|
||
toPermissionUserIdsPayload,
|
||
} from '../src/pages/tasks/task-permission.ts'
|
||
|
||
test('test_task_108_task_permission_normal_primary_path', () => {
|
||
// 正常主路径:权限用户负载(data 数组)解析并取已授权 id。
|
||
const items = parseTaskPermissionPayload({
|
||
success: true,
|
||
data: [
|
||
{ id: 1, username: '张伟', granted: true },
|
||
{ id: 2, username: '李四', granted: false },
|
||
],
|
||
})
|
||
assert.equal(items.length, 2)
|
||
assert.equal(items[1].username, '李四')
|
||
assert.deepEqual(grantedUserIds(items), [1])
|
||
})
|
||
|
||
test('test_task_108_task_permission_normal_variant_input', () => {
|
||
// 正常变体:data.items 包裹也可解析。
|
||
const items = parseTaskPermissionPayload({ data: { items: [{ id: 5, username: 'A', granted: true }] } })
|
||
assert.equal(items.length, 1)
|
||
assert.deepEqual(grantedUserIds(items), [5])
|
||
})
|
||
|
||
test('test_task_108_task_permission_repeated_is_idempotent', () => {
|
||
// 正常重复:解析稳定、不改输入。
|
||
const payload = { data: [{ id: 3, username: 'A', granted: true }] }
|
||
assert.deepEqual(parseTaskPermissionPayload(payload), parseTaskPermissionPayload(payload))
|
||
})
|
||
|
||
test('test_task_108_task_permission_boundary_empty_input', () => {
|
||
// 边界空值:空授权列表与无用户负载。
|
||
assert.deepEqual(parseTaskPermissionPayload({ data: [] }), [])
|
||
assert.deepEqual(parseTaskPermissionPayload({}), [])
|
||
})
|
||
|
||
test('test_task_108_task_permission_boundary_single_item', () => {
|
||
// 边界单元素:单用户授权 id 与保存负载。
|
||
const items = parseTaskPermissionPayload({ data: [{ id: 7, username: 'Z', granted: true }] })
|
||
assert.deepEqual(grantedUserIds(items), [7])
|
||
assert.deepEqual(toPermissionUserIdsPayload(new Set([7, 3])), { user_ids: [7, 3] })
|
||
})
|
||
|
||
test('test_task_108_task_permission_boundary_limit_or_missing_field', () => {
|
||
// 边界上限/缺字段:缺 granted 按未授权处理。
|
||
const items = parseTaskPermissionPayload({ data: [{ id: 4, username: 'U' }] })
|
||
assert.equal(items[0].granted, false)
|
||
assert.deepEqual(grantedUserIds(items), [])
|
||
})
|
||
|
||
test('test_task_108_task_permission_invalid_input_rejected', () => {
|
||
// 异常输入:无 id 用户被过滤;success=false 抛后端 message。
|
||
assert.equal(parseTaskPermissionPayload({ data: [{ username: 'no-id' }, { id: 2, username: 'x' }] }).length, 1)
|
||
assert.throws(() => parseTaskPermissionPayload({ success: false, message: '仅超级管理员可配置' }), /仅超级管理员/)
|
||
})
|
||
|
||
test('test_task_108_task_permission_dependency_failure_returns_actionable_message', () => {
|
||
// 依赖失败/加载走 adapter:GET|PUT /api/admin/image-video-task-permissions + 解析。
|
||
const api = readSource('src/pages/tasks/image-video-api.ts')
|
||
assert.match(api, /\/api\/admin\/image-video-task-permissions/)
|
||
assert.match(api, /saveImageVideoPermissions/)
|
||
assert.match(api, /http\.put/)
|
||
const model = readSource('src/pages/tasks/task-permission.ts')
|
||
assert.equal(/axios|http\.|vue/.test(model), false, '权限模型保持纯逻辑')
|
||
})
|