Spaces:
Sleeping
Sleeping
File size: 3,600 Bytes
ed57015 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import {
applyProxyUrl,
applyProxyEnabled,
applyProxyBypass,
getProxyUrl,
isProxyEnabled,
getProxyBypassPlatforms,
isProxyActive,
proxyFetch,
} from '../../lib/proxy.js';
// Reset module-level proxy state before each test so cases don't bleed into
// each other (the lib keeps a process-wide config + a short dispatcher cache).
beforeEach(() => {
delete process.env.PROXY_URL;
applyProxyEnabled(true);
applyProxyBypass('');
applyProxyUrl(''); // clears the URL and the dispatcher cache
});
afterEach(() => {
vi.restoreAllMocks();
delete process.env.PROXY_URL;
});
const okResponse = () => ({ ok: true, status: 200 }) as Response;
describe('proxy config accessors', () => {
it('PROXY_URL env wins over the DB value', () => {
process.env.PROXY_URL = 'http://env-proxy:8080';
applyProxyUrl('http://db-proxy:3128');
expect(getProxyUrl()).toBe('http://env-proxy:8080');
});
it('falls back to the DB value when no env var is set', () => {
applyProxyUrl('http://db-proxy:3128');
expect(getProxyUrl()).toBe('http://db-proxy:3128');
});
it('parses the comma-separated bypass list', () => {
applyProxyBypass('groq, Google ,, cerebras');
expect(getProxyBypassPlatforms().sort()).toEqual(['cerebras', 'google', 'groq']);
});
it('isProxyActive is false when no proxy URL is configured', () => {
expect(isProxyActive()).toBe(false);
});
it('isProxyActive is true when an HTTP proxy is configured and enabled', () => {
applyProxyUrl('http://proxy:8080');
expect(isProxyActive()).toBe(true);
});
it('isProxyActive is false when a proxy is configured but disabled', () => {
applyProxyUrl('http://proxy:8080');
applyProxyEnabled(false);
expect(isProxyEnabled()).toBe(false);
expect(isProxyActive()).toBe(false);
});
});
describe('proxyFetch routing', () => {
it('passes straight through to fetch when no proxy is configured (default for all users)', async () => {
const spy = vi.spyOn(global, 'fetch').mockResolvedValue(okResponse());
await proxyFetch('https://api.example.com/v1', { method: 'POST' });
expect(spy).toHaveBeenCalledTimes(1);
const [, init] = spy.mock.calls[0];
// No dispatcher injected on the direct path.
expect((init as any)?.dispatcher).toBeUndefined();
});
it('routes through the dispatcher for an HTTP proxy', async () => {
applyProxyUrl('http://proxy:8080');
const spy = vi.spyOn(global, 'fetch').mockResolvedValue(okResponse());
await proxyFetch('https://api.example.com/v1', { method: 'POST' }, 'groq');
expect(spy).toHaveBeenCalledTimes(1);
const [, init] = spy.mock.calls[0];
expect((init as any)?.dispatcher).toBeDefined();
});
it('bypasses the proxy for a platform on the bypass list', async () => {
applyProxyUrl('http://proxy:8080');
applyProxyBypass('groq');
const spy = vi.spyOn(global, 'fetch').mockResolvedValue(okResponse());
await proxyFetch('https://api.example.com/v1', { method: 'POST' }, 'groq');
const [, init] = spy.mock.calls[0];
expect((init as any)?.dispatcher).toBeUndefined(); // direct, not proxied
});
it('bypasses the proxy globally when disabled', async () => {
applyProxyUrl('http://proxy:8080');
applyProxyEnabled(false);
const spy = vi.spyOn(global, 'fetch').mockResolvedValue(okResponse());
await proxyFetch('https://api.example.com/v1', undefined, 'google');
const [, init] = spy.mock.calls[0];
expect((init as any)?.dispatcher).toBeUndefined();
});
});
|