309598bfa6
- 在ApiClient中新增submitFeedback、myFeedback、helpArticles、helpArticleDetail、 siteArticles、promotions、vipPackages、createVipOrder、vipOrders等方法 - 添加帮助文章和站点资讯的参数验证逻辑 - 更新测试文件添加新的API方法测试用例 - 在HTML页面中添加反馈、帮助和VIP服务相关页面的脚本引用 - 更新加入家谱页面为完整的申请流程界面 - 修改资讯详情页面为站点资讯展示页面 - 更新AxiosRequestUtil中认证处理逻辑 - 添加世系树渲染的HTML生成函数用于页面复用 - 更新文档中的API契约说明和页面规划
161 lines
3.8 KiB
JavaScript
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');
|
|
});
|