forked from boos/BoosAPI
test(proxy): add tests for account-level proxy resolution
Cover getProxyUrlFromExtraConfig, resolveChannelProxyUrl, withSiteRecordProxyRequestInit third parameter, and withAccountProxyOverride ALS context propagation.
This commit is contained in:
@@ -2,6 +2,7 @@ import { describe, expect, it } from 'vitest';
|
|||||||
import {
|
import {
|
||||||
getCredentialModeFromExtraConfig,
|
getCredentialModeFromExtraConfig,
|
||||||
getPlatformUserIdFromExtraConfig,
|
getPlatformUserIdFromExtraConfig,
|
||||||
|
getProxyUrlFromExtraConfig,
|
||||||
getSub2ApiAuthFromExtraConfig,
|
getSub2ApiAuthFromExtraConfig,
|
||||||
guessPlatformUserIdFromUsername,
|
guessPlatformUserIdFromUsername,
|
||||||
mergeAccountExtraConfig,
|
mergeAccountExtraConfig,
|
||||||
@@ -67,4 +68,18 @@ describe('accountExtraConfig', () => {
|
|||||||
sub2apiAuth: { refreshToken: ' ' },
|
sub2apiAuth: { refreshToken: ' ' },
|
||||||
}))).toBeNull();
|
}))).toBeNull();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('reads proxyUrl from extra config', () => {
|
||||||
|
expect(getProxyUrlFromExtraConfig(JSON.stringify({ proxyUrl: 'http://127.0.0.1:7890' }))).toBe('http://127.0.0.1:7890');
|
||||||
|
expect(getProxyUrlFromExtraConfig(JSON.stringify({ proxyUrl: ' socks5://proxy.local:1080 ' }))).toBe('socks5://proxy.local:1080');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns null for missing or empty proxyUrl', () => {
|
||||||
|
expect(getProxyUrlFromExtraConfig(JSON.stringify({}))).toBeNull();
|
||||||
|
expect(getProxyUrlFromExtraConfig(JSON.stringify({ proxyUrl: '' }))).toBeNull();
|
||||||
|
expect(getProxyUrlFromExtraConfig(JSON.stringify({ proxyUrl: ' ' }))).toBeNull();
|
||||||
|
expect(getProxyUrlFromExtraConfig(null)).toBeNull();
|
||||||
|
expect(getProxyUrlFromExtraConfig(undefined)).toBeNull();
|
||||||
|
expect(getProxyUrlFromExtraConfig('invalid-json')).toBeNull();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -115,4 +115,77 @@ describe('siteProxy', () => {
|
|||||||
expect(headers.get('x-site-scope')).toBe('site-level');
|
expect(headers.get('x-site-scope')).toBe('site-level');
|
||||||
expect(headers.get('x-request-id')).toBe('req-1');
|
expect(headers.get('x-request-id')).toBe('req-1');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('resolveChannelProxyUrl prefers account proxy over site proxy', async () => {
|
||||||
|
const { resolveChannelProxyUrl } = await import('./siteProxy.js');
|
||||||
|
|
||||||
|
const accountConfig = JSON.stringify({ proxyUrl: 'http://account-proxy:8080' });
|
||||||
|
const siteWithProxy = { useSystemProxy: true };
|
||||||
|
|
||||||
|
expect(resolveChannelProxyUrl(siteWithProxy, accountConfig)).toBe('http://account-proxy:8080');
|
||||||
|
expect(resolveChannelProxyUrl(siteWithProxy, null)).toBeNull();
|
||||||
|
expect(resolveChannelProxyUrl(siteWithProxy, JSON.stringify({}))).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('withSiteRecordProxyRequestInit uses account proxy when provided', async () => {
|
||||||
|
const { withSiteRecordProxyRequestInit } = await import('./siteProxy.js');
|
||||||
|
const result = withSiteRecordProxyRequestInit(
|
||||||
|
{ useSystemProxy: false },
|
||||||
|
{ method: 'POST' },
|
||||||
|
'http://account-proxy:8080',
|
||||||
|
);
|
||||||
|
expect('dispatcher' in result).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('withSiteRecordProxyRequestInit ignores invalid account proxy', async () => {
|
||||||
|
const { withSiteRecordProxyRequestInit } = await import('./siteProxy.js');
|
||||||
|
const result = withSiteRecordProxyRequestInit(
|
||||||
|
{ useSystemProxy: false },
|
||||||
|
{ method: 'POST' },
|
||||||
|
'not-a-url',
|
||||||
|
);
|
||||||
|
expect('dispatcher' in result).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('withAccountProxyOverride sets ALS context for nested proxy calls', async () => {
|
||||||
|
const { withAccountProxyOverride, withSiteProxyRequestInit } = await import('./siteProxy.js');
|
||||||
|
|
||||||
|
await db.insert(schema.sites).values({
|
||||||
|
name: 'als-site',
|
||||||
|
url: 'https://als-site.example.com',
|
||||||
|
platform: 'new-api',
|
||||||
|
}).run();
|
||||||
|
|
||||||
|
const result = await withAccountProxyOverride(
|
||||||
|
'http://account-als-proxy:9090',
|
||||||
|
async () => {
|
||||||
|
return withSiteProxyRequestInit('https://als-site.example.com/v1/models', {
|
||||||
|
method: 'GET',
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
expect('dispatcher' in result).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('withAccountProxyOverride skips ALS when proxy is null', async () => {
|
||||||
|
const { withAccountProxyOverride, withSiteProxyRequestInit } = await import('./siteProxy.js');
|
||||||
|
|
||||||
|
await db.insert(schema.sites).values({
|
||||||
|
name: 'als-null-site',
|
||||||
|
url: 'https://als-null-site.example.com',
|
||||||
|
platform: 'new-api',
|
||||||
|
}).run();
|
||||||
|
|
||||||
|
const result = await withAccountProxyOverride(
|
||||||
|
null,
|
||||||
|
async () => {
|
||||||
|
return withSiteProxyRequestInit('https://als-null-site.example.com/v1/models', {
|
||||||
|
method: 'GET',
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
expect('dispatcher' in result).toBe(false);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user