import test from 'node:test'; import assert from 'node:assert/strict'; import { buildTaskRequest, buildResumeRequest } from './taskStream'; test('buildTaskRequest: maps five project fields + task_key + user identity', () => { const req = buildTaskRequest({ taskKey: 'feasibility_reg', projectName: '超声主机系统', customerName: '北京水木东方', deviceType: '超声吸引刀', intendedUse: '外科手术导航', targetMarket: '国内', userId: 1, projectId: 7, }); assert.equal(req.task_key, 'feasibility_reg'); assert.equal(req.project_name, '超声主机系统'); assert.equal(req.customer_name, '北京水木东方'); assert.equal(req.device_type, '超声吸引刀'); assert.equal(req.intended_use, '外科手术导航'); assert.equal(req.target_market, '国内'); assert.equal(req.user_id, 1); assert.equal(req.project_id, 7); assert.equal('work_dir' in req, false); }); test('buildTaskRequest: omits optional fields when absent', () => { const req = buildTaskRequest({ taskKey: 'intake', projectName: 'P', customerName: 'C', deviceType: 'D', }); assert.equal('intended_use' in req, false); assert.equal('target_market' in req, false); assert.equal('user_id' in req, false); assert.equal('project_id' in req, false); assert.equal('materials' in req, false); }); test('buildTaskRequest: includes materials when provided and non-empty', () => { const req = buildTaskRequest({ taskKey: 'intake', projectName: 'P', customerName: 'C', deviceType: 'D', materials: [ { filename: 'doc1.txt', content: 'b64content==' }, ], }); assert.equal('materials' in req, true); assert.deepEqual(req.materials, [{ filename: 'doc1.txt', content: 'b64content==' }]); }); test('buildResumeRequest: adds work_dir on top of task request', () => { const req = buildResumeRequest( { taskKey: 'feasibility_reg', projectName: 'P', customerName: 'C', deviceType: 'D', userId: 2 }, '/tmp/ws-x' ); assert.equal(req.work_dir, '/tmp/ws-x'); assert.equal(req.task_key, 'feasibility_reg'); assert.equal(req.user_id, 2); assert.equal('add_steps' in req, false); }); test('buildTaskRequest: canonicalizes legacy doc-p doc_id', () => { const req = buildTaskRequest({ taskKey: 'research', projectName: 'P', customerName: 'C', deviceType: 'D', projectId: 56, docId: 'doc-p56-research', }); assert.equal(req.doc_id, 'doc_proj56_research'); }); test('buildTaskRequest: UI-05 pinned intake keeps task_key + doc_proj6109_intake', () => { const req = buildTaskRequest({ taskKey: 'intake', projectName: 'P', customerName: 'C', deviceType: 'D', projectId: 6109, docId: 'doc_proj6109_intake', userMessage: '请按 YY/T、GB 9706.1 与 NMPA 注册法规要求,大幅改写当前受控文档中的风险管理与电气安全章节,引用具体条款并重写适用性结论(二轮高风险候选-确认用例)。', }); assert.equal(req.task_key, 'intake'); assert.equal(req.doc_id, 'doc_proj6109_intake'); assert.equal(req.project_id, 6109); }); test('buildResumeRequest: forwards add_steps when provided', () => { const req = buildResumeRequest( { taskKey: 'intake', projectName: 'P', customerName: 'C', deviceType: 'D' }, '/tmp/ws-y', [{ id: 'step_dyn_1', role: 'regulatory', title: '补充条款' }] ); assert.equal(req.work_dir, '/tmp/ws-y'); assert.deepEqual(req.add_steps, [{ id: 'step_dyn_1', role: 'regulatory', title: '补充条款' }]); });