import assert from 'node:assert/strict'; import test from 'node:test'; import { DINGTALK_ENDPOINTS, DINGTALK_RPC_CHANNEL, connectionTestFeedback, formatRemaining, normalizeProvisioning, normalizeSnapshot, presentError, safeQrSource, unwrapRpcResult, } from '../../../plugin-src/client/channels/dingtalk/api.js'; test('client exposes the fixed DingTalk RPC channel and endpoint names', () => { assert.equal(DINGTALK_RPC_CHANNEL, '/dingtalk'); assert.deepEqual(DINGTALK_ENDPOINTS, { status: 'connection.status', beginProvisioning: 'provision.begin', pollProvisioning: 'provision.poll', cancelProvisioning: 'provision.cancel', bindCredentials: 'bot.bind-credentials', reconnectBot: 'bot.reconnect', deleteBot: 'bot.delete', setWorkspace: 'bot.workspace.set', setAgentPreset: 'bot.preset.set', setContextEnhancement: 'bot.context-enhancement.set', setAccessPolicy: 'bot.access-policy.set', }); }); test('RPC envelopes are required and sensitive error details are replaced', () => { assert.equal(unwrapRpcResult({ ok: true, value: { ready: true } }).ready, true); assert.throws( () => unwrapRpcResult({ value: {} }), /无法识别/, ); assert.throws( () => unwrapRpcResult({ ok: false, error: { code: 'stream-connect-failed', message: '钉钉 Stream 消息连接建立失败。', hint: '请按参考号查看 dsh web 日志。', referenceId: 'DT-CONN-DEADBEEF', }, }), (error) => error.code === 'stream-connect-failed' && error.hint === '请按参考号查看 dsh web 日志。' && error.referenceId === 'DT-CONN-DEADBEEF', ); assert.throws( () => unwrapRpcResult({ ok: false, error: { code: 'clientSecret=should-not-escape', message: 'clientSecret=super-secret-value', }, }), (error) => error.code === 'DINGTALK_RPC_ERROR' && error.message === '钉钉操作失败' && !error.message.includes('super-secret-value'), ); }); test('QR images accept only bounded base64 PNG or WebP data URLs', () => { assert.equal(safeQrSource('data:image/png;base64,AAAA'), 'data:image/png;base64,AAAA'); assert.equal(safeQrSource('data:image/webp;base64,AAAA'), 'data:image/webp;base64,AAAA'); assert.equal(safeQrSource('data:image/svg+xml;base64,AAAA'), undefined); assert.equal(safeQrSource('data:image/png;base64,AAAA\n