Files
crawler-plugin/admin-frontend-vue/tests/task-103.test.ts
T
huangzd1997 841430cd6c task-103(任务与重复分析中心): 实现视频任务列表/卡片加载
新增 image-video-model.ts(snake 任务行解析、videos 安全地址与展平为视频卡片)
与 image-video-api.ts(GET /api/admin/image-video-tasks 加载适配)。

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

99 lines
4.0 KiB
TypeScript
Raw 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 {
flattenImageVideoTasks,
parseImageVideoPage,
toImageVideoVideo,
} from '../src/pages/tasks/image-video-model.ts'
test('test_task_103_video_list_load_normal_primary_path', () => {
// 正常主路径:snake 任务行(含 videos)解析并展平为视频卡片。
const page = parseImageVideoPage({
success: true,
data: {
items: [
{
task_id: 11,
user_id: 3,
username: '张伟',
group_name: '华东组',
status: 'SUCCESS',
videos: [{ display_url: 'https://oss/a/1.mp4', source_url: 'https://src/1.mp4', object_key: 'a/1.mp4', archive_status: 'SUCCESS' }],
submitted_at: '2026-01-01 10:00:00',
completed_at: '2026-01-01 10:05:00',
},
],
total: 1,
page: 1,
page_size: 20,
},
})
assert.equal(page.items.length, 1)
const task = page.items[0]
assert.equal(task.taskId, '11')
assert.equal(task.username, '张伟')
assert.equal(task.groupName, '华东组')
assert.equal(task.status, 'SUCCESS')
assert.equal(task.videos.length, 1)
assert.equal(task.videos[0].displayUrl, 'https://oss/a/1.mp4')
assert.equal(page.total, 1)
assert.equal(page.pageSize, 20)
const cards = flattenImageVideoTasks(page.items)
assert.equal(cards.length, 1)
assert.equal(cards[0].key, '11:0')
assert.equal(cards[0].video?.displayUrl, 'https://oss/a/1.mp4')
})
test('test_task_103_video_list_load_normal_variant_input', () => {
// 正常变体:无 videos 的任务展平为单张空卡。
const cards = flattenImageVideoTasks([{ taskId: '7', status: 'RUNNING', username: 'A', videos: [], groupName: '' }])
assert.equal(cards.length, 1)
assert.equal(cards[0].key, '7:empty')
assert.equal(cards[0].video, null)
})
test('test_task_103_video_list_load_repeated_is_idempotent', () => {
// 正常重复:解析与展平稳定、不改输入。
const payload = { data: { items: [{ task_id: 1, status: 'FAILED', videos: [] }], total: 1, page: 1, page_size: 20 } }
assert.deepEqual(parseImageVideoPage(payload), parseImageVideoPage(payload))
})
test('test_task_103_video_list_load_boundary_empty_input', () => {
// 边界空值:空负载回默认分页空结果。
const page = parseImageVideoPage({})
assert.deepEqual(page.items, [])
assert.equal(page.total, 0)
assert.equal(page.pageSize, 20)
})
test('test_task_103_video_list_load_boundary_single_item', () => {
// 边界单元素:单任务单视频展平结果与排序正确;缺 task_id 行被过滤。
const page = parseImageVideoPage({ items: [{ task_id: 5, videos: [] }, { username: 'no-id' }], total: 2, page: 1, page_size: 20 })
assert.equal(page.items.length, 1)
assert.equal(flattenImageVideoTasks(page.items)[0].key, '5:empty')
})
test('test_task_103_video_list_load_boundary_limit_or_missing_field', () => {
// 边界上限/缺字段:非 http 内联地址按不可播放处理。
const video = toImageVideoVideo({ display_url: 'ftp://bad/x.mp4', object_key: 'k' })
assert.ok(video)
assert.equal(video.displayUrl, '')
})
test('test_task_103_video_list_load_invalid_input_rejected', () => {
// 异常输入:success=false 抛后端 message;非对象行不入列表。
assert.throws(() => parseImageVideoPage({ success: false, message: '无权访问视频任务' }), /无权访问/)
assert.equal(toImageVideoVideo('garbage'), null)
})
test('test_task_103_video_list_load_dependency_failure_returns_actionable_message', () => {
// 依赖失败/加载走 adapterGET /api/admin/image-video-tasks + http.get + 解析。
const api = readSource('src/pages/tasks/image-video-api.ts')
assert.match(api, /\/api\/admin\/image-video-tasks/)
assert.match(api, /http\.get/)
assert.match(api, /parseImageVideoPage/)
const model = readSource('src/pages/tasks/image-video-model.ts')
assert.equal(/axios|http\./.test(model), false, '视频列表解析保持纯逻辑')
})