Files
huangzd1997 77d049990c task-108(任务与重复分析中心): 实现视频任务数据范围权限配置
新增 task-permission.ts(授权用户列表解析/已授权 id/保存负载/变更判定),
image-video-api.ts 增加 fetch/saveImageVideoPermissions(GET|PUT /image-video-
task-permissions)。

TDD: task-108.test.ts 8 用例先 RED 后 GREEN。
2026-09-05 17:14:38 +08:00

73 lines
3.1 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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', () => {
// 依赖失败/加载走 adapterGET|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, '权限模型保持纯逻辑')
})