Files
jiapu/tests/request-auth-state.test.js
T
fizzleaf 309598bfa6 feat(api): 添加帮助中心反馈系统和VIP服务功能
- 在ApiClient中新增submitFeedback、myFeedback、helpArticles、helpArticleDetail、
  siteArticles、promotions、vipPackages、createVipOrder、vipOrders等方法
- 添加帮助文章和站点资讯的参数验证逻辑
- 更新测试文件添加新的API方法测试用例
- 在HTML页面中添加反馈、帮助和VIP服务相关页面的脚本引用
- 更新加入家谱页面为完整的申请流程界面
- 修改资讯详情页面为站点资讯展示页面
- 更新AxiosRequestUtil中认证处理逻辑
- 添加世系树渲染的HTML生成函数用于页面复用
- 更新文档中的API契约说明和页面规划
2026-07-30 16:04:48 +08:00

161 lines
3.8 KiB
JavaScript

const assert = require('node:assert/strict');
const test = require('node:test');
const GenealogyApi = require('../utils/ApiClient.js');
const AxiosRequestUtil = require('../utils/AxiosRequestUtil.js');
function createFailingClient(status) {
let storedToken = 'access-token';
const client = GenealogyApi.createClient({
baseUrl: 'https://api.example.test',
tokenStore: {
getItem() {
return storedToken;
},
setItem(_, value) {
storedToken = value;
},
removeItem() {
storedToken = '';
}
},
axiosInstance: {
request() {
return Promise.reject({
message: 'Request failed',
response: {
status,
data: {
code: status,
msg: status === 401 ? '登录已失效' : '无权访问'
}
}
});
}
}
});
return client;
}
test('HTTP 401 clears the stored login token', async () => {
const client = createFailingClient(401);
await assert.rejects(client.currentProfile(), (error) => {
assert.equal(error.status, 401);
assert.equal(error.message, '登录已失效');
return true;
});
assert.equal(client.getToken(), '');
});
test('HTTP 403 preserves the stored login token', async () => {
const client = createFailingClient(403);
await assert.rejects(client.currentProfile(), (error) => {
assert.equal(error.status, 403);
assert.equal(error.message, '无权访问');
return true;
});
assert.equal(client.getToken(), 'access-token');
});
test('business response code 401 clears the stored login token', async () => {
let storedToken = 'access-token';
const client = GenealogyApi.createClient({
baseUrl: 'https://api.example.test',
tokenStore: {
getItem() {
return storedToken;
},
setItem(_, value) {
storedToken = value;
},
removeItem() {
storedToken = '';
}
},
axiosInstance: {
request() {
return Promise.resolve({
data: {
code: 401,
msg: '登录已失效'
}
});
}
}
});
await assert.rejects(client.currentProfile(), (error) => {
assert.equal(error.code, 401);
assert.equal(error.message, '登录已失效');
return true;
});
assert.equal(client.getToken(), '');
});
test('public HTTP 401 neither sends nor clears the stored login token', async () => {
let storedToken = 'access-token';
let seenRequest;
const requester = AxiosRequestUtil.createRequester({
baseUrl: 'https://api.example.test',
clientId: 'web-pc',
getToken() {
return storedToken;
},
onUnauthorized() {
storedToken = '';
},
axiosInstance: {
request(config) {
seenRequest = config;
return Promise.reject({
message: 'Request failed',
response: {
status: 401,
data: {
code: 401,
msg: '认证失败'
}
}
});
}
}
});
await assert.rejects(requester('GET', '/public', { auth: false }));
assert.equal(seenRequest.headers.Authorization, undefined);
assert.equal(storedToken, 'access-token');
});
test('public business 401 preserves the stored login token', async () => {
let storedToken = 'access-token';
const requester = AxiosRequestUtil.createRequester({
baseUrl: 'https://api.example.test',
clientId: 'web-pc',
getToken() {
return storedToken;
},
onUnauthorized() {
storedToken = '';
},
axiosInstance: {
request() {
return Promise.resolve({
data: {
code: 401,
msg: '认证失败'
}
});
}
}
});
await assert.rejects(requester('GET', '/public', { auth: false }));
assert.equal(storedToken, 'access-token');
});