ObservabilityOverview.utils.test.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. import { describe, expect, it } from 'vitest'
  2. import type { LogsBarChartDatum } from '../ProjectHome/ProjectUsage.metrics'
  3. import {
  4. calculateErrorRate,
  5. calculateSuccessRate,
  6. getHealthStatus,
  7. } from './ObservabilityOverview.utils'
  8. describe('calculateErrorRate', () => {
  9. it('returns 0 when total is 0', () => {
  10. const data: LogsBarChartDatum[] = [
  11. { timestamp: '2024-01-15T12:00:00Z', ok_count: 0, warning_count: 0, error_count: 0 },
  12. ]
  13. expect(calculateErrorRate(data)).toBe(0)
  14. })
  15. it('calculates correct error rate', () => {
  16. const data: LogsBarChartDatum[] = [
  17. { timestamp: '2024-01-15T12:00:00Z', ok_count: 80, warning_count: 10, error_count: 10 },
  18. ]
  19. expect(calculateErrorRate(data)).toBe(10)
  20. })
  21. it('calculates error rate across multiple data points', () => {
  22. const data: LogsBarChartDatum[] = [
  23. { timestamp: '2024-01-15T12:00:00Z', ok_count: 50, warning_count: 25, error_count: 25 },
  24. { timestamp: '2024-01-15T12:01:00Z', ok_count: 50, warning_count: 25, error_count: 25 },
  25. ]
  26. expect(calculateErrorRate(data)).toBe(25)
  27. })
  28. it('handles high error rates', () => {
  29. const data: LogsBarChartDatum[] = [
  30. { timestamp: '2024-01-15T12:00:00Z', ok_count: 10, warning_count: 10, error_count: 80 },
  31. ]
  32. expect(calculateErrorRate(data)).toBe(80)
  33. })
  34. it('handles empty array', () => {
  35. expect(calculateErrorRate([])).toBe(0)
  36. })
  37. })
  38. describe('calculateSuccessRate', () => {
  39. it('returns 0 when total is 0', () => {
  40. const data: LogsBarChartDatum[] = [
  41. { timestamp: '2024-01-15T12:00:00Z', ok_count: 0, warning_count: 0, error_count: 0 },
  42. ]
  43. expect(calculateSuccessRate(data)).toBe(0)
  44. })
  45. it('calculates correct success rate', () => {
  46. const data: LogsBarChartDatum[] = [
  47. { timestamp: '2024-01-15T12:00:00Z', ok_count: 80, warning_count: 10, error_count: 10 },
  48. ]
  49. expect(calculateSuccessRate(data)).toBe(80)
  50. })
  51. it('returns 100% for all successful requests', () => {
  52. const data: LogsBarChartDatum[] = [
  53. { timestamp: '2024-01-15T12:00:00Z', ok_count: 100, warning_count: 0, error_count: 0 },
  54. ]
  55. expect(calculateSuccessRate(data)).toBe(100)
  56. })
  57. it('calculates success rate across multiple data points', () => {
  58. const data: LogsBarChartDatum[] = [
  59. { timestamp: '2024-01-15T12:00:00Z', ok_count: 70, warning_count: 15, error_count: 15 },
  60. { timestamp: '2024-01-15T12:01:00Z', ok_count: 70, warning_count: 15, error_count: 15 },
  61. ]
  62. expect(calculateSuccessRate(data)).toBe(70)
  63. })
  64. it('handles empty array', () => {
  65. expect(calculateSuccessRate([])).toBe(0)
  66. })
  67. })
  68. describe('getHealthStatus', () => {
  69. describe('unknown status', () => {
  70. it('returns unknown when total is 0', () => {
  71. const result = getHealthStatus(0, 0)
  72. expect(result).toEqual({
  73. status: 'unknown',
  74. color: 'muted',
  75. })
  76. })
  77. it('returns unknown when total is below 100', () => {
  78. const result = getHealthStatus(5, 50)
  79. expect(result).toEqual({
  80. status: 'unknown',
  81. color: 'muted',
  82. })
  83. })
  84. it('returns unknown when total is exactly 99', () => {
  85. const result = getHealthStatus(10, 99)
  86. expect(result).toEqual({
  87. status: 'unknown',
  88. color: 'muted',
  89. })
  90. })
  91. it('returns unknown even with high error rate when total is low', () => {
  92. const result = getHealthStatus(50, 20)
  93. expect(result).toEqual({
  94. status: 'unknown',
  95. color: 'muted',
  96. })
  97. })
  98. })
  99. describe('error status', () => {
  100. it('returns error when error rate is exactly 1%', () => {
  101. const result = getHealthStatus(1, 100)
  102. expect(result).toEqual({
  103. status: 'error',
  104. color: 'destructive',
  105. })
  106. })
  107. it('returns error when error rate is above 1%', () => {
  108. const result = getHealthStatus(5, 100)
  109. expect(result).toEqual({
  110. status: 'error',
  111. color: 'destructive',
  112. })
  113. })
  114. it('returns error when error rate is 10%', () => {
  115. const result = getHealthStatus(10, 200)
  116. expect(result).toEqual({
  117. status: 'error',
  118. color: 'destructive',
  119. })
  120. })
  121. it('returns error for very high error rates', () => {
  122. const result = getHealthStatus(90, 1000)
  123. expect(result).toEqual({
  124. status: 'error',
  125. color: 'destructive',
  126. })
  127. })
  128. })
  129. describe('healthy status', () => {
  130. it('returns healthy when error rate is 0% with sufficient data', () => {
  131. const result = getHealthStatus(0, 100)
  132. expect(result).toEqual({
  133. status: 'healthy',
  134. color: 'brand',
  135. })
  136. })
  137. it('returns healthy when error rate is below 1%', () => {
  138. const result = getHealthStatus(0.5, 100)
  139. expect(result).toEqual({
  140. status: 'healthy',
  141. color: 'brand',
  142. })
  143. })
  144. it('returns healthy when error rate is just below 1%', () => {
  145. const result = getHealthStatus(0.99, 100)
  146. expect(result).toEqual({
  147. status: 'healthy',
  148. color: 'brand',
  149. })
  150. })
  151. it('returns healthy with 0% error rate and large total', () => {
  152. const result = getHealthStatus(0, 10000)
  153. expect(result).toEqual({
  154. status: 'healthy',
  155. color: 'brand',
  156. })
  157. })
  158. })
  159. describe('edge cases', () => {
  160. it('handles fractional error rates correctly', () => {
  161. const result = getHealthStatus(0.99, 1000)
  162. expect(result).toEqual({
  163. status: 'healthy',
  164. color: 'brand',
  165. })
  166. })
  167. it('returns unknown for very small total values', () => {
  168. const result = getHealthStatus(10, 1)
  169. expect(result).toEqual({
  170. status: 'unknown',
  171. color: 'muted',
  172. })
  173. })
  174. it('handles very large total values', () => {
  175. const result = getHealthStatus(0.5, 1000000)
  176. expect(result).toEqual({
  177. status: 'healthy',
  178. color: 'brand',
  179. })
  180. })
  181. it('returns healthy when total is exactly 100 and error rate is 0', () => {
  182. const result = getHealthStatus(0, 100)
  183. expect(result).toEqual({
  184. status: 'healthy',
  185. color: 'brand',
  186. })
  187. })
  188. it('returns error when total is exactly 100 and error rate is 1%', () => {
  189. const result = getHealthStatus(1, 100)
  190. expect(result).toEqual({
  191. status: 'error',
  192. color: 'destructive',
  193. })
  194. })
  195. })
  196. })