@nlabs/reaktor 0.9.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/.env +1 -0
  2. package/.env.example +1 -0
  3. package/DATABASE_I18N_GUIDE.md +434 -0
  4. package/README.md +9 -0
  5. package/TEST_UTILITIES_GUIDE.md +360 -0
  6. package/coverage/index.html +61 -46
  7. package/dist/actions/apps.js +242 -0
  8. package/dist/actions/connections.js +90 -0
  9. package/dist/actions/conversations.js +350 -0
  10. package/dist/actions/dynamodb.js +150 -0
  11. package/dist/actions/email.js +152 -0
  12. package/dist/actions/files.js +283 -0
  13. package/dist/actions/groups.js +292 -0
  14. package/dist/actions/images.js +735 -0
  15. package/dist/actions/index.js +66 -0
  16. package/dist/actions/ios.js +164 -0
  17. package/dist/actions/locations.js +122 -0
  18. package/dist/actions/messages.js +208 -0
  19. package/dist/actions/notifications.js +59 -0
  20. package/dist/actions/payments.js +497 -0
  21. package/dist/actions/personas.js +110 -0
  22. package/dist/actions/posts.js +595 -0
  23. package/dist/actions/reactions.js +322 -0
  24. package/dist/actions/s3.js +133 -0
  25. package/dist/actions/search.js +90 -0
  26. package/dist/actions/sms.js +108 -0
  27. package/dist/actions/statistics.js +62 -0
  28. package/dist/actions/subscription.js +220 -0
  29. package/dist/actions/tags.js +292 -0
  30. package/dist/actions/users.js +784 -0
  31. package/dist/actions/websockets.js +174 -0
  32. package/dist/adapters/arangoAdapter.js +46 -0
  33. package/dist/adapters/fileAdapter.js +76 -0
  34. package/dist/adapters/imageAdapter.js +40 -0
  35. package/dist/adapters/messageAdapter.js +49 -0
  36. package/dist/adapters/postAdapter.js +70 -0
  37. package/dist/adapters/reaktorAdapter.js +44 -0
  38. package/dist/adapters/tagAdapter.js +50 -0
  39. package/dist/adapters/userAdapter.js +115 -0
  40. package/dist/config.js +125 -0
  41. package/dist/index.js +66 -0
  42. package/dist/lambdas/actions/websockets.js +132 -0
  43. package/dist/lambdas/authorizer.js +67 -0
  44. package/dist/lambdas/connection.js +91 -0
  45. package/dist/lambdas/utils/message.js +42 -0
  46. package/dist/lambdas/utils/websocket.js +105 -0
  47. package/dist/mocks/conversation.js +35 -0
  48. package/dist/mocks/file.js +38 -0
  49. package/dist/mocks/group.js +47 -0
  50. package/dist/mocks/image.js +44 -0
  51. package/dist/mocks/nlabs.png +0 -0
  52. package/dist/mocks/post.js +55 -0
  53. package/dist/mocks/tag.js +37 -0
  54. package/dist/mocks/user.js +88 -0
  55. package/dist/mutations/index.js +26 -0
  56. package/dist/mutations/locations.js +44 -0
  57. package/dist/mutations/messages.js +86 -0
  58. package/dist/mutations/personas.js +100 -0
  59. package/dist/mutations/posts.js +53 -0
  60. package/dist/mutations/reactions.js +51 -0
  61. package/dist/mutations/statistics.js +39 -0
  62. package/dist/mutations/subscriptions.js +56 -0
  63. package/dist/mutations/tags.js +120 -0
  64. package/dist/mutations/users.js +116 -0
  65. package/dist/objectTypes/app.js +173 -0
  66. package/dist/objectTypes/bankAccount.js +76 -0
  67. package/dist/objectTypes/connection.js +48 -0
  68. package/dist/objectTypes/conversation.js +77 -0
  69. package/dist/objectTypes/creditCard.js +86 -0
  70. package/dist/objectTypes/document.js +46 -0
  71. package/dist/objectTypes/error.js +46 -0
  72. package/dist/objectTypes/external.js +74 -0
  73. package/dist/objectTypes/file.js +100 -0
  74. package/dist/objectTypes/filter.js +43 -0
  75. package/dist/objectTypes/group.js +123 -0
  76. package/dist/objectTypes/iapSubscription.js +40 -0
  77. package/dist/objectTypes/image.js +129 -0
  78. package/dist/objectTypes/index.js +68 -0
  79. package/dist/objectTypes/location.js +109 -0
  80. package/dist/objectTypes/message.js +96 -0
  81. package/dist/objectTypes/passcode.js +42 -0
  82. package/dist/objectTypes/persona.js +87 -0
  83. package/dist/objectTypes/plan.js +95 -0
  84. package/dist/objectTypes/post.js +125 -0
  85. package/dist/objectTypes/reaction.js +61 -0
  86. package/dist/objectTypes/relation.js +49 -0
  87. package/dist/objectTypes/search.js +72 -0
  88. package/dist/objectTypes/statistics.js +39 -0
  89. package/dist/objectTypes/subscription.js +117 -0
  90. package/dist/objectTypes/tag.js +65 -0
  91. package/dist/objectTypes/user.js +144 -0
  92. package/dist/queries/index.js +33 -0
  93. package/dist/queries/locations.js +45 -0
  94. package/dist/queries/messages.js +52 -0
  95. package/dist/queries/posts.js +154 -0
  96. package/dist/queries/reactions.js +56 -0
  97. package/dist/queries/statistics.js +39 -0
  98. package/dist/queries/subscriptions.js +44 -0
  99. package/dist/queries/tags.js +75 -0
  100. package/dist/queries/users.js +64 -0
  101. package/dist/templates/email/layout.js +302 -0
  102. package/dist/templates/email/passwordForgot.js +38 -0
  103. package/dist/templates/email/passwordRecovery.js +35 -0
  104. package/dist/templates/email/verifyEmail.js +38 -0
  105. package/dist/templates/email/welcome.js +38 -0
  106. package/dist/templates/sms/passwordForgot.js +24 -0
  107. package/dist/templates/sms/passwordRecovery.js +24 -0
  108. package/dist/templates/sms/verifyEmail.js +24 -0
  109. package/dist/templates/sms/verifyPhone.js +24 -0
  110. package/dist/templates/sms/welcome.js +24 -0
  111. package/dist/types/apps.js +32 -0
  112. package/{lib → dist}/types/arangodb.js +1 -1
  113. package/{lib → dist}/types/auth.js +1 -1
  114. package/{lib → dist}/types/connections.js +1 -1
  115. package/dist/types/conversations.js +16 -0
  116. package/{lib → dist}/types/email.js +1 -1
  117. package/dist/types/files.js +16 -0
  118. package/dist/types/google.js +16 -0
  119. package/{lib → dist}/types/groups.js +1 -1
  120. package/dist/types/images.js +16 -0
  121. package/dist/types/index.js +60 -0
  122. package/{lib → dist}/types/locations.js +1 -1
  123. package/{lib → dist}/types/messages.js +1 -1
  124. package/{lib → dist}/types/notifications.js +1 -1
  125. package/dist/types/payments.js +16 -0
  126. package/dist/types/personas.js +16 -0
  127. package/dist/types/posts.js +16 -0
  128. package/{lib → dist}/types/tags.js +1 -1
  129. package/dist/types/users.js +16 -0
  130. package/dist/types/websockets.js +16 -0
  131. package/dist/utils/adapterUtils.js +45 -0
  132. package/dist/utils/analyticsUtils.js +72 -0
  133. package/dist/utils/arangodbUtils.js +165 -0
  134. package/dist/utils/auth.js +57 -0
  135. package/dist/utils/index.js +30 -0
  136. package/{lib → dist}/utils/session.js +10 -7
  137. package/index.js +1 -1
  138. package/jest.config.js +17 -0
  139. package/jest.setup.js +36 -0
  140. package/lex.config.cjs +13 -0
  141. package/lib/actions/apps.js +17 -249
  142. package/lib/actions/connections.js +7 -0
  143. package/lib/actions/content.js +17 -0
  144. package/lib/actions/conversations.js +19 -325
  145. package/lib/actions/dynamodb.js +2 -150
  146. package/lib/actions/email.js +2 -152
  147. package/lib/actions/files.js +5 -287
  148. package/lib/actions/groups.js +23 -263
  149. package/lib/actions/images.js +31 -646
  150. package/lib/actions/index.js +2 -62
  151. package/lib/actions/ios.js +9 -162
  152. package/lib/actions/locations.js +7 -110
  153. package/lib/actions/messages.js +21 -193
  154. package/lib/actions/notifications.js +2 -59
  155. package/lib/actions/payments.js +11 -461
  156. package/lib/actions/posts.js +77 -515
  157. package/lib/actions/profiles.js +8 -0
  158. package/lib/actions/reactions.js +25 -312
  159. package/lib/actions/s3.js +2 -133
  160. package/lib/actions/search.js +5 -90
  161. package/lib/actions/sms.js +2 -106
  162. package/lib/actions/statistics.js +6 -60
  163. package/lib/actions/subscriptions.js +12 -0
  164. package/lib/actions/tags.js +19 -262
  165. package/lib/actions/users.js +67 -537
  166. package/lib/actions/websockets.js +16 -158
  167. package/lib/adapters/arangoAdapter.js +2 -46
  168. package/lib/adapters/contentAdapter.js +2 -0
  169. package/lib/adapters/fileAdapter.js +2 -76
  170. package/lib/adapters/imageAdapter.js +2 -0
  171. package/lib/adapters/messageAdapter.js +2 -0
  172. package/lib/adapters/postAdapter.js +2 -70
  173. package/lib/adapters/reaktorAdapter.js +2 -44
  174. package/lib/adapters/tagAdapter.js +2 -50
  175. package/lib/adapters/userAdapter.js +2 -110
  176. package/lib/config.js +2 -125
  177. package/lib/handlers/graphqlHandler.js +2 -0
  178. package/lib/index.js +2 -30
  179. package/lib/lambdas/actions/websockets.js +14 -112
  180. package/lib/lambdas/authorizer.js +2 -67
  181. package/lib/lambdas/connection.js +2 -92
  182. package/lib/lambdas/utils/message.js +2 -42
  183. package/lib/lambdas/utils/websocket.js +2 -105
  184. package/lib/mocks/conversation.js +2 -35
  185. package/lib/mocks/file.js +2 -38
  186. package/lib/mocks/group.js +2 -47
  187. package/lib/mocks/image.js +2 -43
  188. package/lib/mocks/post.js +2 -55
  189. package/lib/mocks/tag.js +2 -37
  190. package/lib/mocks/user.js +2 -88
  191. package/lib/mutations/index.js +2 -0
  192. package/lib/mutations/locations.integration.js +2 -0
  193. package/lib/mutations/locations.js +2 -0
  194. package/lib/mutations/messages.integration.js +2 -0
  195. package/lib/mutations/messages.js +2 -0
  196. package/lib/mutations/posts.integration.js +2 -0
  197. package/lib/mutations/posts.js +2 -0
  198. package/lib/mutations/profiles.integration.js +2 -0
  199. package/lib/mutations/profiles.js +2 -0
  200. package/lib/mutations/reactions.integration.js +2 -0
  201. package/lib/mutations/reactions.js +2 -0
  202. package/lib/mutations/statistics.integration.js +2 -0
  203. package/lib/mutations/statistics.js +2 -0
  204. package/lib/mutations/subscriptions.integration.js +2 -0
  205. package/lib/mutations/subscriptions.js +2 -0
  206. package/lib/mutations/tags.integration.js +2 -0
  207. package/lib/mutations/tags.js +2 -0
  208. package/lib/mutations/users.integration.js +2 -0
  209. package/lib/mutations/users.js +2 -0
  210. package/lib/objectTypes/app.js +2 -0
  211. package/lib/objectTypes/bankAccount.js +2 -0
  212. package/lib/objectTypes/connection.js +2 -0
  213. package/lib/objectTypes/conversation.js +2 -0
  214. package/lib/objectTypes/creditCard.js +2 -0
  215. package/lib/objectTypes/document.js +2 -0
  216. package/lib/objectTypes/error.js +2 -0
  217. package/lib/objectTypes/external.js +2 -0
  218. package/lib/objectTypes/file.js +2 -0
  219. package/lib/objectTypes/filter.js +2 -0
  220. package/lib/objectTypes/group.js +2 -0
  221. package/lib/objectTypes/iapSubscription.js +2 -0
  222. package/lib/objectTypes/image.js +2 -0
  223. package/lib/objectTypes/index.js +2 -0
  224. package/lib/objectTypes/location.js +2 -0
  225. package/lib/objectTypes/message.js +2 -0
  226. package/lib/objectTypes/passcode.js +2 -0
  227. package/lib/objectTypes/plan.js +2 -0
  228. package/lib/objectTypes/post.js +2 -0
  229. package/lib/objectTypes/profile.js +2 -0
  230. package/lib/objectTypes/reaction.js +2 -0
  231. package/lib/objectTypes/relation.js +2 -0
  232. package/lib/objectTypes/search.js +2 -0
  233. package/lib/objectTypes/statistics.js +2 -0
  234. package/lib/objectTypes/subscription.js +2 -0
  235. package/lib/objectTypes/tag.js +2 -0
  236. package/lib/objectTypes/user.js +2 -0
  237. package/lib/queries/index.js +2 -0
  238. package/lib/queries/locations.integration.js +2 -0
  239. package/lib/queries/locations.js +2 -0
  240. package/lib/queries/messages.integration.js +2 -0
  241. package/lib/queries/messages.js +2 -0
  242. package/lib/queries/posts.integration.js +2 -0
  243. package/lib/queries/posts.js +2 -0
  244. package/lib/queries/reactions.integration.js +2 -0
  245. package/lib/queries/reactions.js +2 -0
  246. package/lib/queries/statistics.js +2 -0
  247. package/lib/queries/subscriptions.js +2 -0
  248. package/lib/queries/tags.integration.js +2 -0
  249. package/lib/queries/tags.js +2 -0
  250. package/lib/queries/users.integration.js +2 -0
  251. package/lib/queries/users.js +2 -0
  252. package/lib/templates/email/layout.js +3 -25
  253. package/lib/templates/email/passwordForgot.js +3 -25
  254. package/lib/templates/email/passwordRecovery.js +3 -25
  255. package/lib/templates/email/verifyEmail.js +3 -25
  256. package/lib/templates/email/welcome.js +3 -25
  257. package/lib/templates/sms/passwordForgot.js +2 -24
  258. package/lib/templates/sms/passwordRecovery.js +2 -24
  259. package/lib/templates/sms/verifyEmail.js +2 -24
  260. package/lib/templates/sms/verifyPhone.js +2 -24
  261. package/lib/templates/sms/welcome.js +2 -24
  262. package/lib/types/apps.types.js +2 -0
  263. package/lib/types/arangodb.types.js +1 -0
  264. package/lib/types/auth.types.js +1 -0
  265. package/lib/types/connections.types.js +1 -0
  266. package/lib/types/content.types.js +1 -0
  267. package/lib/types/conversations.types.js +1 -0
  268. package/lib/types/email.types.js +1 -0
  269. package/lib/types/error.types.js +2 -0
  270. package/lib/types/files.types.js +1 -0
  271. package/lib/types/google.types.js +1 -0
  272. package/lib/types/groups.types.js +1 -0
  273. package/lib/types/images.types.js +1 -0
  274. package/lib/types/index.js +2 -56
  275. package/lib/types/locations.types.js +1 -0
  276. package/lib/types/messages.types.js +1 -0
  277. package/lib/types/notifications.types.js +1 -0
  278. package/lib/types/payments.types.js +1 -0
  279. package/lib/types/posts.types.js +1 -0
  280. package/lib/types/profiles.types.js +1 -0
  281. package/lib/types/statistics.types.js +1 -0
  282. package/lib/types/tags.types.js +1 -0
  283. package/lib/types/users.types.js +1 -0
  284. package/lib/types/websockets.types.js +1 -0
  285. package/lib/utils/adapterUtils.js +2 -45
  286. package/lib/utils/analyticsUtils.js +2 -72
  287. package/lib/utils/arangodbUtils.js +5 -142
  288. package/lib/utils/authUtils.js +2 -0
  289. package/lib/utils/contextUtils.js +2 -0
  290. package/lib/utils/dbI18n.example.js +6 -0
  291. package/lib/utils/dbI18n.js +2 -0
  292. package/lib/utils/googleTranslate.js +2 -0
  293. package/lib/utils/graphqlUtils.js +2 -0
  294. package/lib/utils/index.js +2 -30
  295. package/lib/utils/languageDetection.js +2 -0
  296. package/lib/utils/localeUtils.example.js +2 -0
  297. package/lib/utils/localeUtils.js +2 -0
  298. package/lib/utils/middlewareUtils.js +2 -0
  299. package/lib/utils/sessionUtils.js +2 -0
  300. package/lib/utils/stripeUtils.js +2 -0
  301. package/lib/utils/templateUtils.js +2 -0
  302. package/lib/utils/testUtils.js +2 -0
  303. package/lib/utils/translationQueue.example.js +2 -0
  304. package/lib/utils/translationQueue.js +2 -0
  305. package/package.json +41 -37
  306. package/.eslintrc +0 -10
  307. package/.prettierrc.js +0 -4
  308. package/lib/actions/apps.d.ts +0 -25
  309. package/lib/actions/conversations.d.ts +0 -14
  310. package/lib/actions/dynamodb.d.ts +0 -8
  311. package/lib/actions/email.d.ts +0 -5
  312. package/lib/actions/files.d.ts +0 -19
  313. package/lib/actions/groups.d.ts +0 -14
  314. package/lib/actions/images.d.ts +0 -26
  315. package/lib/actions/index.d.ts +0 -21
  316. package/lib/actions/ios.d.ts +0 -7
  317. package/lib/actions/locations.d.ts +0 -5
  318. package/lib/actions/messages.d.ts +0 -13
  319. package/lib/actions/notifications.d.ts +0 -5
  320. package/lib/actions/payments.d.ts +0 -10
  321. package/lib/actions/posts.d.ts +0 -19
  322. package/lib/actions/reactions.d.ts +0 -30
  323. package/lib/actions/s3.d.ts +0 -7
  324. package/lib/actions/search.d.ts +0 -3
  325. package/lib/actions/sms.d.ts +0 -3
  326. package/lib/actions/statistics.d.ts +0 -3
  327. package/lib/actions/subscription.d.ts +0 -7
  328. package/lib/actions/subscription.js +0 -218
  329. package/lib/actions/tags.d.ts +0 -29
  330. package/lib/actions/users.d.ts +0 -47
  331. package/lib/actions/websockets.d.ts +0 -19
  332. package/lib/adapters/arangoAdapter.d.ts +0 -2
  333. package/lib/adapters/fileAdapter.d.ts +0 -3
  334. package/lib/adapters/postAdapter.d.ts +0 -2
  335. package/lib/adapters/reaktorAdapter.d.ts +0 -6
  336. package/lib/adapters/tagAdapter.d.ts +0 -2
  337. package/lib/adapters/userAdapter.d.ts +0 -2
  338. package/lib/config.d.ts +0 -20
  339. package/lib/index.d.ts +0 -5
  340. package/lib/lambdas/actions/websockets.d.ts +0 -6
  341. package/lib/lambdas/authorizer.d.ts +0 -20
  342. package/lib/lambdas/connection.d.ts +0 -12
  343. package/lib/lambdas/utils/message.d.ts +0 -1
  344. package/lib/lambdas/utils/websocket.d.ts +0 -7
  345. package/lib/mocks/conversation.d.ts +0 -8
  346. package/lib/mocks/file.d.ts +0 -11
  347. package/lib/mocks/group.d.ts +0 -17
  348. package/lib/mocks/image.d.ts +0 -3
  349. package/lib/mocks/post.d.ts +0 -38
  350. package/lib/mocks/tag.d.ts +0 -2
  351. package/lib/mocks/user.d.ts +0 -4
  352. package/lib/templates/email/layout.d.ts +0 -2
  353. package/lib/templates/email/passwordForgot.d.ts +0 -2
  354. package/lib/templates/email/passwordRecovery.d.ts +0 -2
  355. package/lib/templates/email/verifyEmail.d.ts +0 -2
  356. package/lib/templates/email/welcome.d.ts +0 -2
  357. package/lib/templates/sms/passwordForgot.d.ts +0 -2
  358. package/lib/templates/sms/passwordRecovery.d.ts +0 -2
  359. package/lib/templates/sms/verifyEmail.d.ts +0 -2
  360. package/lib/templates/sms/verifyPhone.d.ts +0 -2
  361. package/lib/templates/sms/welcome.d.ts +0 -2
  362. package/lib/types/apps.d.ts +0 -46
  363. package/lib/types/apps.js +0 -32
  364. package/lib/types/arangodb.d.ts +0 -30
  365. package/lib/types/auth.d.ts +0 -7
  366. package/lib/types/connections.d.ts +0 -7
  367. package/lib/types/conversations.d.ts +0 -29
  368. package/lib/types/conversations.js +0 -16
  369. package/lib/types/email.d.ts +0 -13
  370. package/lib/types/error.d.ts +0 -20
  371. package/lib/types/files.d.ts +0 -26
  372. package/lib/types/files.js +0 -16
  373. package/lib/types/google.d.ts +0 -29
  374. package/lib/types/google.js +0 -16
  375. package/lib/types/groups.d.ts +0 -21
  376. package/lib/types/images.d.ts +0 -51
  377. package/lib/types/images.js +0 -16
  378. package/lib/types/index.d.ts +0 -18
  379. package/lib/types/locations.d.ts +0 -20
  380. package/lib/types/messages.d.ts +0 -16
  381. package/lib/types/notifications.d.ts +0 -17
  382. package/lib/types/payments.d.ts +0 -112
  383. package/lib/types/payments.js +0 -16
  384. package/lib/types/posts.d.ts +0 -31
  385. package/lib/types/posts.js +0 -16
  386. package/lib/types/statistics.d.ts +0 -3
  387. package/lib/types/tags.d.ts +0 -10
  388. package/lib/types/users.d.ts +0 -76
  389. package/lib/types/users.js +0 -16
  390. package/lib/types/websocket.d.ts +0 -13
  391. package/lib/types/websocket.js +0 -16
  392. package/lib/utils/adapterUtils.d.ts +0 -1
  393. package/lib/utils/analyticsUtils.d.ts +0 -21
  394. package/lib/utils/arangodbUtils.d.ts +0 -65
  395. package/lib/utils/auth.d.ts +0 -20
  396. package/lib/utils/auth.js +0 -50
  397. package/lib/utils/index.d.ts +0 -5
  398. package/lib/utils/session.d.ts +0 -16
  399. /package/{lib → dist}/types/error.js +0 -0
  400. /package/{lib → dist}/types/statistics.js +0 -0
