171 lines
5.8 KiB
JavaScript
171 lines
5.8 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/host-center/${search}`,
|
|
origin: 'https://h5.global-interaction.com',
|
|
pathname: '/guild/fami/host-center/',
|
|
search,
|
|
};
|
|
const storage = new Map();
|
|
const window = {
|
|
atob: (value) => Buffer.from(value, 'base64').toString('binary'),
|
|
document: {
|
|
currentScript: null,
|
|
documentElement: { setAttribute: () => {} },
|
|
},
|
|
dispatchEvent: () => {},
|
|
fetch: (rawURL, options = {}) => {
|
|
const url = new URL(rawURL);
|
|
requests.push({ url, options });
|
|
if (url.pathname === '/api/v1/users/me') {
|
|
return Promise.resolve(
|
|
apiResponse({
|
|
user_id: '42',
|
|
display_user_id: '100042',
|
|
username: 'Fami Host',
|
|
contact_info: '+90 555 0100',
|
|
})
|
|
);
|
|
}
|
|
if (url.pathname === '/api/v1/host-center/agency') {
|
|
return Promise.resolve(
|
|
apiResponse({
|
|
agency: {
|
|
agency_id: '9',
|
|
short_id: '90009',
|
|
name: 'Fami Agency',
|
|
joined_at_ms: 1_750_000_000_000,
|
|
},
|
|
})
|
|
);
|
|
}
|
|
if (url.pathname === '/api/v1/wallet/me/balances') {
|
|
return Promise.resolve(
|
|
apiResponse({
|
|
balances: [
|
|
{ asset_type: 'POINT', available_amount: 8800 },
|
|
],
|
|
})
|
|
);
|
|
}
|
|
if (url.pathname === '/api/v1/host-center/stats') {
|
|
return Promise.resolve(
|
|
apiResponse({
|
|
metrics: {
|
|
diamond_earnings: 700,
|
|
diamond_exchanged: 200,
|
|
gift_senders: 3,
|
|
online_duration_ms: 7200000,
|
|
valid_mic_duration_ms: 3600000,
|
|
valid_mic_days: 1,
|
|
private_message_senders: 4,
|
|
new_followers: 5,
|
|
},
|
|
})
|
|
);
|
|
}
|
|
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;
|
|
const context = vm.createContext({
|
|
Buffer,
|
|
CustomEvent: function CustomEvent() {},
|
|
Date,
|
|
Error,
|
|
FormData,
|
|
JSON,
|
|
Math,
|
|
Number,
|
|
Object,
|
|
Promise,
|
|
String,
|
|
URL,
|
|
URLSearchParams,
|
|
console,
|
|
document: window.document,
|
|
window,
|
|
});
|
|
return { context, 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/host-center/host-center.js');
|
|
|
|
const range = browser.window.HyGuild.dateRange.create('last_7_days', {
|
|
now: new Date(2026, 6, 12),
|
|
});
|
|
const data = await browser.window.HyGuild.hostCenter.load(range);
|
|
assert.equal(data.profile.displayUserId, '100042');
|
|
assert.equal(data.agency.joinedAtMS, 1_750_000_000_000);
|
|
assert.equal(data.pointBalance, 8800);
|
|
assert.equal(data.stats.metrics.private_message_senders, 4);
|
|
assert.deepEqual(Object.keys(data.errors), []);
|
|
|
|
const statsRequest = browser.requests.find(
|
|
({ url }) => url.pathname === '/api/v1/host-center/stats'
|
|
);
|
|
assert.ok(statsRequest, 'host stats endpoint must be requested');
|
|
assert.equal(statsRequest.url.searchParams.get('start_date'), '2026-07-06');
|
|
assert.equal(statsRequest.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/host-center/host-center.js');
|
|
const mock = await mockBrowser.window.HyGuild.hostCenter.load(
|
|
mockBrowser.window.HyGuild.dateRange.create('today', {
|
|
now: new Date(2026, 6, 12),
|
|
})
|
|
);
|
|
assert.equal(mock.pointBalance, 5152051511212);
|
|
assert.equal(mockBrowser.requests.length, 0);
|
|
|
|
console.log('Fami host center tests passed');
|
|
}
|
|
|
|
main().catch((error) => {
|
|
console.error(error);
|
|
process.exitCode = 1;
|
|
});
|