fix(usage): address code review findings - SQL injection, stream usage recording, DB singleton

This commit is contained in:
Gemini Nexus Bot committed 2026-04-22 14:34:39 -03:00
1 parent 1258b32cb5
commit 9b37bdb2d9
11 files changed
+538 -100

No files matched your search

+87
View File
@@ -0,0 +1,87 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { TokenUsageRepo } from '../../ipc/database/usageHandler';
import { usageRouter } from '../../ipc/usage/router';
describe('usageRouter', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('should expose all usage endpoints', () => {
expect(usageRouter).toHaveProperty('recordUsage');
expect(usageRouter).toHaveProperty('getUsageByHour');
expect(usageRouter).toHaveProperty('getUsageByDay');
expect(usageRouter).toHaveProperty('getUsageByWeek');
expect(usageRouter).toHaveProperty('getUsageByMonth');
expect(usageRouter).toHaveProperty('getUsageByModel');
});
it('recordUsage should delegate to TokenUsageRepo.recordUsage', async () => {
const spy = vi.spyOn(TokenUsageRepo, 'recordUsage').mockImplementation(() => true);
const input = {
accountId: 'acc-1',
model: 'gemini-pro',
promptTokens: 10,
completionTokens: 20,
totalTokens: 30,
timestamp: Date.now(),
requestType: 'chat',
};
const handler = (usageRouter.recordUsage as any)['~orpc'].handler;
await handler({ input });
expect(spy).toHaveBeenCalledWith(input);
spy.mockRestore();
});
it('getUsageByHour should delegate to TokenUsageRepo.getUsageByHour', async () => {
const spy = vi.spyOn(TokenUsageRepo, 'getUsageByHour').mockReturnValue([]);
const input = { accountId: 'acc-1', start: 1000, end: 2000 };
const handler = (usageRouter.getUsageByHour as any)['~orpc'].handler;
await handler({ input });
expect(spy).toHaveBeenCalledWith('acc-1', 1000, 2000);
spy.mockRestore();
});
it('getUsageByDay should delegate to TokenUsageRepo.getUsageByDay', async () => {
const spy = vi.spyOn(TokenUsageRepo, 'getUsageByDay').mockReturnValue([]);
const input = { start: 1000, end: 2000 };
const handler = (usageRouter.getUsageByDay as any)['~orpc'].handler;
await handler({ input });
expect(spy).toHaveBeenCalledWith(undefined, 1000, 2000);
spy.mockRestore();
});
it('getUsageByWeek should delegate to TokenUsageRepo.getUsageByWeek', async () => {
const spy = vi.spyOn(TokenUsageRepo, 'getUsageByWeek').mockReturnValue([]);
const input = {};
const handler = (usageRouter.getUsageByWeek as any)['~orpc'].handler;
await handler({ input });
expect(spy).toHaveBeenCalledWith(undefined, undefined, undefined);
spy.mockRestore();
});
it('getUsageByMonth should delegate to TokenUsageRepo.getUsageByMonth', async () => {
const spy = vi.spyOn(TokenUsageRepo, 'getUsageByMonth').mockReturnValue([]);
const input = { accountId: 'acc-2' };
const handler = (usageRouter.getUsageByMonth as any)['~orpc'].handler;
await handler({ input });
expect(spy).toHaveBeenCalledWith('acc-2', undefined, undefined);
spy.mockRestore();
});
it('getUsageByModel should delegate to TokenUsageRepo.getUsageByModel', async () => {
const spy = vi.spyOn(TokenUsageRepo, 'getUsageByModel').mockReturnValue([]);
const input = { accountId: 'acc-1', start: 1, end: 2 };
const handler = (usageRouter.getUsageByModel as any)['~orpc'].handler;
await handler({ input });
expect(spy).toHaveBeenCalledWith('acc-1', 1, 2);
spy.mockRestore();
});
});