import { afterEach, describe, expect, test } from 'bun:test'; import { type AddressInfo, type Server, createServer } from 'node:net'; import { checkProxmoxReachable, formatProxmoxUnreachableError } from './proxmox-preflight'; describe('checkProxmoxReachable', () => { let server: Server | null = null; afterEach(async () => { if (server) { await new Promise((resolve) => server?.close(() => resolve())); server = null; } }); test('returns reachable=true when the host accepts the connection', async () => { server = createServer(); await new Promise((resolve) => server?.listen(0, '127.0.0.1', () => resolve())); const port = (server.address() as AddressInfo).port; const result = await checkProxmoxReachable(`https://127.0.0.1:${port}/api2/json`, 1000); expect(result.reachable).toBe(true); expect(result.host).toBe('127.0.0.1'); expect(result.port).toBe(port); expect(result.error).toBeUndefined(); }); test('returns reachable=false on connection refused', async () => { // Port 1 is reserved and reliably refuses on loopback. const result = await checkProxmoxReachable('https://127.0.0.1:1/api2/json', 1000); expect(result.reachable).toBe(false); expect(result.host).toBe('127.0.0.1'); expect(result.port).toBe(1); expect(result.error).toBeDefined(); }); test('returns reachable=false with timeout error on stalled connect', async () => { // 192.0.2.1 is in TEST-NET-1 (RFC 5737) — guaranteed unroutable. // SYN_SENT will hang until our timeout fires. const result = await checkProxmoxReachable('https://192.0.2.1:8006/api2/json', 200); expect(result.reachable).toBe(false); expect(result.error).toMatch(/timed out/i); }, 5000); test('returns error for an invalid URL', async () => { const result = await checkProxmoxReachable('not-a-url', 100); expect(result.reachable).toBe(false); expect(result.error).toMatch(/invalid/i); }); }); describe('formatProxmoxUnreachableError', () => { test('mentions VPN and the host:port in the message', () => { const message = formatProxmoxUnreachableError({ reachable: false, host: '10.0.30.102', port: 8006, error: 'Connection refused', }); expect(message).toContain('10.0.30.102:8006'); expect(message).toContain('VPN'); expect(message).toContain('Connection refused'); }); });