@@ -0,0 +1,360 @@
1
+ # Test Utilities Guide
2
+
3
+ This guide explains how to use the test utilities in `src/utils/testUtils.ts` to optimize and consolidate your GraphQL query and mutation tests.
4
+
5
+ ## Overview
6
+
7
+ The test utilities provide a standardized way to create tests for GraphQL resolvers, reducing code duplication and improving maintainability. They abstract common testing patterns into reusable functions.
8
+
9
+ ## Available Utilities
10
+
11
+ ### 1. Mock Context and Resolve Info
12
+
13
+ ```typescript
14
+ import { createMockContext, createMockResolveInfo } from '../utils/testUtils';
15
+
16
+ // Create a standard mock context
17
+ const context = createMockContext();
18
+
19
+ // Create a custom context with overrides
20
+ const customContext = createMockContext({
21
+ databaseName: 'custom-db',
22
+ session: { userId: 'custom-user' }
23
+ });
24
+
25
+ // Create mock resolve info for GraphQL resolvers
26
+ const resolveInfo = createMockResolveInfo('fieldName');
27
+ ```
28
+
29
+ ### 2. Mock Data Generators
30
+
31
+ ```typescript
32
+ import {
33
+ createMockUser,
34
+ createMockPost,
35
+ createMockMessage,
36
+ createMockReaction,
37
+ createMockTag
38
+ } from '../utils/testUtils';
39
+
40
+ // Create mock data with defaults
41
+ const user = createMockUser();
42
+ const post = createMockPost();
43
+
44
+ // Create mock data with custom values
45
+ const customUser = createMockUser({
46
+ userId: 'custom-id',
47
+ email: 'custom@example.com'
48
+ });
49
+ ```
50
+
51
+ ### 3. Mock Setup Utilities
52
+
53
+ ```typescript
54
+ import { mockActionsModule, mockObjectType, setupCommonMocks } from '../utils/testUtils';
55
+
56
+ // Mock actions module
57
+ mockActionsModule('../actions/users', {
58
+ getUser: jest.fn(),
59
+ getSessionUser: jest.fn()
60
+ });
61
+
62
+ // Mock object types
63
+ mockObjectType('../objectTypes/user', 'user');
64
+
65
+ // Setup common mocks (auth utils, etc.)
66
+ setupCommonMocks();
67
+ ```
68
+
69
+ ## Test Suite Creators
70
+
71
+ ### 1. Query Test Suite
72
+
73
+ Use `createQueryTestSuite` for testing GraphQL query resolvers:
74
+
75
+ ```typescript
76
+ import { createQueryTestSuite, createMockUser } from '../utils/testUtils';
77
+
78
+ // Mock dependencies
79
+ mockActionsModule('../actions/users', {
80
+ getUser: jest.fn(),
81
+ getSessionUser: jest.fn()
82
+ });
83
+ mockObjectType('../objectTypes/user', 'user');
84
+
85
+ // Define test cases
86
+ const testCases = [
87
+ {
88
+ name: 'getUserByEmail',
89
+ actionName: 'getUser',
90
+ args: { email: 'test@example.com' },
91
+ expectedCall: (context: any, args: any) => ({ email: args.email }),
92
+ mockReturnValue: createMockUser(),
93
+ errorCase: true
94
+ },
95
+ {
96
+ name: 'getUserById',
97
+ actionName: 'getUser',
98
+ args: { userId: 'user1' },
99
+ expectedCall: (context: any, args: any) => ({ userId: args.userId }),
100
+ mockReturnValue: createMockUser(),
101
+ errorCase: true
102
+ }
103
+ ];
104
+
105
+ // Create the test suite
106
+ createQueryTestSuite(
107
+ 'User Queries',
108
+ '../actions/users',
109
+ '../objectTypes/user',
110
+ 'user',
111
+ testCases
112
+ );
113
+ ```
114
+
115
+ ### 2. Mutation Test Suite
116
+
117
+ Use `createMutationTestSuite` for testing GraphQL mutation resolvers:
118
+
119
+ ```typescript
120
+ import { createMutationTestSuite, createMockUser, setupCommonMocks } from '../utils/testUtils';
121
+
122
+ // Setup common mocks
123
+ setupCommonMocks();
124
+
125
+ // Mock mutations module (complex setup)
126
+ jest.mock('./users', () => ({
127
+ userMutations: {
128
+ getField: jest.fn((fieldName) => ({
129
+ resolve: jest.fn(async (context, args) => {
130
+ const actions = require('../actions/users');
131
+ return await actions[fieldName](context, args);
132
+ })
133
+ }))
134
+ }
135
+ }));
136
+
137
+ // Define test cases
138
+ const testCases = [
139
+ {
140
+ name: 'addUser',
141
+ actionName: 'addUser',
142
+ args: { username: 'testuser', email: 'test@example.com' },
143
+ expectedCall: (context: any, args: any) => args,
144
+ mockReturnValue: createMockUser()
145
+ },
146
+ {
147
+ name: 'deactivateUser',
148
+ actionName: 'deactivateUser',
149
+ args: { userId: 'user1' },
150
+ expectedCall: (context: any, args: any) => args,
151
+ mockReturnValue: createMockUser(),
152
+ requiresAuth: true,
153
+ authUserId: 'user1'
154
+ }
155
+ ];
156
+
157
+ // Create the test suite
158
+ createMutationTestSuite(
159
+ 'User',
160
+ '../actions/users',
161
+ './users',
162
+ testCases
163
+ );
164
+ ```
165
+
166
+ ### 3. Integration Test Suite
167
+
168
+ Use `createIntegrationTestSuite` for testing integration scenarios:
169
+
170
+ ```typescript
171
+ import { createIntegrationTestSuite, createMockUser } from '../utils/testUtils';
172
+
173
+ // Define test cases
174
+ const testCases = [
175
+ {
176
+ name: 'getUserByEmail',
177
+ actionName: 'getUser',
178
+ args: { email: 'test@example.com' },
179
+ expectedCall: (context: any, args: any) => ({ email: args.email }),
180
+ successReturnValue: createMockUser(),
181
+ errorReturnValue: null,
182
+ testErrorCase: true
183
+ }
184
+ ];
185
+
186
+ // Create the integration test suite
187
+ createIntegrationTestSuite(
188
+ 'User',
189
+ '../actions/users',
190
+ '../objectTypes/user',
191
+ 'user',
192
+ testCases
193
+ );
194
+ ```
195
+
196
+ ## Test Case Configuration
197
+
198
+ ### Query Test Cases
199
+
200
+ ```typescript
201
+ {
202
+ name: string; // Test name
203
+ actionName: string; // Action function name
204
+ args: any; // Arguments to pass
205
+ expectedCall: (context: any, args: any) => any; // Expected call parameters
206
+ mockReturnValue?: any; // Mock return value
207
+ errorCase?: boolean; // Whether to test error handling
208
+ }
209
+ ```
210
+
211
+ ### Mutation Test Cases
212
+
213
+ ```typescript
214
+ {
215
+ name: string; // Test name
216
+ actionName: string; // Action function name
217
+ args: any; // Arguments to pass
218
+ expectedCall: (context: any, args: any) => any; // Expected call parameters
219
+ mockReturnValue?: any; // Mock return value
220
+ requiresAuth?: boolean; // Whether authentication is required
221
+ authUserId?: string; // User ID for auth check
222
+ errorCase?: boolean; // Whether to test error handling
223
+ }
224
+ ```
225
+
226
+ ### Integration Test Cases
227
+
228
+ ```typescript
229
+ {
230
+ name: string; // Test name
231
+ actionName: string; // Action function name
232
+ args: any; // Arguments to pass
233
+ expectedCall: (context: any, args: any) => any; // Expected call parameters
234
+ successReturnValue?: any; // Success case return value
235
+ errorReturnValue?: any; // Error case return value
236
+ testErrorCase?: boolean; // Whether to test error scenarios
237
+ }
238
+ ```
239
+
240
+ ## Migration Guide
241
+
242
+ ### From Manual Tests to Utilities
243
+
244
+ **Before (Manual):**
245
+ ```typescript
246
+ describe('User Queries', () => {
247
+ const mockContext = {
248
+ databaseName: 'test',
249
+ session: { userId: 'user1', username: 'testuser', userAccess: 1 }
250
+ };
251
+
252
+ beforeEach(() => {
253
+ jest.clearAllMocks();
254
+ });
255
+
256
+ describe('getUserByEmail', () => {
257
+ it('should call getUser action with email parameter', async () => {
258
+ const mockUser = { userId: 'user1', email: 'test@example.com' };
259
+ const { getUser } = require('../actions/users');
260
+ getUser.mockResolvedValue(mockUser);
261
+
262
+ const result = await getUser(mockContext, { email: 'test@example.com' });
263
+
264
+ expect(getUser).toHaveBeenCalledWith(mockContext, { email: 'test@example.com' });
265
+ expect(result).toEqual(mockUser);
266
+ });
267
+ });
268
+ });
269
+ ```
270
+
271
+ **After (Using Utilities):**
272
+ ```typescript
273
+ import { createQueryTestSuite, createMockUser } from '../utils/testUtils';
274
+
275
+ const testCases = [
276
+ {
277
+ name: 'getUserByEmail',
278
+ actionName: 'getUser',
279
+ args: { email: 'test@example.com' },
280
+ expectedCall: (context: any, args: any) => ({ email: args.email }),
281
+ mockReturnValue: createMockUser()
282
+ }
283
+ ];
284
+
285
+ createQueryTestSuite('User Queries', '../actions/users', '../objectTypes/user', 'user', testCases);
286
+ ```
287
+
288
+ ## Benefits
289
+
290
+ 1. **Reduced Code Duplication**: Common test patterns are abstracted into reusable functions
291
+ 2. **Consistent Testing**: All tests follow the same structure and patterns
292
+ 3. **Easier Maintenance**: Changes to test patterns only need to be made in one place
293
+ 4. **Better Readability**: Test intentions are clearer with declarative test case definitions
294
+ 5. **Faster Development**: New tests can be created quickly by defining test cases
295
+
296
+ ## Best Practices
297
+
298
+ 1. **Use Descriptive Names**: Make test case names clear and descriptive
299
+ 2. **Group Related Tests**: Use the suite name to group related functionality
300
+ 3. **Test Both Success and Error Cases**: Include error handling tests where appropriate
301
+ 4. **Use Mock Data Generators**: Use the provided mock data generators for consistent test data
302
+ 5. **Keep Test Cases Focused**: Each test case should test one specific scenario
303
+
304
+ ## Example: Complete Optimized Test File
305
+
306
+ ```typescript
307
+ import {
308
+ createQueryTestSuite,
309
+ createMockUser,
310
+ mockActionsModule,
311
+ mockObjectType
312
+ } from '../utils/testUtils';
313
+
314
+ // Mock dependencies
315
+ mockActionsModule('../actions/users', {
316
+ getUser: jest.fn(),
317
+ getSessionUser: jest.fn()
318
+ });
319
+
320
+ mockObjectType('../objectTypes/user', 'user');
321
+
322
+ // Define test cases
323
+ const userQueryTestCases = [
324
+ {
325
+ name: 'getUserByEmail',
326
+ actionName: 'getUser',
327
+ args: { email: 'test@example.com' },
328
+ expectedCall: (context: any, args: any) => ({ email: args.email }),
329
+ mockReturnValue: createMockUser(),
330
+ errorCase: true
331
+ },
332
+ {
333
+ name: 'getUserById',
334
+ actionName: 'getUser',
335
+ args: { userId: 'user1' },
336
+ expectedCall: (context: any, args: any) => ({ userId: args.userId }),
337
+ mockReturnValue: createMockUser(),
338
+ errorCase: true
339
+ },
340
+ {
341
+ name: 'getUserBySession',
342
+ actionName: 'getSessionUser',
343
+ args: {},
344
+ expectedCall: (context: any, args: any) => ({}),
345
+ mockReturnValue: createMockUser(),
346
+ errorCase: true
347
+ }
348
+ ];
349
+
350
+ // Create the test suite
351
+ createQueryTestSuite(
352
+ 'User Queries',
353
+ '../actions/users',
354
+ '../objectTypes/user',
355
+ 'user',
356
+ userQueryTestCases
357
+ );
358
+ ```
359
+
360
+ This approach reduces the original 130-line test file to just 40 lines while maintaining the same test coverage and functionality.
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">60.63% </span>
26
+ <span class="strong">78.94% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>248/409</span>
28
+ <span class='fraction'>2414/3058</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">41.89% </span>
33
+ <span class="strong">64.96% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>31/74</span>
35
+ <span class='fraction'>777/1196</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">45.45% </span>
40
+ <span class="strong">75.51% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>55/121</span>
42
+ <span class='fraction'>512/678</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">56.74% </span>
47
+ <span class="strong">77.19% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>202/356</span>
49
+ <span class='fraction'>2126/2754</span>
50
50
  </div>
