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'); });