Files
crawler-plugin/admin-frontend-vue/tests/task-102.test.ts
T
huangzd1997 602c2118d3 task-102(任务与重复分析中心): 实现视频任务筛选状态
新增 src/pages/tasks/image-video-filter.ts:用户名/user/状态/executeId/
提交时间区间筛选归一与 snake 查询序列化,页大小钳制 [10,100]。

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

81 lines
3.6 KiB
TypeScript

import test from 'node:test'
import assert from 'node:assert/strict'
import { readSource } from './helpers.ts'
import {
IMAGE_VIDEO_DEFAULT_PAGE_SIZE,
IMAGE_VIDEO_MAX_PAGE_SIZE,
createImageVideoFilter,
imageVideoFilterActive,
normalizeImageVideoFilter,
toImageVideoQuery,
} from '../src/pages/tasks/image-video-filter.ts'
test('test_task_102_video_filter_normal_primary_path', () => {
// 正常主路径:完整筛选归一并序列化为 snake 查询参数。
const filter = normalizeImageVideoFilter({ username: ' 张伟 ', userId: 3, status: ' success ', executeId: 'exec-1', submittedFrom: '2026-01-01T10:00', submittedTo: '2026-01-02T18:30' })
const query = toImageVideoQuery(filter, 2, 20)
assert.equal(query.page, 2)
assert.equal(query.page_size, 20)
assert.equal(query.username, '张伟')
assert.equal(query.user_id, 3)
assert.equal(query.status, 'SUCCESS')
assert.equal(query.coze_execute_id, 'exec-1')
assert.equal(query.submitted_from, '2026-01-01T10:00')
assert.equal(query.submitted_to, '2026-01-02T18:30')
})
test('test_task_102_video_filter_normal_variant_input', () => {
// 正常变体:仅状态筛选下发;空用户名/无 user 条件不下发。
const query = toImageVideoQuery(normalizeImageVideoFilter({ status: 'running' }), 1, 20)
assert.equal(query.status, 'RUNNING')
assert.equal('username' in query, false)
assert.equal('user_id' in query, false)
})
test('test_task_102_video_filter_repeated_is_idempotent', () => {
// 正常重复:归一不改输入、结果稳定。
const input = { username: ' admin ', status: 'FAILED' }
assert.deepEqual(normalizeImageVideoFilter(input), normalizeImageVideoFilter(input))
assert.deepEqual(input, { username: ' admin ', status: 'FAILED' })
})
test('test_task_102_video_filter_boundary_empty_input', () => {
// 边界空值:空筛选回默认分页、无可选条件。
const query = toImageVideoQuery(createImageVideoFilter(), 0, 0)
assert.equal(query.page, 1)
assert.equal(query.page_size, IMAGE_VIDEO_DEFAULT_PAGE_SIZE)
assert.deepEqual(Object.keys(query).sort(), ['page', 'page_size'])
})
test('test_task_102_video_filter_boundary_single_item', () => {
// 边界单元素:仅 coze_execute_id 筛选。
const query = toImageVideoQuery(normalizeImageVideoFilter({ executeId: 'abc' }), 1, 20)
assert.equal(query.coze_execute_id, 'abc')
})
test('test_task_102_video_filter_boundary_limit_or_missing_field', () => {
// 边界上限/缺字段:页大小钳制到 [10,100];非法日期/状态过滤。
const query = toImageVideoQuery(normalizeImageVideoFilter({ status: 'weird', submittedFrom: 'not-a-date' }), 1, 999)
assert.equal(query.page_size, IMAGE_VIDEO_MAX_PAGE_SIZE)
assert.equal('status' in query, false, '非法状态不下发')
assert.equal('submitted_from' in query, false, '非法日期不下发')
})
test('test_task_102_video_filter_invalid_input_rejected', () => {
// 异常输入:数字/NaN 页码按缺省处理;负数 user id 忽略。
const filter = normalizeImageVideoFilter({ userId: -1, status: '' })
const query = toImageVideoQuery(filter, Number.NaN, Number.NaN)
assert.equal(query.page, 1)
assert.equal(query.page_size, IMAGE_VIDEO_DEFAULT_PAGE_SIZE)
assert.equal('user_id' in query, false)
assert.equal('status' in query, false)
})
test('test_task_102_video_filter_dependency_failure_returns_actionable_message', () => {
// 依赖失败/可操作:筛选纯逻辑、无框架/http。
const mod = readSource('src/pages/tasks/image-video-filter.ts')
assert.equal(/axios|http\.|vue/.test(mod), false, '筛选模块保持纯逻辑')
assert.match(mod, /submitted_from/)
assert.match(mod, /coze_execute_id/)
})