import { describe, expect, it } from 'vitest'; import type { UsageIdentity } from '@/lib/types'; import { buildCredentialRows, getTopCredentialRows } from './CredentialStatsCard'; const usageIdentity = (overrides: Partial): UsageIdentity => ({ id: 1, name: '', auth_type: 1, auth_type_name: 'oauth', identity: '', type: '', provider: '', total_requests: 0, success_count: 0, failure_count: 0, input_tokens: 0, output_tokens: 0, reasoning_tokens: 0, cached_tokens: 0, total_tokens: 0, last_aggregated_usage_event_id: 0, is_deleted: false, created_at: '2026-05-04T00:00:00Z', updated_at: '2026-05-04T00:00:00Z', ...overrides, }); describe('CredentialStatsCard helpers', () => { it('sorts credentials by total request count descending', () => { const credentials = [ usageIdentity({ id: 1, identity: 'low', success_count: 1, total_requests: 1, }), usageIdentity({ id: 2, name: 'High Provider', auth_type: 2, auth_type_name: 'apikey', identity: 'sk-a***1234', type: 'claude', success_count: 8, failure_count: 2, total_requests: 10, }), ] satisfies UsageIdentity[]; const rows = buildCredentialRows(credentials); expect(rows.map((row) => row.displayName)).toEqual(['High Provider', 'low']); expect(rows[0]).toMatchObject({ success: 8, failure: 2, total: 10, successRate: 80, }); }); it('prefers identity type over auth type name for the credential tag', () => { const credentials = [ usageIdentity({ auth_type_name: 'apikey', identity: 'sk-a***1234', type: 'openai', }), ] satisfies UsageIdentity[]; const rows = buildCredentialRows(credentials); expect(rows[0].type).toBe('openai'); }); it('falls back to success plus failure when total count is empty', () => { const credentials = [ usageIdentity({ identity: 'fallback-total', success_count: 3, failure_count: 2, total_requests: 0, }), ] satisfies UsageIdentity[]; const rows = buildCredentialRows(credentials); expect(rows[0].total).toBe(5); expect(rows[0].successRate).toBe(60); }); it('returns only the top 10 non-empty credential rows', () => { const credentials = [ usageIdentity({ id: 1, identity: 'empty', }), ...Array.from({ length: 12 }, (_, index) => usageIdentity({ id: index + 2, identity: `credential-${index + 1}`, success_count: index + 1, total_requests: index + 1, })), ] satisfies UsageIdentity[]; const rows = buildCredentialRows(credentials); const topRows = getTopCredentialRows(rows); expect(topRows).toHaveLength(10); expect(topRows[0].displayName).toBe('credential-12'); expect(topRows[9].displayName).toBe('credential-3'); expect(topRows.some((row) => row.displayName === 'empty')).toBe(false); }); });