"use strict"; const assert = require("assert"); const fs = require("fs"); const vm = require("vm"); const source = fs.readFileSync("static/tac/js/jiapu-tac-adapter.js", "utf8"); const sandbox = {}; sandbox.window = sandbox; sandbox.globalThis = sandbox; vm.runInNewContext(source, sandbox, { filename: "jiapu-tac-adapter.js" }); const adapter = sandbox.JiapuTacAdapter; assert(adapter, "TAC 供应商适配器必须暴露唯一全局 owner"); const context = { tenantId: "000000", clientId: "client-1", sceneCode: "APP_REGISTER", subject: "13800138000", providerCode: "TIANAI", captchaType: "SLIDER", }; const mapped = adapter.normalizeChallengeResponse( { code: 200, msg: "操作成功", data: { required: true, providerCode: "TIANAI", captchaType: "SLIDER", challengeId: "challenge-1", payload: { backgroundImage: "data:image/png;base64,bg", templateImage: "data:image/png;base64,tpl", }, expireSeconds: 300, }, }, context, ); assert.strictEqual(mapped.sdkResponse.code, 200); assert.strictEqual(mapped.sdkResponse.data.type, "SLIDER"); assert.strictEqual(mapped.sdkResponse.data.id, "challenge-1"); assert.strictEqual(mapped.challenge.challengeId, "challenge-1"); for (const invalid of [ { code: 500, msg: "失败" }, { code: 200, data: { ...mapped.challenge, required: false, payload: mapped.sdkResponse.data } }, { code: 200, data: { ...mapped.challenge, providerCode: "OTHER", payload: mapped.sdkResponse.data } }, { code: 200, data: { ...mapped.challenge, captchaType: "SLIDER", payload: {} } }, ]) { assert.throws(() => adapter.normalizeChallengeResponse(invalid, context)); } const track = { bgImageWidth: 300, bgImageHeight: 180, templateImageWidth: 60, templateImageHeight: 180, startTime: 1000, stopTime: 1500, trackList: [ { x: 1, y: 2, t: 0, type: "down" }, { x: 80, y: 2, t: 500, type: "up" }, ], }; const verifyBody = adapter.buildVerifyBody( { id: "challenge-1", data: track }, context, mapped.challenge, ); assert.deepStrictEqual(JSON.parse(JSON.stringify(verifyBody)), { tenantId: "000000", clientId: "client-1", sceneCode: "APP_REGISTER", subject: "13800138000", challengeId: "challenge-1", providerCode: "TIANAI", captchaType: "SLIDER", payload: { track }, }); assert.strictEqual(Object.prototype.hasOwnProperty.call(verifyBody.payload, "id"), false); assert.throws( () => adapter.buildVerifyBody({ id: "other", data: track }, context, mapped.challenge), /挑战|challenge/, ); assert.throws( () => adapter.buildVerifyBody({ id: "challenge-1", data: { ...track, trackList: [] } }, context, mapped.challenge), /轨迹/, ); assert.deepStrictEqual( JSON.parse(JSON.stringify(adapter.normalizeVerifyResponse({ code: 200, data: { passed: true, validToken: "ticket-1", expireSeconds: 300 }, }))), { code: 200, data: { passed: true, validToken: "ticket-1", expireSeconds: 300 } }, ); for (const invalid of [ { code: 200, data: { passed: false, validToken: "ticket-1" } }, { code: 200, data: { passed: true, validToken: "" } }, { code: 500, data: { passed: true, validToken: "ticket-1" } }, ]) { assert.throws(() => adapter.normalizeVerifyResponse(invalid), /验证|票据|请求/); } console.log("TAC-ADAPTER-RUNTIME-SMOKE PASS");