Files

55 lines
2.1 KiB
JavaScript

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);
});
});