Usage.utils.test.ts 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. import { describe, expect, it } from 'vitest'
  2. import { dailyUsageToDataPoints } from './Usage.utils'
  3. import { PricingMetric } from '@/data/analytics/org-daily-stats-query'
  4. import type { OrgDailyUsageResponse } from '@/data/analytics/org-daily-stats-query'
  5. describe('dailyUsageToDataPoints', () => {
  6. it('returns empty array when dailyUsage is undefined', () => {
  7. const result = dailyUsageToDataPoints(undefined, () => true)
  8. expect(result).toEqual([])
  9. })
  10. it('returns empty array when usages array is empty', () => {
  11. const dailyUsage: OrgDailyUsageResponse = {
  12. usages: [],
  13. }
  14. const result = dailyUsageToDataPoints(dailyUsage, () => true)
  15. expect(result).toEqual([])
  16. })
  17. it('transforms single usage entry correctly', () => {
  18. const dailyUsage: OrgDailyUsageResponse = {
  19. usages: [
  20. {
  21. date: '2025-10-01',
  22. metric: PricingMetric.EGRESS,
  23. usage: 15,
  24. usage_original: 15 * 1e9,
  25. breakdown: null,
  26. },
  27. ],
  28. }
  29. const result = dailyUsageToDataPoints(dailyUsage, () => true)
  30. expect(result).toHaveLength(1)
  31. expect(result[0]).toEqual({
  32. period_start: '2025-10-01',
  33. periodStartFormatted: '01 Oct',
  34. egress: 15 * 1e9,
  35. })
  36. })
  37. it('groups multiple metrics by date correctly', () => {
  38. const dailyUsage: OrgDailyUsageResponse = {
  39. usages: [
  40. {
  41. date: '2025-10-01',
  42. metric: PricingMetric.EGRESS,
  43. usage: 1000000,
  44. usage_original: 1000000,
  45. breakdown: null,
  46. },
  47. {
  48. date: '2025-10-01',
  49. metric: PricingMetric.DATABASE_SIZE,
  50. usage: 5000000,
  51. usage_original: 5000000,
  52. breakdown: null,
  53. },
  54. ],
  55. }
  56. const result = dailyUsageToDataPoints(dailyUsage, () => true)
  57. expect(result).toHaveLength(1)
  58. expect(result[0]).toEqual({
  59. period_start: '2025-10-01',
  60. periodStartFormatted: '01 Oct',
  61. egress: 1000000,
  62. database_size: 5000000,
  63. })
  64. })
  65. it('creates separate data points for different dates', () => {
  66. const dailyUsage: OrgDailyUsageResponse = {
  67. usages: [
  68. {
  69. date: '2025-10-01',
  70. metric: PricingMetric.EGRESS,
  71. usage: 1000000,
  72. usage_original: 1000000,
  73. breakdown: null,
  74. },
  75. {
  76. date: '2025-10-02',
  77. metric: PricingMetric.EGRESS,
  78. usage: 2000000,
  79. usage_original: 2000000,
  80. breakdown: null,
  81. },
  82. ],
  83. }
  84. const result = dailyUsageToDataPoints(dailyUsage, () => true)
  85. expect(result).toHaveLength(2)
  86. expect(result[0]).toEqual({
  87. period_start: '2025-10-01',
  88. periodStartFormatted: '01 Oct',
  89. egress: 1000000,
  90. })
  91. expect(result[1]).toEqual({
  92. period_start: '2025-10-02',
  93. periodStartFormatted: '02 Oct',
  94. egress: 2000000,
  95. })
  96. })
  97. it('includes breakdown data when present', () => {
  98. const dailyUsage: OrgDailyUsageResponse = {
  99. usages: [
  100. {
  101. date: '2025-10-01',
  102. metric: PricingMetric.EGRESS,
  103. usage: 1000000,
  104. usage_original: 1000000,
  105. breakdown: {
  106. egress_rest: 400000,
  107. egress_realtime: 300000,
  108. egress_storage: 200000,
  109. egress_supavisor: 100000,
  110. egress_function: 0,
  111. egress_graphql: 0,
  112. egress_logdrain: 0,
  113. },
  114. },
  115. ],
  116. }
  117. const result = dailyUsageToDataPoints(dailyUsage, () => true)
  118. expect(result).toHaveLength(1)
  119. expect(result[0]).toEqual({
  120. period_start: '2025-10-01',
  121. periodStartFormatted: '01 Oct',
  122. egress: 1000000,
  123. egress_rest: 400000,
  124. egress_realtime: 300000,
  125. egress_storage: 200000,
  126. egress_supavisor: 100000,
  127. egress_function: 0,
  128. egress_graphql: 0,
  129. egress_logdrain: 0,
  130. })
  131. })
  132. it('handles complex scenario with multiple dates, metrics, and breakdowns', () => {
  133. const dailyUsage: OrgDailyUsageResponse = {
  134. usages: [
  135. {
  136. date: '2025-10-01',
  137. metric: PricingMetric.EGRESS,
  138. usage: 1000000,
  139. usage_original: 1000000,
  140. breakdown: {
  141. egress_rest: 600000,
  142. egress_realtime: 400000,
  143. egress_storage: 0,
  144. egress_supavisor: 0,
  145. egress_function: 0,
  146. egress_graphql: 0,
  147. egress_logdrain: 0,
  148. },
  149. },
  150. {
  151. date: '2025-10-01',
  152. metric: PricingMetric.DATABASE_SIZE,
  153. usage: 5000000,
  154. usage_original: 5000000,
  155. breakdown: null,
  156. },
  157. {
  158. date: '2025-10-02',
  159. metric: PricingMetric.EGRESS,
  160. usage: 1500000,
  161. usage_original: 1500000,
  162. breakdown: {
  163. egress_rest: 900000,
  164. egress_realtime: 600000,
  165. egress_storage: 0,
  166. egress_supavisor: 0,
  167. egress_function: 0,
  168. egress_graphql: 0,
  169. egress_logdrain: 0,
  170. },
  171. },
  172. {
  173. date: '2025-10-02',
  174. metric: PricingMetric.STORAGE_SIZE,
  175. usage: 2000000,
  176. usage_original: 2000000,
  177. breakdown: null,
  178. },
  179. ],
  180. }
  181. const result = dailyUsageToDataPoints(dailyUsage, () => true)
  182. expect(result).toHaveLength(2)
  183. expect(result[0]).toEqual({
  184. period_start: '2025-10-01',
  185. periodStartFormatted: '01 Oct',
  186. egress: 1000000,
  187. egress_rest: 600000,
  188. egress_realtime: 400000,
  189. egress_storage: 0,
  190. egress_supavisor: 0,
  191. egress_function: 0,
  192. egress_graphql: 0,
  193. egress_logdrain: 0,
  194. database_size: 5000000,
  195. })
  196. expect(result[1]).toEqual({
  197. period_start: '2025-10-02',
  198. periodStartFormatted: '02 Oct',
  199. egress: 1500000,
  200. egress_rest: 900000,
  201. egress_realtime: 600000,
  202. egress_storage: 0,
  203. egress_supavisor: 0,
  204. egress_function: 0,
  205. egress_graphql: 0,
  206. egress_logdrain: 0,
  207. storage_size: 2000000,
  208. })
  209. })
  210. it('handles zero usage values', () => {
  211. const dailyUsage: OrgDailyUsageResponse = {
  212. usages: [
  213. {
  214. date: '2025-10-01',
  215. metric: PricingMetric.EGRESS,
  216. usage: 0,
  217. usage_original: 0,
  218. breakdown: null,
  219. },
  220. ],
  221. }
  222. const result = dailyUsageToDataPoints(dailyUsage, () => true)
  223. expect(result).toHaveLength(1)
  224. expect(result[0]).toEqual({
  225. period_start: '2025-10-01',
  226. periodStartFormatted: '01 Oct',
  227. egress: 0,
  228. })
  229. })
  230. })