106 lines
3.2 KiB
JavaScript
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");
|