OverviewUsage.test.ts 3.3 KB

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