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/) })