51
51
 
52
52
 
@@ -79,52 +79,67 @@
79
79
  </tr>
80
80
  </thead>
81
81
  <tbody><tr>
82
- <td class="file medium" data-value="actions"><a href="actions/index.html">actions</a></td>
83
- <td data-value="57.53" class="pic medium">
84
- <div class="chart"><div class="cover-fill" style="width: 57%"></div><div class="cover-empty" style="width: 43%"></div></div>
82
+ <td class="file high" data-value="src"><a href="src/index.html">src</a></td>
83
+ <td data-value="100" class="pic high">
84
+ <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
85
+ </td>
86
+ <td data-value="100" class="pct high">100%</td>
87
+ <td data-value="17" class="abs high">17/17</td>
88
+ <td data-value="86.66" class="pct high">86.66%</td>
89
+ <td data-value="15" class="abs high">13/15</td>
90
+ <td data-value="100" class="pct high">100%</td>
91
+ <td data-value="4" class="abs high">4/4</td>
92
+ <td data-value="100" class="pct high">100%</td>
93
+ <td data-value="17" class="abs high">17/17</td>
94
+ </tr>
95
+
96
+ <tr>
97
+ <td class="file high" data-value="src/actions"><a href="src/actions/index.html">src/actions</a></td>
98
+ <td data-value="80.23" class="pic high">
99
+ <div class="chart"><div class="cover-fill" style="width: 80%"></div><div class="cover-empty" style="width: 20%"></div></div>
85
100
  </td>
