Files
RedditBot/tests/ai-usage-repository.test.ts
T

33 lines
1.7 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { AiUsageRepository } from '../src/database/ai-usage-repository.js';
import { createTestDb } from './testUtils.js';
describe('AiUsageRepository', () => {
it('aggregates cost, tokens, outcomes, and latency by actual model', () => {
const db = createTestDb();
const repo = new AiUsageRepository(db);
const now = Date.parse('2026-08-09T10:00:00Z');
repo.record({ operation: 'generateReply', requestedModel: 'router', actualModel: 'model-a', outcome: 'success', promptTokens: 100, completionTokens: 20, totalTokens: 120, costUsd: 0.0012, latencyMs: 400, createdAt: now });
repo.record({ operation: 'generateReply', requestedModel: 'model-a', actualModel: 'model-a', outcome: 'refusal', promptTokens: 40, completionTokens: 5, totalTokens: 45, costUsd: 0.0003, latencyMs: 200, createdAt: now });
repo.record({ operation: 'analyzeImage', requestedModel: 'model-b', outcome: 'error', latencyMs: 900, error: 'provider unavailable', createdAt: now });
expect(repo.getSummary(30, now)).toEqual({
days: 30,
requests: 3,
successes: 1,
refusals: 1,
errors: 1,
promptTokens: 140,
completionTokens: 25,
totalTokens: 165,
costUsd: 0.0015,
averageLatencyMs: 500,
models: [
{ model: 'model-a', requests: 2, successes: 1, refusals: 1, errors: 0, promptTokens: 140, completionTokens: 25, totalTokens: 165, costUsd: 0.0015, averageLatencyMs: 300 },
{ model: 'model-b', requests: 1, successes: 0, refusals: 0, errors: 1, promptTokens: 0, completionTokens: 0, totalTokens: 0, costUsd: 0, averageLatencyMs: 900 },
],
});
db.close();
});
});