Files
supabase/apps/studio/components/interfaces/Auth/Overview/OverviewUsage.test.ts
2026-04-01 10:22:37 +02:00

129 lines
3.3 KiB
TypeScript

import { describe, expect, test } from 'vitest'
import {
calculatePercentageChange,
getApiSuccessRates,
getAuthSuccessRates,
getMetricValues,
type AuthMetricsResponse,
} from './OverviewUsage.constants'
import { RawAuthMetricsResponseSchema } from './OverviewUsage.schema'
const validSample = {
result: [
{
period: 'current',
active_users: 5,
api_error_requests: 0,
api_total_requests: 38,
auth_total_errors: 0,
auth_total_requests: 0,
password_reset_requests: 0,
sign_up_count: 4,
},
{
period: 'previous',
active_users: 0,
api_error_requests: 0,
api_total_requests: 0,
auth_total_errors: 0,
auth_total_requests: 0,
password_reset_requests: 0,
sign_up_count: 0,
},
],
error: null,
}
describe('RawAuthMetricsResponseSchema', () => {
test('parses valid payload', () => {
const parsed = RawAuthMetricsResponseSchema.safeParse(validSample)
expect(parsed.success).toBe(true)
})
test('rejects negative numbers', () => {
const invalid = {
...validSample,
result: [{ ...validSample.result[0], active_users: -1 }, validSample.result[1]],
}
const parsed = RawAuthMetricsResponseSchema.safeParse(invalid)
expect(parsed.success).toBe(false)
})
test('rejects missing fields', () => {
const invalid = {
result: [
{
period: 'current',
active_users: 1,
api_error_requests: 0,
auth_total_errors: 0,
auth_total_requests: 0,
password_reset_requests: 0,
sign_up_count: 0,
},
],
error: null,
}
const parsed = RawAuthMetricsResponseSchema.safeParse(invalid)
expect(parsed.success).toBe(false)
})
})
const sampleMetrics: AuthMetricsResponse = {
result: [
{
period: 'current',
active_users: 10,
api_error_requests: 2,
api_total_requests: 50,
auth_total_errors: 1,
auth_total_requests: 20,
password_reset_requests: 3,
sign_up_count: 7,
},
{
period: 'previous',
active_users: 5,
api_error_requests: 5,
api_total_requests: 25,
auth_total_errors: 2,
auth_total_requests: 10,
password_reset_requests: 1,
sign_up_count: 4,
},
],
error: null,
}
describe('OverviewUsage helpers', () => {
test('getMetricValues maps snake_case to camel metric names', () => {
const { current, previous } = getMetricValues(sampleMetrics, 'signUpCount')
expect(current).toBe(7)
expect(previous).toBe(4)
})
test('getMetricValues returns 0 defaults when metrics undefined', () => {
const { current, previous } = getMetricValues(undefined, 'activeUsers')
expect(current).toBe(0)
expect(previous).toBe(0)
})
test('calculatePercentageChange handles zero previous', () => {
expect(calculatePercentageChange(10, 0)).toBe(100)
expect(calculatePercentageChange(0, 0)).toBe(0)
})
test('getApiSuccessRates computes success rates correctly', () => {
const { current, previous } = getApiSuccessRates(sampleMetrics)
expect(current).toBeCloseTo(96)
expect(previous).toBeCloseTo(80)
})
test('getAuthSuccessRates computes success rates correctly', () => {
const { current, previous } = getAuthSuccessRates(sampleMetrics)
expect(current).toBeCloseTo(95)
expect(previous).toBeCloseTo(80)
})
})