Refactor server picker and limit ping requests
All checks were successful
Build and Deploy Gateway / build-and-push (push) Successful in 15s
Build and Deploy Gateway / deploy (push) Successful in 7s

This commit is contained in:
2026-07-12 13:42:22 +03:00
parent 24fda3e34e
commit 57330f1c78
10 changed files with 612 additions and 83 deletions

View File

@@ -0,0 +1,49 @@
import assert from 'node:assert/strict';
import fs from 'node:fs';
import path from 'node:path';
import test from 'node:test';
import {
autoServer,
filterServers,
groupServers,
SERVER_RESULT_WINDOW,
} from '../../src/web/utils/serverPicker.js';
const root = path.resolve(import.meta.dirname, '../..');
const picker = fs.readFileSync(path.join(root, 'src/web/components/ServerPicker.jsx'), 'utf8');
const overview = fs.readFileSync(path.join(root, 'src/web/components/ClientOverviewPage.jsx'), 'utf8');
const fixtures = (count) => Array.from({ length: count }, (_, index) => ({
id: `srv-${String(count - index).padStart(3, '0')}`,
label: index < 2 ? 'Duplicate' : `Server ${index}`,
host: `node-${index}.example`,
country: index % 2 ? 'NL' : 'DE',
provider: index % 3 ? 'Harbor' : 'Other',
protocol: index % 2 ? 'vless' : 'trojan',
}));
test('server picker handles 1, 30 and 300 stable-ID servers with duplicate labels', () => {
for (const count of [1, 30, 300]) {
const servers = fixtures(count);
assert.equal(filterServers(servers, '').length, count);
assert.equal(new Set(servers.map(({ id }) => id)).size, count);
}
assert.equal(filterServers(fixtures(30), 'node-12.example')[0].id, 'srv-018');
assert.equal(filterServers(fixtures(30), 'trojan').length, 15);
assert.equal(groupServers(fixtures(30)).length, 2);
assert.equal(autoServer(fixtures(30)).id, 'srv-001');
assert.equal(SERVER_RESULT_WINDOW, 60);
});
test('server picker keeps health manual and the rendered result window bounded', () => {
assert.doesNotMatch(overview, /pingAll|servers\.ping/);
assert.match(picker, /onClick={checkVisible}/);
assert.match(picker, /\.slice\(page \* SERVER_RESULT_WINDOW, \(page \+ 1\) \* SERVER_RESULT_WINDOW\)/);
assert.match(picker, /\.slice\(0, 30\)/);
assert.match(picker, /Math\.min\(index, 7\)/);
assert.match(picker, /type="search"/);
assert.match(picker, /harbor-server-favorites/);
assert.match(picker, /harbor-server-recent/);
assert.match(picker, /aria-expanded={!isCollapsed}/);
});