import test from 'node:test'; import assert from 'node:assert/strict'; import type { Bug } from './bug'; import type { DevTask } from './dev-task'; import type { TestCase } from './test-case'; import type { VersionPlan } from './version-plan'; import { makeBugStatusActivity, makeDevTaskStatusActivity, makeTestCaseStatusActivity, makeVersionPlanCompletedActivity, } from './work-activity-factory'; function devTask(patch: Partial = {}): DevTask { return { id: 'task-1', taskNo: 'DEV-001', requirementId: 'req-1', title: '实现登录接口', categoryId: 'cat-1', assigneeId: '张三', priority: 'P2', expectedStartAt: '2026-06-26T01:00', expectedEndAt: '2026-06-26T09:00', status: 'todo', isBlocked: false, createdBy: '张三', createdAt: '2026-06-26T01:00:00.000Z', updatedAt: '2026-06-26T01:00:00.000Z', ...patch, }; } function plan(patch: Partial = {}): VersionPlan { return { id: 'plan-1', versionId: 'version-1', type: 'product', title: '提交产品方案', owner: '张三', startTime: '2026-06-26T01:00', endTime: '2026-06-26T09:00', status: 'in_progress', createdAt: '2026-06-26', addedBy: '张三', ...patch, }; } function bug(patch: Partial = {}): Bug { return { id: 'bug-1', bugNo: 'BUG-001', versionId: 'version-1', testCaseId: 'case-1', title: '修复菜单错位', description: '菜单在窄屏错位', severity: 'major', priority: 'P1', reportedBy: '李四', assigneeId: '张三', status: 'fixing', createdAt: '2026-06-26T01:00:00.000Z', updatedAt: '2026-06-26T01:00:00.000Z', ...patch, }; } function testCase(patch: Partial = {}): TestCase { return { id: 'tc-1', caseNo: 'TC-001', versionId: 'version-1', title: '验证登录流程', categoryId: 'cat-test', priority: 'P2', assigneeId: '张三', status: 'pending', createdBy: '张三', createdAt: '2026-06-26T01:00:00.000Z', updatedAt: '2026-06-26T01:00:00.000Z', ...patch, }; } test('makeDevTaskStatusActivity maps started and submitted actions', () => { const started = makeDevTaskStatusActivity(devTask(), 'todo', 'in_progress', '张三'); const submitted = makeDevTaskStatusActivity(devTask({ status: 'testing' }), 'testing', 'submitted', '张三'); assert.equal(started?.action, 'dev_task_started'); assert.equal(started?.category, 'progress'); assert.equal(started?.summary, '开始开发:实现登录接口'); assert.equal(submitted?.action, 'dev_task_submitted'); assert.equal(submitted?.category, 'delivery'); assert.equal(submitted?.summary, '已提测开发任务:实现登录接口'); }); test('makeVersionPlanCompletedActivity marks product plan completion as delivery', () => { const activity = makeVersionPlanCompletedActivity(plan(), '张三'); assert.equal(activity.action, 'version_plan_completed'); assert.equal(activity.category, 'delivery'); assert.equal(activity.sourceType, 'version_plan'); assert.equal(activity.summary, '完成产品方案:提交产品方案'); }); test('makeBugStatusActivity maps fixing and fixed actions', () => { const fixing = makeBugStatusActivity(bug({ status: 'open' }), 'open', 'fixing', '张三'); const fixed = makeBugStatusActivity(bug(), 'fixing', 'fixed', '张三'); assert.equal(fixing?.action, 'bug_fixing'); assert.equal(fixing?.category, 'progress'); assert.equal(fixing?.summary, '开始修复 Bug:修复菜单错位'); assert.equal(fixed?.action, 'bug_fixed'); assert.equal(fixed?.category, 'delivery'); assert.equal(fixed?.summary, '已修复 Bug:修复菜单错位'); }); test('makeTestCaseStatusActivity maps running and passed actions', () => { const running = makeTestCaseStatusActivity(testCase(), 'pending', 'running', '张三'); const passed = makeTestCaseStatusActivity(testCase({ status: 'running' }), 'running', 'passed', '张三'); assert.equal(running?.action, 'test_case_started'); assert.equal(running?.category, 'progress'); assert.equal(running?.summary, '开始测试:验证登录流程'); assert.equal(passed?.action, 'test_case_passed'); assert.equal(passed?.category, 'delivery'); assert.equal(passed?.summary, '测试通过:验证登录流程'); });