OverviewUsage.test.ts128 lines · main
1import { describe, expect, test } from 'vitest'
2
3import {
4 calculatePercentageChange,
5 getApiSuccessRates,
6 getAuthSuccessRates,
7 getMetricValues,
8 type AuthMetricsResponse,
9} from './OverviewUsage.constants'
10import { RawAuthMetricsResponseSchema } from './OverviewUsage.schema'
11
12const validSample = {
13 result: [
14 {
15 period: 'current',
16 active_users: 5,
17 api_error_requests: 0,
18 api_total_requests: 38,
19 auth_total_errors: 0,
20 auth_total_requests: 0,
21 password_reset_requests: 0,
22 sign_up_count: 4,
23 },
24 {
25 period: 'previous',
26 active_users: 0,
27 api_error_requests: 0,
28 api_total_requests: 0,
29 auth_total_errors: 0,
30 auth_total_requests: 0,
31 password_reset_requests: 0,
32 sign_up_count: 0,
33 },
34 ],
35 error: null,
36}
37
38describe('RawAuthMetricsResponseSchema', () => {
39 test('parses valid payload', () => {
40 const parsed = RawAuthMetricsResponseSchema.safeParse(validSample)
41 expect(parsed.success).toBe(true)
42 })
43
44 test('rejects negative numbers', () => {
45 const invalid = {
46 ...validSample,
47 result: [{ ...validSample.result[0], active_users: -1 }, validSample.result[1]],
48 }
49 const parsed = RawAuthMetricsResponseSchema.safeParse(invalid)
50 expect(parsed.success).toBe(false)
51 })
52
53 test('rejects missing fields', () => {
54 const invalid = {
55 result: [
56 {
57 period: 'current',
58 active_users: 1,
59 api_error_requests: 0,
60 auth_total_errors: 0,
61 auth_total_requests: 0,
62 password_reset_requests: 0,
63 sign_up_count: 0,
64 },
65 ],
66 error: null,
67 }
68 const parsed = RawAuthMetricsResponseSchema.safeParse(invalid)
69 expect(parsed.success).toBe(false)
70 })
71})
72
73const sampleMetrics: AuthMetricsResponse = {
74 result: [
75 {
76 period: 'current',
77 active_users: 10,
78 api_error_requests: 2,
79 api_total_requests: 50,
80 auth_total_errors: 1,
81 auth_total_requests: 20,
82 password_reset_requests: 3,
83 sign_up_count: 7,
84 },
85 {
86 period: 'previous',
87 active_users: 5,
88 api_error_requests: 5,
89 api_total_requests: 25,
90 auth_total_errors: 2,
91 auth_total_requests: 10,
92 password_reset_requests: 1,
93 sign_up_count: 4,
94 },
95 ],
96 error: null,
97}
98
99describe('OverviewUsage helpers', () => {
100 test('getMetricValues maps snake_case to camel metric names', () => {
101 const { current, previous } = getMetricValues(sampleMetrics, 'signUpCount')
102 expect(current).toBe(7)
103 expect(previous).toBe(4)
104 })
105
106 test('getMetricValues returns 0 defaults when metrics undefined', () => {
107 const { current, previous } = getMetricValues(undefined, 'activeUsers')
108 expect(current).toBe(0)
109 expect(previous).toBe(0)
110 })
111
112 test('calculatePercentageChange handles zero previous', () => {
113 expect(calculatePercentageChange(10, 0)).toBe(100)
114 expect(calculatePercentageChange(0, 0)).toBe(0)
115 })
116
117 test('getApiSuccessRates computes success rates correctly', () => {
118 const { current, previous } = getApiSuccessRates(sampleMetrics)
119 expect(current).toBeCloseTo(96)
120 expect(previous).toBeCloseTo(80)
121 })
122
123 test('getAuthSuccessRates computes success rates correctly', () => {
124 const { current, previous } = getAuthSuccessRates(sampleMetrics)
125 expect(current).toBeCloseTo(95)
126 expect(previous).toBeCloseTo(80)
127 })
128})