hyapp-h5/scripts/test_fami_bd_center.js
2026-07-12 17:38:53 +08:00

163 lines
5.9 KiB
JavaScript

const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const vm = require('node:vm');
const root = path.join(__dirname, '..');
function apiResponse(data) {
return {
headers: { get: () => '' },
ok: true,
status: 200,
statusText: 'OK',
text: () => Promise.resolve(JSON.stringify({ code: 'OK', data })),
};
}
function harness(search = '') {
const requests = [];
const location = {
hash: '',
hostname: 'h5.global-interaction.com',
href: `https://h5.global-interaction.com/guild/fami/bd-center/${search}`,
origin: 'https://h5.global-interaction.com',
pathname: '/guild/fami/bd-center/',
search,
};
const storage = new Map();
const window = {
atob: (value) => Buffer.from(value, 'base64').toString('binary'),
crypto: { randomUUID: () => 'fixed-uuid' },
document: {
currentScript: null,
documentElement: { setAttribute: () => {} },
},
dispatchEvent: () => {},
fetch: (rawURL, options = {}) => {
const url = new URL(rawURL);
requests.push({ url, options });
if (url.pathname === '/api/v1/bd-center/overview')
return Promise.resolve(
apiResponse({
profile: {
user_id: '7',
display_user_id: '100007',
username: 'Fami BD',
contact_info: '+90 555',
},
bd_profile: { user_id: '7' },
})
);
if (url.pathname === '/api/v1/bd-center/stats')
return Promise.resolve(
apiResponse({
items: [
{
agency: {
agency_id: '9',
short_id: '90009',
name: 'Fami Stars',
},
owner: {
display_user_id: '100042',
username: 'Owner',
},
country: 'Türkiye',
total_hosts: 4,
gifted_host_count: 3,
diamond_earnings: 7700,
joined_at_ms: 1750000000000,
},
],
})
);
if (url.pathname === '/api/v1/users/by-display-user-id/100099')
return Promise.resolve(apiResponse({ user_id: '99' }));
return Promise.resolve(apiResponse({}));
},
localStorage: {
getItem: (key) => storage.get(key) || null,
removeItem: (key) => storage.delete(key),
setItem: (key, value) => storage.set(key, String(value)),
},
location,
};
window.window = window;
return {
context: vm.createContext({
Buffer,
CustomEvent: function CustomEvent() {},
Date,
Error,
FormData,
JSON,
Math,
Number,
Object,
Promise,
String,
URL,
URLSearchParams,
console,
document: window.document,
window,
}),
requests,
window,
};
}
function run(context, file) {
vm.runInContext(fs.readFileSync(path.join(root, file), 'utf8'), context, {
filename: file,
});
}
async function main() {
const browser = harness('?token=test-token&env=test');
run(browser.context, 'guild/packages/core/product-context.js');
run(browser.context, 'guild/products/fami/product.js');
run(browser.context, 'common/api.js');
run(browser.context, 'guild/packages/core/date-range.js');
run(browser.context, 'guild/packages/bd-center/bd-center.js');
const range = browser.window.HyGuild.dateRange.create('last_7_days', {
now: new Date(2026, 6, 12),
});
const data = await browser.window.HyGuild.bdCenter.load(range);
assert.equal(data.profile.displayUserId, '100007');
assert.equal(data.stats.agencies[0].diamondEarnings, 7700);
assert.equal(data.stats.agencies[0].country, 'Türkiye');
await browser.window.HyGuild.bdCenter.inviteAgency('100099', 'New Stars');
const invite = browser.requests.find(
({ url }) => url.pathname === '/api/v1/bd/invitations/agency'
);
assert.deepEqual(JSON.parse(invite.options.body), {
command_id: 'fami-bd-invite-agency:fixed-uuid',
target_user_id: '99',
agency_name: 'New Stars',
});
const stats = browser.requests.find(
({ url }) => url.pathname === '/api/v1/bd-center/stats'
);
assert.equal(stats.url.searchParams.get('start_date'), '2026-07-06');
assert.equal(stats.url.searchParams.get('end_date'), '2026-07-12');
browser.requests.forEach(({ options }) =>
assert.equal(options.headers['X-App-Code'], 'fami')
);
const mockBrowser = harness('?mock=1');
run(mockBrowser.context, 'guild/packages/core/product-context.js');
run(mockBrowser.context, 'guild/products/fami/product.js');
run(mockBrowser.context, 'guild/packages/core/date-range.js');
run(mockBrowser.context, 'guild/packages/bd-center/bd-center.js');
const mock = await mockBrowser.window.HyGuild.bdCenter.load(
mockBrowser.window.HyGuild.dateRange.create('today', {
now: new Date(2026, 6, 12),
})
);
assert.equal(mock.stats.agencies.length, 1);
assert.equal(mockBrowser.requests.length, 0);
console.log('Fami BD center tests passed');
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});