/** * v1.8.1 — EdgeForwardEnvelope 类型守卫 + envelope shape 回归测试 * * 修复设备端 Round 8 audit P1 finding: * v1.8.0 Edge 用 (message as any).metaCompliance = ... mutate device wire payload, * dashboard 展开 payload 看到 metaCompliance 字段误判 "私自加字段" * * v1.8.1 改用 envelope 包装, device payload immutable, metadata 在 envelope.edgeAnnotation * * 设计文档: claude-docs/discussions/protocol-team-reply-to-consumer-audit-v1.8.0.md (Round 9) * Round 10 ack: claude-docs/discussions/device-team-final-ack-v1.8.0.md */ import { EdgeForwardEnvelope, isEdgeForwardEnvelope, MessageType, MessageStatus, } from '../index'; describe('v1.8.1 — EdgeForwardEnvelope', () => { describe('1. isEdgeForwardEnvelope 类型守卫', () => { test('合法 envelope 返回 true', () => { const env: EdgeForwardEnvelope = { edgePayload: { type: MessageType.PROGRESS_UPDATE, clientId: 'TD-实验室', requestRef: 'req_X', status: MessageStatus.IN_PROGRESS, phase: 'BATCH_EXECUTE', progress: 50, sourceType: 'COMMAND', timestamp: '2026-05-17T00:00:00.000Z', version: '1.0', }, edgeAnnotation: { metaCompliance: 'TOLERATED', validationFailures: ['level WARNING vs META INFO mismatch'], edgeReceivedAt: '2026-05-17T00:00:00.123Z', }, envelopeVersion: '1.8.1', }; expect(isEdgeForwardEnvelope(env)).toBe(true); }); test('raw message (no envelopeVersion) 返回 false', () => { const raw = { type: 'PROGRESS_UPDATE', clientId: 'X', requestRef: 'r', status: 'IN_PROGRESS', phase: 'BATCH_EXECUTE', progress: 50, sourceType: 'COMMAND', timestamp: '2026-05-17T00:00:00.000Z', version: '1.0', }; expect(isEdgeForwardEnvelope(raw)).toBe(false); }); test('null / undefined / 字符串 / 数字 全返回 false', () => { expect(isEdgeForwardEnvelope(null)).toBe(false); expect(isEdgeForwardEnvelope(undefined)).toBe(false); expect(isEdgeForwardEnvelope('not an object')).toBe(false); expect(isEdgeForwardEnvelope(42)).toBe(false); expect(isEdgeForwardEnvelope({})).toBe(false); }); test('envelopeVersion 不是 "1.8.1" 返回 false (forward-compat — Gateway 显式拒绝未知 envelope 版本)', () => { const fakeV2 = { envelopeVersion: '2.0.0', edgePayload: {}, edgeAnnotation: { metaCompliance: 'STRICT', edgeReceivedAt: '...' }, }; expect(isEdgeForwardEnvelope(fakeV2 as any)).toBe(false); }); test('缺 edgePayload 返回 false', () => { const broken = { envelopeVersion: '1.8.1', edgeAnnotation: {} }; expect(isEdgeForwardEnvelope(broken)).toBe(false); }); test('缺 edgeAnnotation 返回 false', () => { const broken = { envelopeVersion: '1.8.1', edgePayload: {} }; expect(isEdgeForwardEnvelope(broken)).toBe(false); }); }); describe('2. envelope shape — device payload immutability', () => { test('envelope 包装后 edgePayload 完整保留 device emit 原样', () => { const env: EdgeForwardEnvelope = { edgePayload: { type: MessageType.PROGRESS_UPDATE, clientId: 'TD-实验室', requestRef: 'req_immutable_test', status: MessageStatus.IN_PROGRESS, phase: 'BATCH_EXECUTE', progress: 100, sourceType: 'COMMAND', timestamp: '2026-05-17T03:06:22.948Z', version: '1.0', command: { commandType: 'SIMPLE' as any, commandCode: 'BARGRAPH_MISALIGNMENT', deviceType: 'BARGRAPH_DEVICE', deviceId: 2, operationType: 'READ' as any, }, report: { level: 'ERROR' as any, message: 'Bargraph[2]: install offset read failed', code: 'BARGRAPH_MISALIGNMENT_READ_FAILED', data: { error: { phase: 'BATCH_EXECUTE', step: 'DataTransfer', category: 'TRANSPORT', detail: '...' } }, }, }, edgeAnnotation: { metaCompliance: 'TOLERATED', validationFailures: ['some failure'], edgeReceivedAt: '2026-05-17T03:06:22.950Z', }, envelopeVersion: '1.8.1', }; // edgePayload 字段不应被注入 metaCompliance expect((env.edgePayload as any).metaCompliance).toBeUndefined(); // envelope.edgeAnnotation 含 metadata expect(env.edgeAnnotation.metaCompliance).toBe('TOLERATED'); }); }); describe('3. ProgressUpdateMessage schema — metaCompliance 字段已删除', () => { test('v1.8.1 ProgressUpdateMessage type 不应包含 metaCompliance 字段', () => { const msg = { type: MessageType.PROGRESS_UPDATE, clientId: 'X', requestRef: 'r', status: MessageStatus.IN_PROGRESS, phase: 'BATCH_EXECUTE', progress: 50, sourceType: 'COMMAND' as const, timestamp: '2026-05-17T00:00:00.000Z', version: '1.0', }; // TS 编译时不能 access msg.metaCompliance (v1.8.1 已删字段) // 运行时也不存在 expect((msg as any).metaCompliance).toBeUndefined(); }); }); describe('4. validationFailures 可选 (STRICT 时可空)', () => { test('STRICT 通过时 envelope 不必带 failures', () => { const env: EdgeForwardEnvelope = { edgePayload: { type: MessageType.COMMAND_RESPONSE, clientId: 'X', requestRef: 'r', status: MessageStatus.COMPLETED, timestamp: '2026-05-17T00:00:00.000Z', version: '1.0', report: { level: 'INFO', code: 'BARGRAPH_MISALIGNMENT_WRITE_SUCCESS', message: 'OK' } as any, } as any, edgeAnnotation: { metaCompliance: 'STRICT', edgeReceivedAt: '2026-05-17T00:00:00.000Z', }, envelopeVersion: '1.8.1', }; expect(env.edgeAnnotation.validationFailures).toBeUndefined(); expect(env.edgeAnnotation.metaCompliance).toBe('STRICT'); }); }); });