import { afterEach, describe, expect, it, vi } from 'vitest'; import { createOpenCodeNetworkRuntime } from './network-runtime.js'; const originalFetch = globalThis.fetch; const createRuntime = (overrides = {}) => createOpenCodeNetworkRuntime({ state: { openCodePort: 4096, openCodeBaseUrl: null, openCodeApiPrefix: '', openCodeApiPrefixDetected: false, openCodeApiDetectionTimer: null, ...overrides.state, }, getOpenCodeAuthHeaders: () => ({}), configuredOpenCodeHostname: overrides.configuredOpenCodeHostname, }); describe('OpenCode network runtime', () => { afterEach(() => { vi.useRealTimers(); globalThis.fetch = originalFetch; }); it('returns false when readiness fetch rejects', async () => { globalThis.fetch = vi.fn(async () => { throw new Error('offline'); }); const runtime = createRuntime(); const readyPromise = runtime.waitForReady('http://127.0.0.1:4096', 1); await expect(readyPromise).resolves.toBe(false); }); it('builds managed OpenCode URLs against IPv4 loopback by default', () => { const runtime = createRuntime(); expect(runtime.buildOpenCodeUrl('/provider')).toBe('http://127.0.0.1:4096/provider'); }); it('keeps external OpenCode base URLs authoritative', () => { const runtime = createRuntime({ state: { openCodeBaseUrl: 'http://remote.example:4096' }, }); expect(runtime.buildOpenCodeUrl('/provider')).toBe('http://remote.example:4096/provider'); }); it('normalizes wildcard and IPv6 OpenCode bind hosts for local connects', () => { expect(createRuntime({ configuredOpenCodeHostname: '0.0.0.0' }).buildOpenCodeUrl('/provider')) .toBe('http://127.0.0.1:4096/provider'); expect(createRuntime({ configuredOpenCodeHostname: '::1' }).buildOpenCodeUrl('/provider')) .toBe('http://[::1]:4096/provider'); }); });