const openaiService = require('../src/services/openaiService'); describe('OpenAI usage request caching', () => { let originalCostsFetcher; let originalOrganizationFetcher; beforeEach(() => { originalCostsFetcher = openaiService._fetchOpenAICostsUncached; originalOrganizationFetcher = openaiService._fetchOrganizationUsageOverview; openaiService.openaiCostsCache.clear(); openaiService.openaiCostsRequests.clear(); openaiService.organizationUsageCache.clear(); openaiService.organizationUsageRequests.clear(); }); afterEach(() => { openaiService._fetchOpenAICostsUncached = originalCostsFetcher; openaiService._fetchOrganizationUsageOverview = originalOrganizationFetcher; }); test('deduplicates concurrent cost requests and serves the cached result', async () => { const result = { totalCost: 1.25, source: 'openai_api' }; openaiService._fetchOpenAICostsUncached = jest.fn(async () => result); const responses = await Promise.all([ openaiService.fetchOpenAICosts(30), openaiService.fetchOpenAICosts(30), openaiService.fetchOpenAICosts(30) ]); const cachedResponse = await openaiService.fetchOpenAICosts(30); expect(responses).toEqual([result, result, result]); expect(cachedResponse).toBe(result); expect(openaiService._fetchOpenAICostsUncached).toHaveBeenCalledTimes(1); }); test('deduplicates concurrent organization usage requests', async () => { const result = { available: true, summary: { totalCost: 0, totalRequests: 0, totalTokens: 0, projectCount: 4 } }; openaiService._fetchOrganizationUsageOverview = jest.fn(async () => result); const responses = await Promise.all([ openaiService.getOrganizationUsageOverview({ daysBack: 30 }), openaiService.getOrganizationUsageOverview({ daysBack: 30 }) ]); const cachedResponse = await openaiService.getOrganizationUsageOverview({ daysBack: 30 }); expect(responses).toEqual([result, result]); expect(cachedResponse).toBe(result); expect(openaiService._fetchOrganizationUsageOverview).toHaveBeenCalledTimes(1); }); });