Smail/test/frontend/auth.test.mjs
smail 461d8b2237
Some checks are pending
Security Checks / security (push) Waiting to run
修复认证繁忙时前端恢复重试并补齐远程测试
2026-09-17 12:33:25 +08:00

95 lines
2.9 KiB
JavaScript

import assert from "node:assert/strict";
import test from "node:test";
import {
AUTH_STATUS,
classifyAuthenticationError,
classifyAuthenticationResponse,
runSharedAuthRefresh
} from "../../frontend/src/utils/auth.mjs";
test("认证响应会区分已登录、未登录和服务不可用", () => {
assert.equal(
classifyAuthenticationResponse({errorNo: 0, data: {account: "user@example.com"}}),
AUTH_STATUS.AUTHENTICATED
);
assert.equal(
classifyAuthenticationResponse({errorNo: 403}),
AUTH_STATUS.UNAUTHENTICATED
);
assert.equal(
classifyAuthenticationResponse({errorNo: 402}),
AUTH_STATUS.NEEDS_SETUP
);
assert.equal(
classifyAuthenticationResponse({errorNo: 500}),
AUTH_STATUS.UNAVAILABLE
);
});
test("只有认证接口的 HTTP 403 或明确业务码会被识别为未登录", () => {
assert.equal(
classifyAuthenticationError(
{response: {status: 403}},
{authenticationRequest: true}
),
AUTH_STATUS.UNAUTHENTICATED
);
assert.equal(
classifyAuthenticationError({response: {status: 403}}, {authenticationRequest: false}),
AUTH_STATUS.UNAVAILABLE
);
assert.equal(
classifyAuthenticationError({response: {status: 200, data: {errorNo: 403}}}),
AUTH_STATUS.UNAUTHENTICATED
);
assert.equal(
classifyAuthenticationError({response: {status: 402}}, {authenticationRequest: true}),
AUTH_STATUS.NEEDS_SETUP
);
assert.equal(
classifyAuthenticationError({response: {status: 500}}),
AUTH_STATUS.UNAVAILABLE
);
assert.equal(
classifyAuthenticationError(new Error("Network Error")),
AUTH_STATUS.UNAVAILABLE
);
});
test("并发认证刷新只执行一次请求并返回同一个结果", async () => {
let requestCount = 0;
let resolveRequest;
const request = () => {
requestCount += 1;
return new Promise((resolve) => {
resolveRequest = resolve;
});
};
const first = runSharedAuthRefresh(request);
const second = runSharedAuthRefresh(request);
assert.strictEqual(first, second);
await Promise.resolve();
assert.equal(requestCount, 1);
resolveRequest(AUTH_STATUS.AUTHENTICATED);
assert.equal(await first, AUTH_STATUS.AUTHENTICATED);
assert.equal(await second, AUTH_STATUS.AUTHENTICATED);
const third = runSharedAuthRefresh(async () => {
requestCount += 1;
return AUTH_STATUS.UNAUTHENTICATED;
});
assert.equal(await third, AUTH_STATUS.UNAUTHENTICATED);
assert.equal(requestCount, 2);
});
test("认证接口繁忙不判定为登录失效", () => {
assert.equal(
classifyAuthenticationError({response: {status: 503, data: {errorNo: 503}}}, {authenticationRequest: true}),
AUTH_STATUS.UNAVAILABLE
);
});