86
- <td data-value="57.53" class="pct medium">57.53%</td>
87
- <td data-value="292" class="abs medium">168/292</td>
88
- <td data-value="33.33" class="pct low">33.33%</td>
89
- <td data-value="21" class="abs low">7/21</td>
90
- <td data-value="45.91" class="pct low">45.91%</td>
91
- <td data-value="98" class="abs low">45/98</td>
92
- <td data-value="53.78" class="pct medium">53.78%</td>
93
- <td data-value="264" class="abs medium">142/264</td>
101
+ <td data-value="80.23" class="pct high">80.23%</td>
102
+ <td data-value="2181" class="abs high">1750/2181</td>
103
+ <td data-value="64.36" class="pct medium">64.36%</td>
104
+ <td data-value="623" class="abs medium">401/623</td>
105
+ <td data-value="78.57" class="pct medium">78.57%</td>
106
+ <td data-value="490" class="abs medium">385/490</td>
107
+ <td data-value="78.57" class="pct medium">78.57%</td>
108
+ <td data-value="2002" class="abs medium">1573/2002</td>
94
109
  </tr>
95
110
 
96
111
  <tr>
97
- <td class="file high" data-value="adapters"><a href="adapters/index.html">adapters</a></td>
98
- <td data-value="93.75" class="pic high">
99
- <div class="chart"><div class="cover-fill" style="width: 93%"></div><div class="cover-empty" style="width: 7%"></div></div>
112
+ <td class="file medium" data-value="src/adapters"><a href="src/adapters/index.html">src/adapters</a></td>
113
+ <td data-value="61.71" class="pic medium">
114
+ <div class="chart"><div class="cover-fill" style="width: 61%"></div><div class="cover-empty" style="width: 39%"></div></div>
100
115
  </td>
