up
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
const assert = require('node:assert/strict');
|
||||
const { readFileSync } = require('node:fs');
|
||||
const { resolve } = require('node:path');
|
||||
const { test } = require('node:test');
|
||||
const { runInNewContext } = require('node:vm');
|
||||
|
||||
const root = resolve(__dirname, '../../');
|
||||
const source = readFileSync(resolve(root, 'reproxy/web/minecraft/app.js'), 'utf8');
|
||||
|
||||
async function renderStatus(response, error) {
|
||||
const elements = Object.fromEntries(['server-status', 'build-status', 'build-download'].map(id => [id, {}]));
|
||||
const requests = [];
|
||||
let refresh;
|
||||
const context = {
|
||||
document: { getElementById: id => elements[id] },
|
||||
AbortSignal,
|
||||
TextDecoder,
|
||||
Uint8Array,
|
||||
atob,
|
||||
fetch: async (url, options) => {
|
||||
requests.push({ url, options });
|
||||
if (url.endsWith('/readme')) {
|
||||
return { ok: true, json: async () => ({ encoding: 'base64', content: Buffer.from('Актуальная версия — **1.2.3**: [Скачать 1.2.3](dist/minecraft-lab-neoforge-spike-1.2.3/minecraft-lab-neoforge-spike-1.2.3.mrpack)').toString('base64') }) };
|
||||
}
|
||||
if (error) throw error;
|
||||
return response;
|
||||
},
|
||||
setInterval: (callback, delay) => { refresh = { callback, delay }; },
|
||||
};
|
||||
runInNewContext(source, context);
|
||||
await new Promise(setImmediate);
|
||||
assert.equal(elements['build-download'].hidden, false);
|
||||
assert.match(elements['build-download'].href, /1\.2\.3\.mrpack$/);
|
||||
assert.equal(refresh.delay, 300000);
|
||||
await refresh.callback();
|
||||
assert.equal(requests.filter(request => request.url === '/minecraft/api/status').length, 2);
|
||||
assert.ok(requests.every(request => request.options.signal instanceof AbortSignal));
|
||||
return elements['server-status'].textContent;
|
||||
}
|
||||
|
||||
for (const [name, data, expected] of [
|
||||
['positive count', { online: true, players: { online: 7 } }, 'Игроков онлайн: 7'],
|
||||
['zero count', { online: true, players: { online: 0 } }, 'Игроков онлайн: 0'],
|
||||
['offline', { online: false }, 'Сервер недоступен'],
|
||||
...[null, {}, { online: true }, { online: true, players: { online: -1 } }, { online: true, players: { online: '2' } }].map(data => ['invalid response ' + JSON.stringify(data), data, 'Не удалось получить онлайн']),
|
||||
]) {
|
||||
test(name, async () => assert.equal(await renderStatus({ ok: true, json: async () => data }), expected));
|
||||
}
|
||||
|
||||
test('HTTP failure', async () => assert.equal(await renderStatus({ ok: false }), 'Не удалось получить онлайн'));
|
||||
test('invalid JSON', async () => assert.equal(await renderStatus({ ok: true, json: async () => { throw new SyntaxError(); } }), 'Не удалось получить онлайн'));
|
||||
test('timeout', async () => assert.equal(await renderStatus(null, new DOMException('Timeout', 'TimeoutError')), 'Не удалось получить онлайн'));
|
||||
test('network failure', async () => assert.equal(await renderStatus(null, new TypeError('Failed to fetch')), 'Не удалось получить онлайн'));
|
||||
|
||||
test('Telemost link and initial status', () => {
|
||||
const html = readFileSync(resolve(root, 'reproxy/web/minecraft/index.html'), 'utf8');
|
||||
assert.match(html, /href="https:\/\/telemost\.yandex\.ru\/j\/76726739040099\?skip_app=1" target="_blank" rel="noopener noreferrer"/);
|
||||
assert.match(html, /id="server-status" role="status">Проверяем онлайн…/);
|
||||
});
|
||||
Reference in New Issue
Block a user