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, 10) }) 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', () => { // 依赖失败/加载走 adapter:GET /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, '视频列表解析保持纯逻辑') })