101
- <td data-value="93.75" class="pct high">93.75%</td>
102
- <td data-value="32" class="abs high">30/32</td>
103
- <td data-value="64" class="pct medium">64%</td>
104
- <td data-value="25" class="abs medium">16/25</td>
105
- <td data-value="75" class="pct medium">75%</td>
106
- <td data-value="8" class="abs medium">6/8</td>
107
- <td data-value="100" class="pct high">100%</td>
108
- <td data-value="19" class="abs high">19/19</td>
116
+ <td data-value="61.71" class="pct medium">61.71%</td>
117
+ <td data-value="431" class="abs medium">266/431</td>
118
+ <td data-value="62.26" class="pct medium">62.26%</td>
119
+ <td data-value="424" class="abs medium">264/424</td>
120
+ <td data-value="40" class="pct low">40%</td>
121
+ <td data-value="75" class="abs low">30/75</td>
122
+ <td data-value="58.99" class="pct medium">58.99%</td>
123
+ <td data-value="378" class="abs medium">223/378</td>
109
124
  </tr>
110
125
 
111
126
  <tr>
112
- <td class="file high" data-value="mocks"><a href="mocks/index.html">mocks</a></td>
127
+ <td class="file high" data-value="src/mocks"><a href="src/mocks/index.html">src/mocks</a></td>
113
128
  <td data-value="100" class="pic high">
