const assert = require('node:assert/strict'); const test = require('node:test'); const GenealogyApi = require('../utils/ApiClient.js'); function createClient() { return GenealogyApi.createClient({ baseUrl: 'https://api.example.test', tokenStore: { getItem() { return null; }, setItem() {}, removeItem() {} }, axiosInstance: { request() { return Promise.resolve({ data: { code: 200, data: {} } }); } } }); } test('API client exposes latest document-defined PC operations', () => { const client = createClient(); const allowed = [ 'clientId', 'tenantId', 'tokenKey', 'getToken', 'setToken', 'clearToken', 'buildApiUrl', 'register', 'login', 'loginBySms', 'sendSmsCode', 'currentProfile', 'updateProfile', 'changePassword', 'resetPassword', 'changePhone', 'deactivateAccount', 'logout', 'uploadFile', 'captchaRequirement', 'captchaChallenge', 'captchaVerify', 'regionChildren', 'regionPath', 'regionSearch', 'regionDetail', 'feeds', 'feedsPage', 'feedDetail', 'createFeed', 'updateFeed', 'deleteFeed', 'likeFeed', 'unlikeFeed', 'feedComments', 'feedCommentsPage', 'createFeedComment', 'deleteFeedComment' ].sort(); assert.deepEqual(Object.keys(client).sort(), allowed); }); test('password login stores only the returned token', async () => { let stored = ''; const client = GenealogyApi.createClient({ baseUrl: 'https://api.example.test', tokenStore: { getItem() { return stored; }, setItem(_, value) { stored = value; }, removeItem() { stored = ''; } }, axiosInstance: { request(config) { assert.equal(config.method, 'post'); assert.equal(config.url, '/genealogy/pc/auth/login'); assert.equal(config.headers.Authorization, undefined); return Promise.resolve({ data: { code: 200, data: { accessToken: 'access-token' } } }); } } }); await client.login({ phone: '13800000000', password: 'hash' }); assert.equal(client.getToken(), 'access-token'); }); test('sending an SMS code uses the latest documented request fields', async () => { const client = GenealogyApi.createClient({ baseUrl: 'https://api.example.test', tokenStore: { getItem() { return null; }, setItem() {}, removeItem() {} }, axiosInstance: { request(config) { assert.equal(config.url, '/genealogy/pc/auth/sms/code'); assert.deepEqual(config.data, { grantType: 'sms', tenantId: '000000', clientId: 'ced7e5f0498645c6ec642dcf450b036f', phone: '13800000000', sceneCode: 'WEB_H5_LOGIN', validToken: 'captcha-ticket' }); return Promise.resolve({ data: { code: 200, data: null } }); } } }); await client.sendSmsCode({ phone: '13800000000', sceneCode: 'WEB_H5_LOGIN', validToken: 'captcha-ticket' }); }); test('family feed methods use the documented paths and request bodies', async () => { const calls = []; const client = GenealogyApi.createClient({ baseUrl: 'https://api.example.test', tokenStore: { getItem() { return 'access-token'; }, setItem() {}, removeItem() {} }, axiosInstance: { request(config) { calls.push(config); return Promise.resolve({ data: { code: 200, data: {} } }); } } }); await client.createFeed(900001001, { feedType: 'text', feedContent: '今天上传一张老照片。', mediaOssIds: '101,102', status: '0' }); await client.feedCommentsPage(900001001, 7001, { pageNum: 1, pageSize: 10 }); await client.deleteFeedComment(900001001, 7001, 8001); assert.deepEqual(calls.map((config) => [config.method, config.url, config.params, config.data]), [ ['post', '/genealogy/pc/genealogies/900001001/feeds', undefined, { feedType: 'text', feedContent: '今天上传一张老照片。', mediaOssIds: '101,102', status: '0' }], ['get', '/genealogy/pc/genealogies/900001001/feeds/7001/comments/page', { pageNum: 1, pageSize: 10 }, undefined], ['delete', '/genealogy/pc/genealogies/900001001/feeds/7001/comments/8001', undefined, undefined] ]); });