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}/); });