114
129
  <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
115
130
  </td>
116
131
  <td data-value="100" class="pct high">100%</td>
117
- <td data-value="10" class="abs high">10/10</td>
132
+ <td data-value="20" class="abs high">20/20</td>
118
133
  <td data-value="100" class="pct high">100%</td>
119
134
  <td data-value="0" class="abs high">0/0</td>
120
135
  <td data-value="100" class="pct high">100%</td>
121
136
  <td data-value="0" class="abs high">0/0</td>
122
137
  <td data-value="100" class="pct high">100%</td>
123
- <td data-value="10" class="abs high">10/10</td>
138
+ <td data-value="20" class="abs high">20/20</td>
124
139
  </tr>
125
140
 
126
141
  <tr>
127
- <td class="file high" data-value="types"><a href="types/index.html">types</a></td>
142
+ <td class="file high" data-value="src/types"><a href="src/types/index.html">src/types</a></td>
128
143
  <td data-value="100" class="pic high">
129
144
  <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
130
145
  </td>
@@ -139,18 +154,18 @@
139
154
  </tr>
140
155
 
141
156
  <tr>
142
- <td class="file medium" data-value="utils"><a href="utils/index.html">utils</a></td>
143
- <td data-value="52.7" class="pic medium">
144
- <div class="chart"><div class="cover-fill" style="width: 52%"></div><div class="cover-empty" style="width: 48%"></div></div>
157
+ <td class="file high" data-value="src/utils"><a href="src/utils/index.html">src/utils</a></td>
158
+ <td data-value="88.23" class="pic high">
159
+ <div class="chart"><div class="cover-fill" style="width: 88%"></div><div class="cover-empty" style="width: 12%"></div></div>
145
160
  </td>
