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:
Hureru
2026-03-16 01:07:14 +08:00
parent f7b163c8b0
commit f36e867e1d
2 changed files with 88 additions and 0 deletions
@@ -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();
});
}); });
+73
View File
@@ -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);
});
}); });