602c2118d3
新增 src/pages/tasks/image-video-filter.ts:用户名/user/状态/executeId/ 提交时间区间筛选归一与 snake 查询序列化,页大小钳制 [10,100]。 TDD: task-102.test.ts 8 用例先 RED 后 GREEN。
81 lines
3.6 KiB
TypeScript
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/)
|
|
})
|