import { describe, it, expect, vi, beforeEach } from 'vitest' const { mockQueryRaw } = vi.hoisted(() => ({ mockQueryRaw: vi.fn() })) vi.mock('@/lib/prisma', () => ({ prisma: { $queryRaw: mockQueryRaw }, })) import { getJobsPerDay } from '@/lib/insights/agent-throughput' // Build a date string for N days ago (UTC) function daysAgo(n: number): Date { const d = new Date() d.setUTCDate(d.getUTCDate() - n) return d } function toUTCDate(d: Date): Date { return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate())) } beforeEach(() => { vi.clearAllMocks() }) describe('getJobsPerDay', () => { it('returns a 14-day array zero-filled for missing days', async () => { // Only 3 days have data; the rest should be 0 const day0 = toUTCDate(daysAgo(0)) const day3 = toUTCDate(daysAgo(3)) const day7 = toUTCDate(daysAgo(7)) const dayRows = [ { day: day0, status: 'done', count: BigInt(2) }, { day: day3, status: 'failed', count: BigInt(1) }, { day: day7, status: 'done', count: BigInt(5) }, ] const kpiRows = [ { today_count: BigInt(2), done_7d: BigInt(7), terminal_7d: BigInt(10), avg_seconds: 120 }, ] mockQueryRaw.mockResolvedValueOnce(dayRows).mockResolvedValueOnce(kpiRows) const result = await getJobsPerDay('user-1') expect(result.perDay).toHaveLength(14) // All days should have zero counts except the three we seeded const nonZero = result.perDay.filter( d => d.done + d.failed + d.queued + d.claimed + d.running + d.cancelled + d.skipped > 0, ) expect(nonZero).toHaveLength(3) // Today's done count should be 2 const today = result.perDay[result.perDay.length - 1] expect(today.done).toBe(2) }) it('calculates KPIs correctly', async () => { mockQueryRaw.mockResolvedValueOnce([]).mockResolvedValueOnce([ { today_count: BigInt(3), done_7d: BigInt(7), terminal_7d: BigInt(10), avg_seconds: 90 }, ]) const result = await getJobsPerDay('user-1') expect(result.kpi.todayCount).toBe(3) expect(result.kpi.successRate7d).toBe(0.7) expect(result.kpi.avgDurationSeconds7d).toBe(90) }) it('returns zero successRate and null avgDuration when no terminal jobs', async () => { mockQueryRaw.mockResolvedValueOnce([]).mockResolvedValueOnce([ { today_count: BigInt(0), done_7d: BigInt(0), terminal_7d: BigInt(0), avg_seconds: null }, ]) const result = await getJobsPerDay('user-1') expect(result.kpi.successRate7d).toBe(0) expect(result.kpi.avgDurationSeconds7d).toBeNull() }) })