mirror of
https://github.com/tiennm99/ccs.git
synced 2026-10-20 00:14:58 +00:00
test: isolate shared-state test suites for CI stability
- add dependency injection to export-command, binary-manager, codex-plan-compatibility, config-command, and usage-syncer - override process.exit in api-export test to prevent silent termination in Bun's parallel test runner - harden test-environment bootstrap with process.env isolation - fix auth middleware to avoid config upgrade during checks
This commit is contained in:
1 parent
58891d368d
commit
3af554275e
24 files changed
+764
-614
No files matched your search
@@ -1,26 +1,24 @@
|
||||
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, mock, spyOn } from 'bun:test';
|
||||
import { afterEach, beforeEach, describe, expect, it, spyOn } from 'bun:test';
|
||||
import * as fs from 'fs';
|
||||
import * as os from 'os';
|
||||
import * as path from 'path';
|
||||
import type { CliproxyUsageApiResponse } from '../../../src/cliproxy/stats-fetcher';
|
||||
import { runWithScopedConfigDir } from '../../../src/utils/config-manager';
|
||||
import {
|
||||
loadCachedCliproxyData,
|
||||
startCliproxySync,
|
||||
stopCliproxySync,
|
||||
syncCliproxyUsage,
|
||||
} from '../../../src/web-server/usage/cliproxy-usage-syncer';
|
||||
|
||||
let ccsDir = '';
|
||||
let rawResponse: CliproxyUsageApiResponse | null = null;
|
||||
let fetchCalls = 0;
|
||||
|
||||
mock.module('../../../src/cliproxy/stats-fetcher', () => ({
|
||||
fetchCliproxyUsageRaw: async () => {
|
||||
fetchCalls++;
|
||||
return rawResponse;
|
||||
},
|
||||
}));
|
||||
|
||||
let syncer: typeof import('../../../src/web-server/usage/cliproxy-usage-syncer');
|
||||
|
||||
beforeAll(async () => {
|
||||
syncer = await import('../../../src/web-server/usage/cliproxy-usage-syncer');
|
||||
});
|
||||
function fetchRawResponse(): Promise<CliproxyUsageApiResponse | null> {
|
||||
fetchCalls++;
|
||||
return Promise.resolve(rawResponse);
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
ccsDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ccs-cliproxy-syncer-'));
|
||||
@@ -52,29 +50,25 @@ beforeEach(() => {
|
||||
},
|
||||
},
|
||||
};
|
||||
syncer.stopCliproxySync();
|
||||
stopCliproxySync();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
syncer.stopCliproxySync();
|
||||
stopCliproxySync();
|
||||
fs.rmSync(ccsDir, { recursive: true, force: true });
|
||||
});
|
||||
|
||||
afterAll(() => {
|
||||
mock.restore();
|
||||
});
|
||||
|
||||
describe('cliproxy usage syncer', () => {
|
||||
it('writes and loads snapshot data', async () => {
|
||||
await runWithScopedConfigDir(ccsDir, async () => {
|
||||
await syncer.syncCliproxyUsage();
|
||||
await syncCliproxyUsage(fetchRawResponse);
|
||||
});
|
||||
|
||||
const snapshotPath = path.join(ccsDir, 'cache', 'cliproxy-usage', 'latest.json');
|
||||
expect(fs.existsSync(snapshotPath)).toBe(true);
|
||||
|
||||
const cached = await runWithScopedConfigDir(ccsDir, async () => {
|
||||
return await syncer.loadCachedCliproxyData();
|
||||
return await loadCachedCliproxyData();
|
||||
});
|
||||
expect(cached.daily).toHaveLength(1);
|
||||
expect(cached.daily[0].source).toBe('cliproxy');
|
||||
@@ -87,14 +81,15 @@ describe('cliproxy usage syncer', () => {
|
||||
const intervalSpy = spyOn(globalThis, 'setInterval');
|
||||
|
||||
await runWithScopedConfigDir(ccsDir, async () => {
|
||||
syncer.startCliproxySync();
|
||||
syncer.startCliproxySync();
|
||||
const syncNow = () => syncCliproxyUsage(fetchRawResponse);
|
||||
startCliproxySync(syncNow);
|
||||
startCliproxySync(syncNow);
|
||||
});
|
||||
|
||||
expect(intervalSpy).toHaveBeenCalledTimes(1);
|
||||
expect(fetchCalls).toBeGreaterThan(0);
|
||||
|
||||
syncer.stopCliproxySync();
|
||||
stopCliproxySync();
|
||||
intervalSpy.mockRestore();
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user