test: include colocated cliproxy tests in buckets

This commit is contained in:
Tam Nhu Tran committed 2026-04-30 12:49:57 -04:00
1 parent de6bdde66b
commit 33a1553431
21 files changed
+56 -46

No files matched your search

+1 -1
View File
@@ -5,7 +5,7 @@ const path = require('node:path');
const { spawnSync } = require('node:child_process'); const { spawnSync } = require('node:child_process');
const rootDir = path.resolve(__dirname, '..'); const rootDir = path.resolve(__dirname, '..');
const candidateRoots = ['tests/unit', 'tests/integration', 'tests/npm']; const candidateRoots = ['tests/unit', 'tests/integration', 'tests/npm', 'src'];
// Add a `.ts` test to `slowTests` when ANY of these apply: // Add a `.ts` test to `slowTests` when ANY of these apply:
// 1. It spawns a child process (CLI, bun test, node, gh, etc.). // 1. It spawns a child process (CLI, bun test, node, gh, etc.).
// 2. It binds a port, starts a server, or talks to localhost. // 2. It binds a port, starts a server, or talks to localhost.
@@ -22,7 +22,7 @@ function readCliproxyConfig(homeDir: string): Record<string, any> {
} }
async function loadAiProviderService() { async function loadAiProviderService() {
return import(`../../../src/cliproxy/ai-providers/service?stable-id=${Date.now()}`); return import(`../ai-providers/service?stable-id=${Date.now()}`);
} }
describe('ai-provider service stable ids', () => { describe('ai-provider service stable ids', () => {
+1 -1
View File
@@ -9,7 +9,7 @@ const path = require('path');
const os = require('os'); const os = require('os');
describe('Model Config', () => { describe('Model Config', () => {
const modelConfig = require('../../../dist/cliproxy/model-config'); const modelConfig = require('../../../dist/cliproxy/config/model-config');
const modelCatalog = require('../../../dist/cliproxy/model-catalog'); const modelCatalog = require('../../../dist/cliproxy/model-catalog');
describe('hasUserSettings', () => { describe('hasUserSettings', () => {
@@ -30,7 +30,7 @@ const {
getSessionLockPath, getSessionLockPath,
deleteSessionLockForPort, deleteSessionLockForPort,
} = require('../../../dist/cliproxy/session-tracker'); } = require('../../../dist/cliproxy/session-tracker');
const { CLIPROXY_DEFAULT_PORT } = require('../../../dist/cliproxy/config-generator'); const { CLIPROXY_DEFAULT_PORT } = require('../../../dist/cliproxy/config/config-generator');
const { setGlobalConfigDir } = require('../../../dist/utils/config-manager'); const { setGlobalConfigDir } = require('../../../dist/utils/config-manager');
describe('Session Tracker Port-Specific', function () { describe('Session Tracker Port-Specific', function () {
@@ -29,8 +29,8 @@ describe('Account Manager - discoverExistingAccounts', () => {
process.env.CCS_HOME = testDir; process.env.CCS_HOME = testDir;
// Clear cache and reload - must clear all modular submodules too // Clear cache and reload - must clear all modular submodules too
delete require.cache[require.resolve('../../../../dist/cliproxy/account-manager')]; delete require.cache[require.resolve('../../../../dist/cliproxy/accounts/account-manager')];
delete require.cache[require.resolve('../../../../dist/cliproxy/config-generator')]; delete require.cache[require.resolve('../../../../dist/cliproxy/config/config-generator')];
delete require.cache[require.resolve('../../../../dist/utils/config-manager')]; delete require.cache[require.resolve('../../../../dist/utils/config-manager')];
// Clear new modular structure (accounts/ and config/ submodules) // Clear new modular structure (accounts/ and config/ submodules)
delete require.cache[require.resolve('../../../../dist/cliproxy/accounts/index')]; delete require.cache[require.resolve('../../../../dist/cliproxy/accounts/index')];
@@ -40,7 +40,7 @@ describe('Account Manager - discoverExistingAccounts', () => {
delete require.cache[require.resolve('../../../../dist/cliproxy/accounts/types')]; delete require.cache[require.resolve('../../../../dist/cliproxy/accounts/types')];
delete require.cache[require.resolve('../../../../dist/cliproxy/config/index')]; delete require.cache[require.resolve('../../../../dist/cliproxy/config/index')];
delete require.cache[require.resolve('../../../../dist/cliproxy/config/path-resolver')]; delete require.cache[require.resolve('../../../../dist/cliproxy/config/path-resolver')];
accountManager = require('../../../../dist/cliproxy/account-manager'); accountManager = require('../../../../dist/cliproxy/accounts/account-manager');
}); });
afterEach(() => { afterEach(() => {
@@ -273,10 +273,10 @@ describe('Account Manager - discoverExistingAccounts', () => {
}); });
// Reload module to clear in-memory cache (including all submodules) // Reload module to clear in-memory cache (including all submodules)
delete require.cache[require.resolve('../../../../dist/cliproxy/account-manager')]; delete require.cache[require.resolve('../../../../dist/cliproxy/accounts/account-manager')];
delete require.cache[require.resolve('../../../../dist/cliproxy/accounts/index')]; delete require.cache[require.resolve('../../../../dist/cliproxy/accounts/index')];
delete require.cache[require.resolve('../../../../dist/cliproxy/accounts/registry')]; delete require.cache[require.resolve('../../../../dist/cliproxy/accounts/registry')];
accountManager = require('../../../../dist/cliproxy/account-manager'); accountManager = require('../../../../dist/cliproxy/accounts/account-manager');
accountManager.discoverExistingAccounts(); accountManager.discoverExistingAccounts();
const accounts = getAccountsFile(); const accounts = getAccountsFile();
@@ -357,10 +357,10 @@ describe('Account Manager - discoverExistingAccounts', () => {
}); });
// Reload module to pick up pre-existing accounts.json (including all submodules) // Reload module to pick up pre-existing accounts.json (including all submodules)
delete require.cache[require.resolve('../../../../dist/cliproxy/account-manager')]; delete require.cache[require.resolve('../../../../dist/cliproxy/accounts/account-manager')];
delete require.cache[require.resolve('../../../../dist/cliproxy/accounts/index')]; delete require.cache[require.resolve('../../../../dist/cliproxy/accounts/index')];
delete require.cache[require.resolve('../../../../dist/cliproxy/accounts/registry')]; delete require.cache[require.resolve('../../../../dist/cliproxy/accounts/registry')];
accountManager = require('../../../../dist/cliproxy/account-manager'); accountManager = require('../../../../dist/cliproxy/accounts/account-manager');
accountManager.discoverExistingAccounts(); accountManager.discoverExistingAccounts();
const accounts = getAccountsFile(); const accounts = getAccountsFile();
@@ -39,7 +39,7 @@ function createCodexSettingsFixture(haikuModel: string = 'gpt-5.4-mini'): {
} }
async function importCompatibilityModule(cacheTag: string) { async function importCompatibilityModule(cacheTag: string) {
return import(`../../codex-plan-compatibility?${cacheTag}=${Date.now()}`); return import(`../codex-plan-compatibility?${cacheTag}=${Date.now()}`);
} }
const identity = (message: string) => message; const identity = (message: string) => message;
@@ -4,7 +4,7 @@ const {
buildCodexModelEffortMap, buildCodexModelEffortMap,
getEffortForModel, getEffortForModel,
injectReasoningEffortIntoBody, injectReasoningEffortIntoBody,
} = require('../../../../dist/cliproxy/codex-reasoning-proxy'); } = require('../../../../dist/cliproxy/ai-providers/codex-reasoning-proxy');
describe('Codex Reasoning Proxy', () => { describe('Codex Reasoning Proxy', () => {
describe('buildCodexModelEffortMap', () => { describe('buildCodexModelEffortMap', () => {
@@ -17,12 +17,14 @@ describe('openai-compat manager', () => {
process.env.CCS_HOME = testDir; process.env.CCS_HOME = testDir;
process.env.CCS_DIR = path.join(testDir, '.ccs'); process.env.CCS_DIR = path.join(testDir, '.ccs');
delete require.cache[require.resolve('../../../../dist/cliproxy/config-generator')]; delete require.cache[require.resolve('../../../../dist/cliproxy/config/config-generator')];
delete require.cache[require.resolve('../../../../dist/cliproxy/openai-compat-manager')]; delete require.cache[
require.resolve('../../../../dist/cliproxy/ai-providers/openai-compat-manager')
];
delete require.cache[require.resolve('../../../../dist/utils/config-manager')]; delete require.cache[require.resolve('../../../../dist/utils/config-manager')];
configGenerator = require('../../../../dist/cliproxy/config-generator'); configGenerator = require('../../../../dist/cliproxy/config/config-generator');
openAICompatManager = require('../../../../dist/cliproxy/openai-compat-manager'); openAICompatManager = require('../../../../dist/cliproxy/ai-providers/openai-compat-manager');
}); });
afterEach(() => { afterEach(() => {
@@ -19,8 +19,8 @@ describe('Auth Token Manager', () => {
beforeEach(() => { beforeEach(() => {
// Clear cache and reload // Clear cache and reload
delete require.cache[require.resolve('../../../../dist/cliproxy/auth-token-manager')]; delete require.cache[require.resolve('../../../../dist/cliproxy/auth/auth-token-manager')];
const authTokenManager = require('../../../../dist/cliproxy/auth-token-manager'); const authTokenManager = require('../../../../dist/cliproxy/auth/auth-token-manager');
generateSecureToken = authTokenManager.generateSecureToken; generateSecureToken = authTokenManager.generateSecureToken;
}); });
@@ -398,8 +398,8 @@ describe('Auth Token Manager', () => {
let CCS_CONTROL_PANEL_SECRET; let CCS_CONTROL_PANEL_SECRET;
beforeEach(() => { beforeEach(() => {
delete require.cache[require.resolve('../../../../dist/cliproxy/config-generator')]; delete require.cache[require.resolve('../../../../dist/cliproxy/config/config-generator')];
const configGenerator = require('../../../../dist/cliproxy/config-generator'); const configGenerator = require('../../../../dist/cliproxy/config/config-generator');
CCS_INTERNAL_API_KEY = configGenerator.CCS_INTERNAL_API_KEY; CCS_INTERNAL_API_KEY = configGenerator.CCS_INTERNAL_API_KEY;
CCS_CONTROL_PANEL_SECRET = configGenerator.CCS_CONTROL_PANEL_SECRET; CCS_CONTROL_PANEL_SECRET = configGenerator.CCS_CONTROL_PANEL_SECRET;
}); });
@@ -36,10 +36,10 @@ describe('Gemini refresh delegation', () => {
it('treats Gemini as runtime-managed even when the local token lacks OAuth client metadata', async () => { it('treats Gemini as runtime-managed even when the local token lacks OAuth client metadata', async () => {
const { getProviderAuthDir } = await import( const { getProviderAuthDir } = await import(
`../../../src/cliproxy/config-generator?gemini-delegation-config=${moduleVersion}` `../../config/config-generator?gemini-delegation-config=${moduleVersion}`
); );
const { ensureTokenValid } = await import( const { ensureTokenValid } = await import(
`../../../src/cliproxy/auth/token-manager?gemini-delegation-manager=${moduleVersion}` `../token-manager?gemini-delegation-manager=${moduleVersion}`
); );
const authDir = getProviderAuthDir('gemini'); const authDir = getProviderAuthDir('gemini');
@@ -6,7 +6,7 @@
const assert = require('assert'); const assert = require('assert');
describe('Backend Selection', () => { describe('Backend Selection', () => {
const platformDetector = require('../../../../dist/cliproxy/platform-detector'); const platformDetector = require('../../../../dist/cliproxy/binary/platform-detector');
const types = require('../../../../dist/cliproxy/types'); const types = require('../../../../dist/cliproxy/types');
describe('BACKEND_CONFIG', () => { describe('BACKEND_CONFIG', () => {
@@ -26,7 +26,7 @@ const {
deleteConfigForPort, deleteConfigForPort,
deleteConfig, deleteConfig,
CLIPROXY_DEFAULT_PORT, CLIPROXY_DEFAULT_PORT,
} = require('../../../../dist/cliproxy/config-generator'); } = require('../../../../dist/cliproxy/config/config-generator');
describe('Config Generator Port', function () { describe('Config Generator Port', function () {
let cliproxyDir; let cliproxyDir;
@@ -15,7 +15,7 @@ describe('Config Generator', () => {
beforeEach(() => { beforeEach(() => {
// Clear the require cache to reload module with fresh mocks // Clear the require cache to reload module with fresh mocks
delete require.cache[require.resolve('../../../../dist/cliproxy/config-generator')]; delete require.cache[require.resolve('../../../../dist/cliproxy/config/config-generator')];
// Set up a temporary test directory as CCS_HOME // Set up a temporary test directory as CCS_HOME
mockCcsDir = '/test/home/.ccs'; mockCcsDir = '/test/home/.ccs';
@@ -174,8 +174,8 @@ describe('Config Generator', () => {
beforeEach(() => { beforeEach(() => {
// Clear cache and reload module // Clear cache and reload module
delete require.cache[require.resolve('../../../../dist/cliproxy/config-generator')]; delete require.cache[require.resolve('../../../../dist/cliproxy/config/config-generator')];
const configGenerator = require('../../../../dist/cliproxy/config-generator'); const configGenerator = require('../../../../dist/cliproxy/config/config-generator');
parseUserApiKeys = configGenerator.parseUserApiKeys; parseUserApiKeys = configGenerator.parseUserApiKeys;
}); });
@@ -374,9 +374,9 @@ auth-dir: "/test"
process.env.CCS_HOME = testDir; process.env.CCS_HOME = testDir;
// Clear cache and reload module // Clear cache and reload module
delete require.cache[require.resolve('../../../../dist/cliproxy/config-generator')]; delete require.cache[require.resolve('../../../../dist/cliproxy/config/config-generator')];
delete require.cache[require.resolve('../../../../dist/utils/config-manager')]; delete require.cache[require.resolve('../../../../dist/utils/config-manager')];
const configGenerator = require('../../../../dist/cliproxy/config-generator'); const configGenerator = require('../../../../dist/cliproxy/config/config-generator');
regenerateConfig = configGenerator.regenerateConfig; regenerateConfig = configGenerator.regenerateConfig;
getCliproxyConfigPath = configGenerator.getCliproxyConfigPath; getCliproxyConfigPath = configGenerator.getCliproxyConfigPath;
}); });
@@ -599,9 +599,9 @@ auth-dir: "${cliproxyDir.replace(/\\/g, '/')}/auth"
originalCcsHome = process.env.CCS_HOME; originalCcsHome = process.env.CCS_HOME;
process.env.CCS_HOME = testDir; process.env.CCS_HOME = testDir;
delete require.cache[require.resolve('../../../../dist/cliproxy/config-generator')]; delete require.cache[require.resolve('../../../../dist/cliproxy/config/config-generator')];
delete require.cache[require.resolve('../../../../dist/utils/config-manager')]; delete require.cache[require.resolve('../../../../dist/utils/config-manager')];
const configGenerator = require('../../../../dist/cliproxy/config-generator'); const configGenerator = require('../../../../dist/cliproxy/config/config-generator');
regenerateConfig = configGenerator.regenerateConfig; regenerateConfig = configGenerator.regenerateConfig;
}); });
@@ -25,7 +25,7 @@ const {
saveVariantLegacy, saveVariantLegacy,
removeVariantFromLegacyConfig, removeVariantFromLegacyConfig,
} = require('../../../../dist/cliproxy/services/variant-config-adapter'); } = require('../../../../dist/cliproxy/services/variant-config-adapter');
const { CLIPROXY_DEFAULT_PORT } = require('../../../../dist/cliproxy/config-generator'); const { CLIPROXY_DEFAULT_PORT } = require('../../../../dist/cliproxy/config/config-generator');
describe('Variant Port Allocation', function () { describe('Variant Port Allocation', function () {
let configPath; let configPath;
@@ -38,7 +38,7 @@ const {
deleteConfigForPort, deleteConfigForPort,
configExists, configExists,
generateConfig, generateConfig,
} = require('../../../../dist/cliproxy/config-generator'); } = require('../../../../dist/cliproxy/config/config-generator');
describe('Variant Port Edge Cases', function () { describe('Variant Port Edge Cases', function () {
let configPath; let configPath;
@@ -43,7 +43,7 @@ const {
deleteConfigForPort, deleteConfigForPort,
getConfigPathForPort, getConfigPathForPort,
CLIPROXY_DEFAULT_PORT, CLIPROXY_DEFAULT_PORT,
} = require('../../../../dist/cliproxy/config-generator'); } = require('../../../../dist/cliproxy/config/config-generator');
describe('PR #184: Variant Port Isolation Integration', function () { describe('PR #184: Variant Port Isolation Integration', function () {
let configPath; let configPath;
@@ -11,7 +11,7 @@ const {
hasProxyFlags, hasProxyFlags,
PROXY_CLI_FLAGS, PROXY_CLI_FLAGS,
PROXY_ENV_VARS, PROXY_ENV_VARS,
} = require('../../../../dist/cliproxy/proxy-config-resolver'); } = require('../../../../dist/cliproxy/proxy/proxy-config-resolver');
describe('proxy-config-resolver', () => { describe('proxy-config-resolver', () => {
describe('PROXY_CLI_FLAGS', () => { describe('PROXY_CLI_FLAGS', () => {
@@ -31,8 +31,10 @@ describe('Antigravity quota failure metadata', () => {
it('preserves entitlement evidence when project lookup fails before quota fetch', async () => { it('preserves entitlement evidence when project lookup fails before quota fetch', async () => {
const moduleId = Date.now() + Math.random(); const moduleId = Date.now() + Math.random();
const { fetchAccountQuota } = await import(`../../quota-fetcher?agy-early=${moduleId}`); const { fetchAccountQuota } = await import(`../quota-fetcher?agy-early=${moduleId}`);
const { getProviderAuthDir } = await import(`../../config-generator?agy-config=${moduleId}`); const { getProviderAuthDir } = await import(
`../../config/config-generator?agy-config=${moduleId}`
);
const fs = await import('node:fs'); const fs = await import('node:fs');
const os = await import('node:os'); const os = await import('node:os');
const path = await import('node:path'); const path = await import('node:path');
@@ -83,10 +85,10 @@ describe('Antigravity quota failure metadata', () => {
it('attaches entitlement evidence when project lookup returns an invalid 2xx payload', async () => { it('attaches entitlement evidence when project lookup returns an invalid 2xx payload', async () => {
const moduleId = Date.now() + Math.random(); const moduleId = Date.now() + Math.random();
const { fetchAccountQuota } = await import( const { fetchAccountQuota } = await import(`../quota-fetcher?agy-invalid-project=${moduleId}`);
`../../quota-fetcher?agy-invalid-project=${moduleId}` const { getProviderAuthDir } = await import(
`../../config/config-generator?agy-config=${moduleId}`
); );
const { getProviderAuthDir } = await import(`../../config-generator?agy-config=${moduleId}`);
const fs = await import('node:fs'); const fs = await import('node:fs');
const os = await import('node:os'); const os = await import('node:os');
const path = await import('node:path'); const path = await import('node:path');
@@ -137,10 +139,10 @@ describe('Antigravity quota failure metadata', () => {
it('preserves live tier evidence when quota fetch fails after a successful project lookup', async () => { it('preserves live tier evidence when quota fetch fails after a successful project lookup', async () => {
const moduleId = Date.now() + Math.random(); const moduleId = Date.now() + Math.random();
const { fetchAccountQuota } = await import( const { fetchAccountQuota } = await import(`../quota-fetcher?agy-invalid-models=${moduleId}`);
`../../quota-fetcher?agy-invalid-models=${moduleId}` const { getProviderAuthDir } = await import(
`../../config/config-generator?agy-config=${moduleId}`
); );
const { getProviderAuthDir } = await import(`../../config-generator?agy-config=${moduleId}`);
const fs = await import('node:fs'); const fs = await import('node:fs');
const os = await import('node:os'); const os = await import('node:os');
const path = await import('node:path'); const path = await import('node:path');
@@ -8,7 +8,7 @@ import * as fs from 'fs';
import * as os from 'os'; import * as os from 'os';
import * as path from 'path'; import * as path from 'path';
import { afterEach, beforeEach, describe, expect, it } from 'bun:test'; import { afterEach, beforeEach, describe, expect, it } from 'bun:test';
import { getCapturedFetchRequests, mockFetch, restoreFetch } from '../../../../tests/unit/mocks'; import { getCapturedFetchRequests, mockFetch, restoreFetch } from '../../../../tests/mocks';
describe('Gemini CLI Quota Fetcher', () => { describe('Gemini CLI Quota Fetcher', () => {
const GEMINI_QUOTA_URL = 'https://cloudcode-pa.googleapis.com/v1internal:retrieveUserQuota'; const GEMINI_QUOTA_URL = 'https://cloudcode-pa.googleapis.com/v1internal:retrieveUserQuota';
@@ -8,7 +8,7 @@ import { describe, it, expect, beforeEach, afterEach } from 'bun:test';
import * as fs from 'fs'; import * as fs from 'fs';
import * as path from 'path'; import * as path from 'path';
import * as os from 'os'; import * as os from 'os';
import { mockFetch, restoreFetch, getCapturedFetchRequests } from '../../../../tests/unit/mocks'; import { mockFetch, restoreFetch, getCapturedFetchRequests } from '../../../../tests/mocks';
describe('remote-token-uploader', () => { describe('remote-token-uploader', () => {
let tempDir: string; let tempDir: string;
@@ -32,6 +32,12 @@ describe('run-test-bucket', () => {
expect(bucket.shouldForceSlow('tests/npm/cli.test.js')).toBe(true); expect(bucket.shouldForceSlow('tests/npm/cli.test.js')).toBe(true);
}); });
test('discovers colocated backend tests under src', () => {
const discovered = bucket.getDiscoveredTests();
expect(discovered).toContain('src/cliproxy/types/__tests__/types-backward-compat.test.ts');
});
test('keeps dist-independent javascript tests in the fast bucket', () => { test('keeps dist-independent javascript tests in the fast bucket', () => {
expect(bucket.shouldForceSlow('tests/unit/flag-parsing-simple.test.js')).toBe(false); expect(bucket.shouldForceSlow('tests/unit/flag-parsing-simple.test.js')).toBe(false);
}); });