Files
jiapuapp/tests/tac-adapter-runtime-smoke.js
T
2026-07-27 06:50:23 +08:00

106 lines
3.2 KiB
JavaScript

"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",
operationCode: "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",
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");