File size: 3,055 Bytes
b034029
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import { describe, expect, it } from 'vitest';
import type { UsageIdentity } from '@/lib/types';
import { buildCredentialRows, getTopCredentialRows } from './CredentialStatsCard';

const usageIdentity = (overrides: Partial<UsageIdentity>): 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);
  });
});