146
- <td data-value="52.7" class="pct medium">52.7%</td>
147
- <td data-value="74" class="abs medium">39/74</td>
148
- <td data-value="28.57" class="pct low">28.57%</td>
149
- <td data-value="28" class="abs low">8/28</td>
150
- <td data-value="26.66" class="pct low">26.66%</td>
151
- <td data-value="15" class="abs low">4/15</td>
152
- <td data-value="48.38" class="pct low">48.38%</td>
153
- <td data-value="62" class="abs low">30/62</td>
161
+ <td data-value="88.23" class="pct high">88.23%</td>
162
+ <td data-value="408" class="abs high">360/408</td>
163
+ <td data-value="73.88" class="pct medium">73.88%</td>
164
+ <td data-value="134" class="abs medium">99/134</td>
165
+ <td data-value="85.32" class="pct high">85.32%</td>
166
+ <td data-value="109" class="abs high">93/109</td>
167
+ <td data-value="86.9" class="pct high">86.9%</td>
168
+ <td data-value="336" class="abs high">292/336</td>
154
169
  </tr>
155
170
 
156
171
  </tbody>
@@ -161,7 +176,7 @@
161
176
  <div class='footer quiet pad2 space-top1 center small'>
162
177
  Code coverage generated by
163
178
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
164
- at 2025-02-04T16:39:29.322Z
179
+ at 2025-07-02T05:49:37.404Z
165
180
  </div>
166
181
  <script src="prettify.js"></script>
167
182
  <script>