wabe 0.6.12 → 0.6.14

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 (156) hide show
  1. package/dist/database/DatabaseController.d.ts +2 -0
  2. package/dist/file/FileDevAdapter.d.ts +1 -0
  3. package/dist/graphql/pointerAndRelationFunction.d.ts +6 -0
  4. package/dist/index.js +3827 -3541
  5. package/dist/schema/Schema.d.ts +2 -2
  6. package/dist/server/generateCodegen.d.ts +10 -0
  7. package/dist/server/index.d.ts +2 -1
  8. package/dist/utils/objectKeys.d.ts +1 -0
  9. package/package.json +7 -4
  10. package/dev/index.ts +0 -215
  11. package/dist/schema/resolvers/sendEmail.d.ts +0 -1
  12. package/generated/schema.graphql +0 -1945
  13. package/generated/wabe.ts +0 -448
  14. package/src/authentication/OTP.test.ts +0 -69
  15. package/src/authentication/OTP.ts +0 -64
  16. package/src/authentication/Session.test.ts +0 -629
  17. package/src/authentication/Session.ts +0 -517
  18. package/src/authentication/cookies.ts +0 -10
  19. package/src/authentication/defaultAuthentication.ts +0 -209
  20. package/src/authentication/index.ts +0 -4
  21. package/src/authentication/interface.ts +0 -177
  22. package/src/authentication/oauth/GitHub.test.ts +0 -91
  23. package/src/authentication/oauth/GitHub.ts +0 -121
  24. package/src/authentication/oauth/Google.test.ts +0 -91
  25. package/src/authentication/oauth/Google.ts +0 -101
  26. package/src/authentication/oauth/Oauth2Client.test.ts +0 -219
  27. package/src/authentication/oauth/Oauth2Client.ts +0 -135
  28. package/src/authentication/oauth/index.ts +0 -2
  29. package/src/authentication/oauth/utils.test.ts +0 -33
  30. package/src/authentication/oauth/utils.ts +0 -27
  31. package/src/authentication/providers/EmailOTP.test.ts +0 -127
  32. package/src/authentication/providers/EmailOTP.ts +0 -95
  33. package/src/authentication/providers/EmailPassword.test.ts +0 -263
  34. package/src/authentication/providers/EmailPassword.ts +0 -138
  35. package/src/authentication/providers/EmailPasswordSRP.test.ts +0 -208
  36. package/src/authentication/providers/EmailPasswordSRP.ts +0 -191
  37. package/src/authentication/providers/GitHub.ts +0 -24
  38. package/src/authentication/providers/Google.ts +0 -24
  39. package/src/authentication/providers/OAuth.test.ts +0 -185
  40. package/src/authentication/providers/OAuth.ts +0 -106
  41. package/src/authentication/providers/PhonePassword.test.ts +0 -221
  42. package/src/authentication/providers/PhonePassword.ts +0 -136
  43. package/src/authentication/providers/QRCodeOTP.test.ts +0 -77
  44. package/src/authentication/providers/QRCodeOTP.ts +0 -69
  45. package/src/authentication/providers/index.ts +0 -6
  46. package/src/authentication/resolvers/refreshResolver.test.ts +0 -30
  47. package/src/authentication/resolvers/refreshResolver.ts +0 -19
  48. package/src/authentication/resolvers/signInWithResolver.inte.test.ts +0 -59
  49. package/src/authentication/resolvers/signInWithResolver.test.ts +0 -306
  50. package/src/authentication/resolvers/signInWithResolver.ts +0 -106
  51. package/src/authentication/resolvers/signOutResolver.test.ts +0 -38
  52. package/src/authentication/resolvers/signOutResolver.ts +0 -18
  53. package/src/authentication/resolvers/signUpWithResolver.test.ts +0 -180
  54. package/src/authentication/resolvers/signUpWithResolver.ts +0 -68
  55. package/src/authentication/resolvers/verifyChallenge.test.ts +0 -230
  56. package/src/authentication/resolvers/verifyChallenge.ts +0 -78
  57. package/src/authentication/roles.test.ts +0 -49
  58. package/src/authentication/roles.ts +0 -40
  59. package/src/authentication/security.ts +0 -278
  60. package/src/authentication/utils.test.ts +0 -97
  61. package/src/authentication/utils.ts +0 -39
  62. package/src/cache/InMemoryCache.test.ts +0 -62
  63. package/src/cache/InMemoryCache.ts +0 -45
  64. package/src/cron/index.test.ts +0 -17
  65. package/src/cron/index.ts +0 -43
  66. package/src/database/DatabaseController.test.ts +0 -613
  67. package/src/database/DatabaseController.ts +0 -1415
  68. package/src/database/index.test.ts +0 -1551
  69. package/src/database/index.ts +0 -9
  70. package/src/database/interface.ts +0 -308
  71. package/src/email/DevAdapter.ts +0 -7
  72. package/src/email/EmailController.test.ts +0 -29
  73. package/src/email/EmailController.ts +0 -13
  74. package/src/email/index.ts +0 -2
  75. package/src/email/interface.ts +0 -36
  76. package/src/email/templates/sendOtpCode.ts +0 -120
  77. package/src/file/FileController.ts +0 -28
  78. package/src/file/FileDevAdapter.ts +0 -51
  79. package/src/file/hookDeleteFile.ts +0 -25
  80. package/src/file/hookReadFile.ts +0 -66
  81. package/src/file/hookUploadFile.ts +0 -52
  82. package/src/file/index.test.ts +0 -1031
  83. package/src/file/index.ts +0 -2
  84. package/src/file/interface.ts +0 -63
  85. package/src/file/security.ts +0 -156
  86. package/src/graphql/GraphQLSchema.test.ts +0 -5099
  87. package/src/graphql/GraphQLSchema.ts +0 -886
  88. package/src/graphql/index.ts +0 -2
  89. package/src/graphql/parseGraphqlSchema.ts +0 -85
  90. package/src/graphql/parser.test.ts +0 -203
  91. package/src/graphql/parser.ts +0 -707
  92. package/src/graphql/pointerAndRelationFunction.ts +0 -191
  93. package/src/graphql/resolvers.ts +0 -464
  94. package/src/graphql/tests/aggregation.test.ts +0 -1115
  95. package/src/graphql/tests/e2e.test.ts +0 -590
  96. package/src/graphql/tests/scalars.test.ts +0 -250
  97. package/src/graphql/types.ts +0 -227
  98. package/src/hooks/HookObject.test.ts +0 -122
  99. package/src/hooks/HookObject.ts +0 -165
  100. package/src/hooks/authentication.ts +0 -67
  101. package/src/hooks/createUser.test.ts +0 -77
  102. package/src/hooks/createUser.ts +0 -10
  103. package/src/hooks/defaultFields.test.ts +0 -176
  104. package/src/hooks/defaultFields.ts +0 -32
  105. package/src/hooks/deleteSession.test.ts +0 -181
  106. package/src/hooks/deleteSession.ts +0 -20
  107. package/src/hooks/hashFieldHook.test.ts +0 -152
  108. package/src/hooks/hashFieldHook.ts +0 -89
  109. package/src/hooks/index.test.ts +0 -258
  110. package/src/hooks/index.ts +0 -420
  111. package/src/hooks/permissions.test.ts +0 -412
  112. package/src/hooks/permissions.ts +0 -93
  113. package/src/hooks/protected.test.ts +0 -551
  114. package/src/hooks/protected.ts +0 -74
  115. package/src/hooks/searchableFields.test.ts +0 -147
  116. package/src/hooks/searchableFields.ts +0 -86
  117. package/src/hooks/session.test.ts +0 -134
  118. package/src/hooks/session.ts +0 -76
  119. package/src/hooks/setEmail.test.ts +0 -216
  120. package/src/hooks/setEmail.ts +0 -33
  121. package/src/hooks/setupAcl.test.ts +0 -618
  122. package/src/hooks/setupAcl.ts +0 -25
  123. package/src/hooks/virtualFields.test.ts +0 -228
  124. package/src/hooks/virtualFields.ts +0 -48
  125. package/src/index.ts +0 -9
  126. package/src/schema/Schema.test.ts +0 -482
  127. package/src/schema/Schema.ts +0 -839
  128. package/src/schema/defaultResolvers.ts +0 -93
  129. package/src/schema/index.ts +0 -1
  130. package/src/schema/resolvers/meResolver.test.ts +0 -62
  131. package/src/schema/resolvers/meResolver.ts +0 -10
  132. package/src/schema/resolvers/resetPassword.test.ts +0 -341
  133. package/src/schema/resolvers/resetPassword.ts +0 -63
  134. package/src/schema/resolvers/sendEmail.test.ts +0 -118
  135. package/src/schema/resolvers/sendEmail.ts +0 -21
  136. package/src/schema/resolvers/sendOtpCode.test.ts +0 -141
  137. package/src/schema/resolvers/sendOtpCode.ts +0 -52
  138. package/src/security.test.ts +0 -4136
  139. package/src/server/defaultSessionHandler.test.ts +0 -62
  140. package/src/server/defaultSessionHandler.ts +0 -104
  141. package/src/server/generateCodegen.ts +0 -433
  142. package/src/server/index.test.ts +0 -843
  143. package/src/server/index.ts +0 -336
  144. package/src/server/interface.ts +0 -11
  145. package/src/server/routes/authHandler.ts +0 -171
  146. package/src/server/routes/index.ts +0 -48
  147. package/src/utils/crypto.test.ts +0 -41
  148. package/src/utils/crypto.ts +0 -105
  149. package/src/utils/database.ts +0 -8
  150. package/src/utils/export.ts +0 -12
  151. package/src/utils/helper.ts +0 -204
  152. package/src/utils/index.test.ts +0 -11
  153. package/src/utils/index.ts +0 -196
  154. package/src/utils/preload.ts +0 -8
  155. package/src/utils/testHelper.ts +0 -124
  156. package/tsconfig.json +0 -32
@@ -1,1551 +0,0 @@
1
- import {
2
- afterAll,
3
- beforeAll,
4
- describe,
5
- expect,
6
- it,
7
- mock,
8
- spyOn,
9
- beforeEach,
10
- type Mock,
11
- } from 'bun:test'
12
- import type { Wabe } from '../server'
13
- import {
14
- type DevWabeTypes,
15
- getAdminUserClient,
16
- getAnonymousClient,
17
- getGraphqlClient,
18
- } from '../utils/helper'
19
- import { setupTests, closeTests } from '../utils/testHelper'
20
- import type { WabeContext } from '../server/interface'
21
- import { OperationType, getDefaultHooks } from '../hooks'
22
- import { gql } from 'graphql-request'
23
- import { contextWithRoot } from '../utils/export'
24
-
25
- describe('Database', () => {
26
- let wabe: Wabe<DevWabeTypes>
27
- let context: WabeContext<any>
28
-
29
- const mockUpdateObject = mock(async () => {
30
- await context.wabe.controllers.database.updateObjects({
31
- className: 'User',
32
- where: {
33
- name: { equalTo: 'Lucas' },
34
- },
35
- data: { age: 21 },
36
- context,
37
- select: {},
38
- })
39
- })
40
-
41
- const mockAfterUpdate = mock(async () => {
42
- await context.wabe.controllers.database.createObjects({
43
- className: 'Test2',
44
- data: [{ name: 'test' }],
45
- context,
46
- select: {},
47
- })
48
- })
49
-
50
- let spyGetObjects: Mock<any>
51
- let spyGetObject: Mock<any>
52
-
53
- beforeAll(async () => {
54
- const setup = await setupTests([
55
- {
56
- name: 'Test',
57
- fields: {
58
- name: { type: 'String' },
59
- },
60
- permissions: {
61
- read: {
62
- authorizedRoles: [],
63
- requireAuthentication: true,
64
- },
65
- create: {
66
- authorizedRoles: ['Client'],
67
- requireAuthentication: true,
68
- },
69
- },
70
- },
71
- {
72
- name: 'Test2',
73
- fields: {
74
- name: { type: 'String' },
75
- age: { type: 'Int' },
76
- userTest: { type: 'Relation', class: 'User' },
77
- userTest2: { type: 'Pointer', class: 'User' },
78
- test3: { type: 'Relation', class: 'Test3' },
79
- },
80
- permissions: {
81
- read: {
82
- authorizedRoles: ['Client2'],
83
- requireAuthentication: true,
84
- },
85
- create: {
86
- authorizedRoles: [],
87
- requireAuthentication: true,
88
- },
89
- },
90
- },
91
- {
92
- name: 'Test3',
93
- fields: {
94
- name: { type: 'String' },
95
- test2: { type: 'Pointer', class: 'Test2' },
96
- },
97
- permissions: {
98
- read: {
99
- authorizedRoles: ['Client2'],
100
- requireAuthentication: true,
101
- },
102
- create: {
103
- authorizedRoles: [],
104
- requireAuthentication: true,
105
- },
106
- },
107
- },
108
- ])
109
- wabe = setup.wabe
110
-
111
- context = {
112
- isRoot: true,
113
- wabe: {
114
- controllers: { database: wabe.controllers.database },
115
- config: wabe.config,
116
- },
117
- } as WabeContext<any>
118
-
119
- spyGetObjects = spyOn(wabe.controllers.database, 'getObjects')
120
- spyGetObject = spyOn(wabe.controllers.database, 'getObject')
121
- })
122
-
123
- afterAll(async () => {
124
- await closeTests(wabe)
125
- })
126
-
127
- beforeEach(async () => {
128
- await wabe.controllers.database.adapter.clearDatabase()
129
-
130
- wabe.config.hooks = getDefaultHooks()
131
-
132
- mockUpdateObject.mockClear()
133
- mockAfterUpdate.mockClear()
134
- spyGetObject.mockClear()
135
- spyGetObjects.mockClear()
136
- })
137
-
138
- it('should allow to signUp with anonymous user and read his own data', async () => {
139
- const setup = await setupTests([
140
- {
141
- name: 'User',
142
- fields: {},
143
- searchableFields: ['email', 'firstName', 'lastName'],
144
- permissions: {
145
- read: {
146
- authorizedRoles: ['Admin', 'Client'],
147
- requireAuthentication: true,
148
- },
149
- update: {
150
- authorizedRoles: ['Admin', 'Client'],
151
- requireAuthentication: true,
152
- },
153
- delete: {
154
- authorizedRoles: ['Admin', 'Client'],
155
- requireAuthentication: true,
156
- },
157
- },
158
- },
159
- ])
160
-
161
- const client = getAnonymousClient(setup.port)
162
-
163
- const res = await client.request<any>(
164
- gql`
165
- mutation signUpWith($input: SignUpWithInput!) {
166
- signUpWith(input: $input) {
167
- id
168
- accessToken
169
- refreshToken
170
- }
171
- }
172
- `,
173
- {
174
- input: {
175
- authentication: {
176
- emailPassword: {
177
- email: 'test@example.com',
178
- password: 'password',
179
- },
180
- },
181
- },
182
- },
183
- )
184
-
185
- expect(res.signUpWith.id).toBeDefined()
186
- expect(res.signUpWith.accessToken).toBeDefined()
187
- expect(res.signUpWith.refreshToken).toBeDefined()
188
- })
189
-
190
- it('should return id of a relation if set to true in select on getObject', async () => {
191
- const rootClient = getGraphqlClient(wabe.config.port)
192
-
193
- const createdObject = await rootClient.request<any>(gql`
194
- mutation createTest2 {
195
- createTest2(input: { fields: { test3: { createAndAdd: [{ name: "test" }] } } }) {
196
- test2 {
197
- id
198
- test3 {
199
- edges {
200
- node {
201
- name
202
- }
203
- }
204
- }
205
- }
206
- }
207
- }
208
- `)
209
-
210
- const res = await wabe.controllers.database.getObject({
211
- // @ts-expect-error
212
- className: 'Test2',
213
- context,
214
- id: createdObject.createTest2.test2.id,
215
- select: {
216
- id: true,
217
- // @ts-expect-error
218
- test3: true,
219
- },
220
- })
221
-
222
- // @ts-expect-error
223
- expect(res.test3[0]).toEqual(
224
- expect.objectContaining({
225
- id: expect.any(String),
226
- }),
227
- )
228
- })
229
-
230
- it('should be able to create an object with a relation and a pointer', async () => {
231
- const rootClient = getGraphqlClient(wabe.config.port)
232
-
233
- const res = await rootClient.request<any>(gql`
234
- mutation createTest2 {
235
- createTest2(input: { fields: { userTest: { createAndAdd: [{ name: "test" }] } } }) {
236
- test2 {
237
- id
238
- userTest {
239
- edges {
240
- node {
241
- name
242
- }
243
- }
244
- }
245
- }
246
- }
247
- }
248
- `)
249
-
250
- expect(res.createTest2.test2.userTest.edges[0].node.name).toEqual('test')
251
-
252
- const res2 = await rootClient.request<any>(gql`
253
- mutation createTest2 {
254
- createTest2(input: { fields: { userTest2: { createAndLink: { name: "test" } } } }) {
255
- test2 {
256
- id
257
- userTest2 {
258
- name
259
- }
260
- }
261
- }
262
- }
263
- `)
264
-
265
- expect(res2.createTest2.test2.userTest2.name).toEqual('test')
266
- })
267
-
268
- it('should not return point data whe no pointer is present on the object', async () => {
269
- const rootClient = getGraphqlClient(wabe.config.port)
270
-
271
- await rootClient.request<any>(gql`
272
- mutation createTest2 {
273
- createTest2(input: { fields: { age: 20 } }) {
274
- test2 {
275
- id
276
- userTest2 {
277
- id
278
- }
279
- }
280
- }
281
- }
282
- `)
283
-
284
- await rootClient.request<any>(gql`
285
- mutation createTest2 {
286
- createTest2(input: { fields: { userTest2: { createAndLink: { name: "test" } } } }) {
287
- test2 {
288
- id
289
- }
290
- }
291
- }
292
- `)
293
-
294
- const res = await rootClient.request<any>(gql`
295
- query test2s {
296
- test2s {
297
- edges {
298
- node {
299
- id
300
- userTest2 {
301
- id
302
- }
303
- }
304
- }
305
- }
306
- }
307
- `)
308
-
309
- expect(res.test2s.edges[0].node.userTest2).toBeNull()
310
- expect(res.test2s.edges[1].node.userTest2.id).toBeDefined()
311
- })
312
-
313
- it('should not return all relation when no array of id is present on the object', async () => {
314
- const rootClient = getGraphqlClient(wabe.config.port)
315
-
316
- await rootClient.request<any>(gql`
317
- mutation createTest2 {
318
- createTest2(input: { fields: { age: 20 } }) {
319
- test2 {
320
- id
321
- userTest {
322
- edges {
323
- node {
324
- name
325
- }
326
- }
327
- }
328
- }
329
- }
330
- }
331
- `)
332
-
333
- await rootClient.request<any>(gql`
334
- mutation createTest2 {
335
- createTest2(input: { fields: { userTest: { createAndAdd: [{ name: "test" }] } } }) {
336
- test2 {
337
- id
338
- userTest {
339
- edges {
340
- node {
341
- name
342
- }
343
- }
344
- }
345
- }
346
- }
347
- }
348
- `)
349
-
350
- const res = await rootClient.request<any>(gql`
351
- query test2s {
352
- test2s {
353
- edges {
354
- node {
355
- id
356
- userTest {
357
- edges {
358
- node {
359
- name
360
- }
361
- }
362
- }
363
- }
364
- }
365
- }
366
- }
367
- `)
368
-
369
- expect(res.test2s.edges[0].node.userTest).toBeNull()
370
- expect(res.test2s.edges[1].node.userTest.edges.length).toEqual(1)
371
- })
372
-
373
- it('should return correct data and type for relation with databaseController with created object', async () => {
374
- const createdUserObject = await wabe.controllers.database.createObject({
375
- className: 'User',
376
- context,
377
- data: {
378
- name: 'test',
379
- },
380
- })
381
-
382
- await wabe.controllers.database.createObject({
383
- // @ts-expect-error
384
- className: 'Test2',
385
- select: {},
386
- context,
387
- data: {
388
- // @ts-expect-error
389
- userTest: [createdUserObject?.id],
390
- },
391
- })
392
-
393
- const res = await wabe.controllers.database.getObjects({
394
- // @ts-expect-error
395
- className: 'Test2',
396
- context,
397
- select: {
398
- id: true,
399
- // @ts-expect-error
400
- userTest: {
401
- id: true,
402
- name: true,
403
- },
404
- },
405
- })
406
-
407
- // @ts-expect-error
408
- expect(res[0].userTest).toEqual([{ name: 'test', id: expect.any(String) }])
409
- })
410
-
411
- it('should filter relation with have through databaseController where', async () => {
412
- const matchingUser = await wabe.controllers.database.createObject({
413
- className: 'User',
414
- context,
415
- data: { name: 'match-user' },
416
- select: { id: true },
417
- })
418
- const otherUser = await wabe.controllers.database.createObject({
419
- className: 'User',
420
- context,
421
- data: { name: 'other-user' },
422
- select: { id: true },
423
- })
424
-
425
- await wabe.controllers.database.createObjects({
426
- // @ts-expect-error
427
- className: 'Test2',
428
- context,
429
- data: [
430
- // @ts-expect-error
431
- { name: 'match-parent', userTest: [matchingUser?.id] },
432
- // @ts-expect-error
433
- { name: 'other-parent', userTest: [otherUser?.id] },
434
- ],
435
- select: { id: true },
436
- })
437
-
438
- const filtered = await wabe.controllers.database.getObjects({
439
- // @ts-expect-error
440
- className: 'Test2',
441
- context,
442
- // @ts-expect-error relation where type is not fully expressed in DevWabeTypes
443
- where: { userTest: { have: { name: { equalTo: 'match-user' } } } },
444
- // @ts-expect-error Test2 fields are runtime-defined in setup schema
445
- select: { id: true, name: true },
446
- })
447
-
448
- expect(filtered.length).toBe(1)
449
- expect((filtered[0] as any)?.name).toBe('match-parent')
450
- })
451
-
452
- it('should filter relation with isEmpty true and false through databaseController where', async () => {
453
- const linkedUser = await wabe.controllers.database.createObject({
454
- className: 'User',
455
- context,
456
- data: { name: 'linked-user' },
457
- select: { id: true },
458
- })
459
-
460
- await wabe.controllers.database.createObjects({
461
- // @ts-expect-error
462
- className: 'Test2',
463
- context,
464
- data: [
465
- // @ts-expect-error
466
- { name: 'empty-parent' },
467
- // @ts-expect-error
468
- { name: 'non-empty-parent', userTest: [linkedUser?.id] },
469
- ],
470
- select: { id: true },
471
- })
472
-
473
- const emptyRelation = await wabe.controllers.database.getObjects({
474
- // @ts-expect-error
475
- className: 'Test2',
476
- context,
477
- // @ts-expect-error relation where type is not fully expressed in DevWabeTypes
478
- where: { userTest: { isEmpty: true } },
479
- // @ts-expect-error Test2 fields are runtime-defined in setup schema
480
- select: { name: true },
481
- })
482
-
483
- const nonEmptyRelation = await wabe.controllers.database.getObjects({
484
- // @ts-expect-error
485
- className: 'Test2',
486
- context,
487
- // @ts-expect-error relation where type is not fully expressed in DevWabeTypes
488
- where: { userTest: { isEmpty: false } },
489
- // @ts-expect-error Test2 fields are runtime-defined in setup schema
490
- select: { name: true },
491
- })
492
-
493
- expect(emptyRelation.length).toBe(1)
494
- expect((emptyRelation[0] as any)?.name).toBe('empty-parent')
495
- expect(nonEmptyRelation.length).toBe(1)
496
- expect((nonEmptyRelation[0] as any)?.name).toBe('non-empty-parent')
497
- })
498
-
499
- it('should support relation where with nested AND/OR composition', async () => {
500
- const targetUser = await wabe.controllers.database.createObject({
501
- className: 'User',
502
- context,
503
- data: { name: 'target-user' },
504
- select: { id: true },
505
- })
506
- const nonTargetUser = await wabe.controllers.database.createObject({
507
- className: 'User',
508
- context,
509
- data: { name: 'non-target-user' },
510
- select: { id: true },
511
- })
512
-
513
- await wabe.controllers.database.createObjects({
514
- // @ts-expect-error
515
- className: 'Test2',
516
- context,
517
- data: [
518
- // @ts-expect-error
519
- { name: 'candidate', userTest: [targetUser?.id] },
520
- // @ts-expect-error
521
- { name: 'candidate', userTest: [nonTargetUser?.id] },
522
- // @ts-expect-error
523
- { name: 'outside-or' },
524
- ],
525
- select: { id: true },
526
- })
527
-
528
- const filtered = await wabe.controllers.database.getObjects({
529
- // @ts-expect-error
530
- className: 'Test2',
531
- context,
532
- where: {
533
- AND: [
534
- {
535
- // @ts-expect-error Test2 fields are runtime-defined in setup schema
536
- OR: [{ name: { equalTo: 'candidate' } }, { name: { equalTo: 'other' } }],
537
- },
538
- {
539
- // @ts-expect-error relation where type is not fully expressed in DevWabeTypes
540
- userTest: { have: { name: { equalTo: 'target-user' } } },
541
- },
542
- ],
543
- },
544
- // @ts-expect-error Test2 fields are runtime-defined in setup schema
545
- select: { id: true, name: true },
546
- })
547
-
548
- expect(filtered.length).toBe(1)
549
- expect((filtered[0] as any)?.name).toBe('candidate')
550
- })
551
-
552
- it('should support count with relation have where filter', async () => {
553
- const includedUser = await wabe.controllers.database.createObject({
554
- className: 'User',
555
- context,
556
- data: { name: 'included-user' },
557
- select: { id: true },
558
- })
559
- const excludedUser = await wabe.controllers.database.createObject({
560
- className: 'User',
561
- context,
562
- data: { name: 'excluded-user' },
563
- select: { id: true },
564
- })
565
-
566
- await wabe.controllers.database.createObjects({
567
- // @ts-expect-error
568
- className: 'Test2',
569
- context,
570
- data: [
571
- // @ts-expect-error
572
- { name: 'included-parent', userTest: [includedUser?.id] },
573
- // @ts-expect-error
574
- { name: 'excluded-parent', userTest: [excludedUser?.id] },
575
- ],
576
- select: { id: true },
577
- })
578
-
579
- const totalCount = await wabe.controllers.database.count({
580
- // @ts-expect-error
581
- className: 'Test2',
582
- context,
583
- // @ts-expect-error relation where type is not fully expressed in DevWabeTypes
584
- where: { userTest: { have: { name: { equalTo: 'included-user' } } } },
585
- })
586
-
587
- expect(totalCount).toBe(1)
588
- })
589
-
590
- it("should return null on a pointer if the pointer doesn't exist", async () => {
591
- await getGraphqlClient(wabe.config.port).request<any>(graphql.signUpWith, {
592
- input: {
593
- authentication: {
594
- emailPassword: {
595
- email: 'email@test.com',
596
- password: 'password,',
597
- },
598
- },
599
- },
600
- })
601
-
602
- const res = await wabe.controllers.database.getObjects({
603
- className: 'User',
604
- context,
605
- select: {
606
- id: true,
607
- role: true,
608
- },
609
- })
610
-
611
- expect(res[0]?.role).toBeNull()
612
- })
613
-
614
- it('should return all the pointer data when we set the relation class to true in select', async () => {
615
- await getAdminUserClient(context.wabe.config.port, context.wabe, {
616
- email: 'email@test.fr',
617
- password: 'password',
618
- })
619
-
620
- const res = await wabe.controllers.database.getObjects({
621
- className: 'User',
622
- context,
623
- select: {
624
- id: true,
625
- role: true,
626
- },
627
- })
628
-
629
- expect(res[0]?.role).toEqual(
630
- expect.objectContaining({
631
- name: 'Admin',
632
- id: expect.any(String),
633
- }),
634
- )
635
- })
636
-
637
- it('should have access to original object in afterDelete hook with deleteObject', async () => {
638
- const mockInsideCallback = mock(() => {})
639
- wabe.config.hooks = [
640
- {
641
- className: 'User',
642
- operationType: OperationType.AfterDelete,
643
- priority: 1,
644
- callback: (hookObject) => {
645
- mockInsideCallback()
646
-
647
- expect(hookObject.originalObject).toEqual(
648
- expect.objectContaining({
649
- name: 'John',
650
- age: 20,
651
- }),
652
- )
653
- },
654
- },
655
- ]
656
-
657
- const object = await wabe.controllers.database.createObject({
658
- className: 'User',
659
- data: {
660
- name: 'John',
661
- age: 20,
662
- },
663
- select: { id: true },
664
- context,
665
- })
666
-
667
- await wabe.controllers.database.deleteObject({
668
- className: 'User',
669
- context,
670
- select: { id: true },
671
- id: object?.id || '',
672
- })
673
-
674
- expect(mockInsideCallback).toHaveBeenCalledTimes(1)
675
- })
676
-
677
- it('should have access to original object in afterDelete hook with deleteObjects', async () => {
678
- const mockInsideCallback = mock(() => {})
679
- wabe.config.hooks = [
680
- {
681
- className: 'User',
682
- operationType: OperationType.AfterDelete,
683
- priority: 1,
684
- callback: (hookObject) => {
685
- mockInsideCallback()
686
-
687
- expect(hookObject.originalObject).toEqual(
688
- expect.objectContaining({
689
- name: 'John',
690
- age: 20,
691
- }),
692
- )
693
- },
694
- },
695
- ]
696
-
697
- const object = await wabe.controllers.database.createObject({
698
- className: 'User',
699
- data: {
700
- name: 'John',
701
- age: 20,
702
- },
703
- select: { id: true },
704
- context,
705
- })
706
-
707
- await wabe.controllers.database.deleteObjects({
708
- className: 'User',
709
- context,
710
- select: { id: true },
711
- where: { id: { equalTo: object?.id || '' } },
712
- })
713
-
714
- expect(mockInsideCallback).toHaveBeenCalledTimes(1)
715
- })
716
-
717
- it('should have access to original object in afterUpdate hook with updateObject', async () => {
718
- const mockInsideCallback = mock(() => {})
719
- wabe.config.hooks = [
720
- {
721
- className: 'User',
722
- operationType: OperationType.AfterUpdate,
723
- priority: 1,
724
- callback: (hookObject) => {
725
- mockInsideCallback()
726
-
727
- expect(hookObject.originalObject).toEqual(
728
- expect.objectContaining({
729
- name: 'John',
730
- age: 20,
731
- }),
732
- )
733
- },
734
- },
735
- ]
736
-
737
- const object = await wabe.controllers.database.createObject({
738
- className: 'User',
739
- data: {
740
- name: 'John',
741
- age: 20,
742
- },
743
- select: { id: true },
744
- context,
745
- })
746
-
747
- await wabe.controllers.database.updateObject({
748
- className: 'User',
749
- context,
750
- select: { id: true },
751
- data: { name: 'John2' },
752
- id: object?.id || '',
753
- })
754
-
755
- expect(mockInsideCallback).toHaveBeenCalledTimes(1)
756
- })
757
-
758
- it('should have access to original object in afterUpdate hook with updateObjects', async () => {
759
- const mockInsideCallback = mock(() => {})
760
- wabe.config.hooks = [
761
- {
762
- className: 'User',
763
- operationType: OperationType.AfterUpdate,
764
- priority: 1,
765
- callback: (hookObject) => {
766
- mockInsideCallback()
767
-
768
- expect(hookObject.originalObject).toEqual(
769
- expect.objectContaining({
770
- name: 'John',
771
- age: 20,
772
- }),
773
- )
774
- },
775
- },
776
- ]
777
-
778
- const object = await wabe.controllers.database.createObject({
779
- className: 'User',
780
- data: {
781
- name: 'John',
782
- age: 20,
783
- },
784
- select: { id: true },
785
- context,
786
- })
787
-
788
- await wabe.controllers.database.updateObjects({
789
- className: 'User',
790
- context,
791
- select: { id: true },
792
- data: { name: 'John2' },
793
- where: { id: { equalTo: object?.id || '' } },
794
- })
795
-
796
- expect(mockInsideCallback).toHaveBeenCalledTimes(1)
797
- })
798
-
799
- it('should get all the objects with limit', async () => {
800
- const res = await wabe.controllers.database.createObjects({
801
- className: 'User',
802
- data: [
803
- {
804
- name: 'John',
805
- age: 20,
806
- },
807
- {
808
- name: 'John1',
809
- age: 20,
810
- },
811
- {
812
- name: 'John2',
813
- age: 20,
814
- },
815
- {
816
- name: 'John3',
817
- age: 20,
818
- },
819
- {
820
- name: 'John4',
821
- age: 20,
822
- },
823
- ],
824
- select: { name: true, id: true },
825
- first: 2,
826
- context,
827
- })
828
-
829
- expect(res.length).toEqual(2)
830
- })
831
-
832
- it('should get all the objects with negative limit and offset', async () => {
833
- const res = await wabe.controllers.database.createObjects({
834
- className: 'User',
835
- data: [
836
- {
837
- name: 'John',
838
- age: 20,
839
- },
840
- {
841
- name: 'John1',
842
- age: 20,
843
- },
844
- {
845
- name: 'John2',
846
- age: 20,
847
- },
848
- {
849
- name: 'John3',
850
- age: 20,
851
- },
852
- {
853
- name: 'John4',
854
- age: 20,
855
- },
856
- ],
857
- select: { name: true, id: true },
858
- context,
859
- })
860
-
861
- expect(res.length).toEqual(5)
862
-
863
- expect(
864
- wabe.controllers.database.createObjects({
865
- className: 'User',
866
- data: [
867
- {
868
- name: 'John',
869
- age: 20,
870
- },
871
- {
872
- name: 'John1',
873
- age: 20,
874
- },
875
- {
876
- name: 'John2',
877
- age: 20,
878
- },
879
- {
880
- name: 'John3',
881
- age: 20,
882
- },
883
- {
884
- name: 'John4',
885
- age: 20,
886
- },
887
- ],
888
- select: { name: true, id: true },
889
- offset: -2,
890
- context,
891
- }),
892
- ).rejects.toThrow()
893
- })
894
-
895
- it('should createObjects and deleteObjects with offset and limit', async () => {
896
- const res = await wabe.controllers.database.createObjects({
897
- className: 'User',
898
- data: [
899
- {
900
- name: 'John',
901
- age: 20,
902
- },
903
- {
904
- name: 'John1',
905
- age: 20,
906
- },
907
- {
908
- name: 'John2',
909
- age: 20,
910
- },
911
- {
912
- name: 'John3',
913
- age: 20,
914
- },
915
- {
916
- name: 'John4',
917
- age: 20,
918
- },
919
- ],
920
- select: { name: true, id: true },
921
- first: 2,
922
- offset: 2,
923
- order: { name: 'ASC' },
924
- context,
925
- })
926
-
927
- expect(res.length).toEqual(2)
928
- expect(res[0]?.name).toEqual('John2')
929
- expect(res[1]?.name).toEqual('John3')
930
-
931
- await wabe.controllers.database.deleteObjects({
932
- className: 'User',
933
- where: {
934
- OR: [
935
- { name: { equalTo: 'John2' } },
936
- { name: { equalTo: 'John3' } },
937
- { name: { equalTo: 'John4' } },
938
- ],
939
- },
940
- select: { name: true },
941
- first: 2,
942
- offset: 1,
943
- context,
944
- })
945
-
946
- const res2 = await wabe.controllers.database.getObjects({
947
- className: 'User',
948
- where: {
949
- OR: [
950
- { name: { equalTo: 'John2' } },
951
- { name: { equalTo: 'John3' } },
952
- { name: { equalTo: 'John4' } },
953
- ],
954
- },
955
- context,
956
- })
957
-
958
- expect(res2.length).toEqual(0)
959
- })
960
-
961
- it('should return null on createObject when no fields are provided', async () => {
962
- const res = await wabe.controllers.database.createObject({
963
- className: 'User',
964
- context,
965
- data: { name: 'Lucas' },
966
- select: {},
967
- })
968
-
969
- expect(res).toBeNull()
970
- })
971
-
972
- it('should return empty array on createObjects when no fields are provided', async () => {
973
- const res = await wabe.controllers.database.createObjects({
974
- className: 'User',
975
- context,
976
- data: [{ name: 'Lucas' }],
977
- select: {},
978
- })
979
-
980
- expect(res).toBeEmpty()
981
- })
982
-
983
- it('should return null on updateObject when no fields are provided', async () => {
984
- const createdObject = await wabe.controllers.database.createObject({
985
- className: 'User',
986
- context,
987
- data: { name: 'Lucas' },
988
- select: { id: true },
989
- })
990
-
991
- const res = await wabe.controllers.database.updateObject({
992
- className: 'User',
993
- context,
994
- data: { name: 'Lucas' },
995
- select: {},
996
- id: createdObject?.id || '',
997
- })
998
-
999
- expect(res).toBeNull()
1000
- })
1001
-
1002
- it('should return empty array on updateObjects when no fields are provided', async () => {
1003
- await wabe.controllers.database.createObject({
1004
- className: 'User',
1005
- context,
1006
- data: { name: 'Lucas' },
1007
- select: { id: true },
1008
- })
1009
-
1010
- const res = await wabe.controllers.database.updateObjects({
1011
- className: 'User',
1012
- context,
1013
- data: { name: 'Lucas2' },
1014
- select: {},
1015
- where: { name: { equalTo: 'Lucas' } },
1016
- })
1017
-
1018
- expect(res).toBeEmpty()
1019
- })
1020
-
1021
- it('should return null on deleteObject when no fields are provided', async () => {
1022
- const createdObject = await wabe.controllers.database.createObject({
1023
- className: 'User',
1024
- context,
1025
- data: { name: 'Lucas' },
1026
- select: { id: true },
1027
- })
1028
-
1029
- const res = await wabe.controllers.database.deleteObject({
1030
- className: 'User',
1031
- context,
1032
- select: {},
1033
- id: createdObject?.id || '',
1034
- })
1035
-
1036
- expect(res).toBeNull()
1037
- })
1038
-
1039
- it('should return empty array on deleteObjects when no fields are provided', async () => {
1040
- await wabe.controllers.database.createObject({
1041
- className: 'User',
1042
- context,
1043
- data: { name: 'Lucas' },
1044
- select: { id: true },
1045
- })
1046
-
1047
- const res = await wabe.controllers.database.deleteObjects({
1048
- className: 'User',
1049
- context,
1050
- select: {},
1051
- where: { name: { equalTo: 'Lucas' } },
1052
- })
1053
-
1054
- expect(res).toBeEmpty()
1055
- })
1056
-
1057
- it("should return all elements of a class when the object doesn't have ACL but the user is connected", async () => {
1058
- const adminClient = await getAdminUserClient(context.wabe.config.port, context.wabe, {
1059
- email: 'email@test.fr',
1060
- password: 'password',
1061
- })
1062
-
1063
- await wabe.controllers.database.createObject({
1064
- className: 'User',
1065
- context: contextWithRoot(context),
1066
- data: {
1067
- name: 'Doe',
1068
- },
1069
- select: {},
1070
- })
1071
-
1072
- const {
1073
- users: { edges },
1074
- } = await adminClient.request<any>(graphql.users)
1075
-
1076
- expect(edges.length).toEqual(1)
1077
- expect(edges[0]?.node?.email).toEqual('email@test.fr')
1078
- expect(edges[0]?.node?.role?.name).toEqual('Admin')
1079
- })
1080
-
1081
- it('should order the element in the query by name ASC using order enum', async () => {
1082
- await wabe.controllers.database.createObjects({
1083
- className: 'User',
1084
- context,
1085
- data: [{ name: 'test1' }, { name: 'test2' }, { name: 'test3' }, { name: 'test4' }],
1086
- select: {},
1087
- })
1088
-
1089
- const res = await wabe.controllers.database.getObjects({
1090
- className: 'User',
1091
- context,
1092
- select: { name: true },
1093
- order: { name: 'ASC' },
1094
- })
1095
-
1096
- expect(res[0]?.name).toBe('test1')
1097
- expect(res[1]?.name).toBe('test2')
1098
- })
1099
-
1100
- it('should create object with subobject (hooks default call authentication before create user)', async () => {
1101
- const res = await wabe.controllers.database.createObject({
1102
- className: 'User',
1103
- context,
1104
- select: { authentication: true },
1105
- data: {
1106
- provider: 'Google',
1107
- isOauth: true,
1108
- authentication: {
1109
- google: {
1110
- email: 'email@test.fr',
1111
- verifiedEmail: true,
1112
- },
1113
- },
1114
- },
1115
- })
1116
-
1117
- expect(res?.authentication?.google).toEqual({
1118
- email: 'email@test.fr',
1119
- verifiedEmail: true,
1120
- })
1121
- })
1122
-
1123
- it('should not computeObject in runOnSingleObject if there is no hooks to execute on createObject', async () => {
1124
- wabe.config.hooks = []
1125
-
1126
- await wabe.controllers.database.createObject({
1127
- className: 'User',
1128
- context,
1129
- data: { name: 'Lucas' },
1130
- select: { id: true },
1131
- })
1132
-
1133
- expect(spyGetObject).toHaveBeenCalledTimes(1)
1134
- })
1135
-
1136
- it('should not computeObjects in runOnMultipleObjects if there is no hooks to execute on createObjects', async () => {
1137
- wabe.config.hooks = []
1138
-
1139
- await wabe.controllers.database.createObjects({
1140
- className: 'User',
1141
- context,
1142
- data: [{ name: 'Lucas' }],
1143
- select: { id: true },
1144
- })
1145
-
1146
- expect(spyGetObjects).toHaveBeenCalledTimes(1)
1147
- })
1148
-
1149
- it('should not computeObject in runOnSingleObject if there is no hooks to execute on updateObject', async () => {
1150
- wabe.config.hooks = []
1151
-
1152
- const res = await wabe.controllers.database.createObject({
1153
- className: 'User',
1154
- context,
1155
- data: { name: 'Lucas' },
1156
- select: { id: true },
1157
- })
1158
-
1159
- spyGetObject.mockClear()
1160
-
1161
- await wabe.controllers.database.updateObject({
1162
- className: 'User',
1163
- context,
1164
- data: { name: 'Lucas' },
1165
- select: { id: true },
1166
- id: res?.id || '',
1167
- })
1168
-
1169
- expect(spyGetObject).toHaveBeenCalledTimes(1)
1170
- })
1171
-
1172
- it('should not computeObject in runOnMultipleObject if there is no hooks to execute on updateObjects', async () => {
1173
- wabe.config.hooks = []
1174
-
1175
- const res = await wabe.controllers.database.createObject({
1176
- className: 'User',
1177
- context,
1178
- data: { name: 'Lucas' },
1179
- select: { id: true },
1180
- })
1181
-
1182
- spyGetObjects.mockClear()
1183
-
1184
- await wabe.controllers.database.updateObjects({
1185
- className: 'User',
1186
- context,
1187
- data: { name: 'Lucas' },
1188
- select: { id: true },
1189
- where: { id: { equalTo: res?.id || '' } },
1190
- })
1191
-
1192
- // Mongo adapter call 2 times getObjects in updateObjects
1193
- expect(spyGetObjects).toHaveBeenCalledTimes(2)
1194
- })
1195
-
1196
- it('should not computeObject in runOnSingleObject if there is no hooks to execute on updateObject', async () => {
1197
- wabe.config.hooks = []
1198
-
1199
- const res = await wabe.controllers.database.createObject({
1200
- className: 'User',
1201
- context,
1202
- data: { name: 'Lucas' },
1203
- select: { id: true },
1204
- })
1205
-
1206
- spyGetObject.mockClear()
1207
-
1208
- await wabe.controllers.database.deleteObject({
1209
- className: 'User',
1210
- context,
1211
- select: { id: true },
1212
- id: res?.id || '',
1213
- })
1214
-
1215
- expect(spyGetObject).toHaveBeenCalledTimes(1)
1216
- })
1217
-
1218
- it('should not computeObject in runOnMultipleObject if there is no hooks to execute on updateObjects', async () => {
1219
- wabe.config.hooks = []
1220
-
1221
- const res = await wabe.controllers.database.createObject({
1222
- className: 'User',
1223
- context,
1224
- data: { name: 'Lucas' },
1225
- select: { id: true },
1226
- })
1227
-
1228
- spyGetObjects.mockClear()
1229
-
1230
- await wabe.controllers.database.deleteObjects({
1231
- className: 'User',
1232
- context,
1233
- select: { id: true },
1234
- where: { id: { equalTo: res?.id || '' } },
1235
- })
1236
-
1237
- expect(spyGetObjects).toHaveBeenCalledTimes(1)
1238
- })
1239
-
1240
- it('should get the good value in output of createObject after mutation on after hook', async () => {
1241
- wabe.config.hooks = [
1242
- {
1243
- className: 'User',
1244
- operationType: OperationType.AfterCreate,
1245
- callback: mockUpdateObject,
1246
- priority: 1,
1247
- },
1248
- {
1249
- className: 'Test2',
1250
- operationType: OperationType.AfterUpdate,
1251
- callback: mockAfterUpdate,
1252
- priority: 1,
1253
- },
1254
- ]
1255
- const res = await context.wabe.controllers.database.createObject({
1256
- className: 'User',
1257
- data: { name: 'Lucas', age: 20 },
1258
- context,
1259
- select: { age: true },
1260
- })
1261
-
1262
- expect(res?.age).toEqual(21)
1263
-
1264
- expect(mockUpdateObject).toHaveBeenCalledTimes(1)
1265
- })
1266
-
1267
- it('should apply afterRead hook mutations to returned object', async () => {
1268
- wabe.config.hooks = [
1269
- ...getDefaultHooks(),
1270
- {
1271
- className: 'User',
1272
- operationType: OperationType.AfterRead,
1273
- priority: 2,
1274
- callback: (hookObject) => {
1275
- // Mutate the object to ensure the returned value is affected by AfterRead
1276
- // @ts-expect-error
1277
- hookObject.object.name = 'mutated-by-after-read'
1278
- },
1279
- },
1280
- ]
1281
-
1282
- const created = await context.wabe.controllers.database.createObject({
1283
- className: 'User',
1284
- context,
1285
- data: { name: 'original-name' },
1286
- select: { id: true },
1287
- })
1288
-
1289
- const res = await context.wabe.controllers.database.getObject({
1290
- className: 'User',
1291
- context,
1292
- id: created?.id || '',
1293
- select: { id: true, name: true },
1294
- })
1295
-
1296
- expect(res?.name).toEqual('mutated-by-after-read')
1297
- })
1298
-
1299
- it('should apply afterRead hook mutations to returned objects list', async () => {
1300
- wabe.config.hooks = [
1301
- ...getDefaultHooks(),
1302
- {
1303
- className: 'User',
1304
- operationType: OperationType.AfterRead,
1305
- priority: 2,
1306
- callback: (hookObject) => {
1307
- // @ts-expect-error
1308
- hookObject.object.name = 'mutated-by-after-read-list'
1309
- },
1310
- },
1311
- ]
1312
-
1313
- await context.wabe.controllers.database.createObjects({
1314
- className: 'User',
1315
- context,
1316
- select: { id: true },
1317
- data: [{ name: 'original-name' }],
1318
- })
1319
-
1320
- const res = await context.wabe.controllers.database.getObjects({
1321
- className: 'User',
1322
- context,
1323
- select: { id: true, name: true },
1324
- })
1325
-
1326
- expect(res[0]?.name).toEqual('mutated-by-after-read-list')
1327
- })
1328
-
1329
- it('should get the good value in output of createObjects after mutation on after hook', async () => {
1330
- wabe.config.hooks = [
1331
- {
1332
- className: 'User',
1333
- operationType: OperationType.AfterCreate,
1334
- callback: mockUpdateObject,
1335
- priority: 1,
1336
- },
1337
- {
1338
- className: 'Test2',
1339
- operationType: OperationType.AfterUpdate,
1340
- callback: mockAfterUpdate,
1341
- priority: 1,
1342
- },
1343
- ]
1344
- const res = await context.wabe.controllers.database.createObjects({
1345
- className: 'User',
1346
- data: [{ name: 'Lucas', age: 20 }],
1347
- context,
1348
- select: { age: true },
1349
- })
1350
-
1351
- expect(res[0]?.age).toEqual(21)
1352
-
1353
- expect(mockUpdateObject).toHaveBeenCalledTimes(1)
1354
- })
1355
-
1356
- it('should get the good value in output of updateObjects after mutation on after hook', async () => {
1357
- wabe.config.hooks = [
1358
- {
1359
- className: 'User',
1360
- operationType: OperationType.AfterCreate,
1361
- callback: mockUpdateObject,
1362
- priority: 1,
1363
- },
1364
- {
1365
- className: 'Test2',
1366
- operationType: OperationType.AfterUpdate,
1367
- callback: mockAfterUpdate,
1368
- priority: 1,
1369
- },
1370
- ]
1371
- await context.wabe.controllers.database.createObjects({
1372
- className: 'Test2',
1373
- data: [{ name: 'test', age: 20 }],
1374
- context,
1375
- select: {},
1376
- })
1377
-
1378
- const res = await context.wabe.controllers.database.updateObjects({
1379
- className: 'Test2',
1380
- context,
1381
- select: { name: true },
1382
- where: { name: { equalTo: 'test' } },
1383
- data: { name: 20 },
1384
- })
1385
-
1386
- expect(res.length).toEqual(1)
1387
-
1388
- expect(mockAfterUpdate).toHaveBeenCalledTimes(1)
1389
- })
1390
-
1391
- it('should get the good value in output of updateObject after mutation on after hook', async () => {
1392
- wabe.config.hooks = [
1393
- {
1394
- className: 'User',
1395
- operationType: OperationType.AfterCreate,
1396
- callback: mockUpdateObject,
1397
- priority: 1,
1398
- },
1399
- {
1400
- className: 'Test2',
1401
- operationType: OperationType.AfterUpdate,
1402
- callback: mockAfterUpdate,
1403
- priority: 1,
1404
- },
1405
- ]
1406
- const res = await context.wabe.controllers.database.createObjects({
1407
- className: 'Test2',
1408
- data: [{ name: 'test', age: 20 }],
1409
- context,
1410
- select: { id: true },
1411
- })
1412
-
1413
- const res2 = await context.wabe.controllers.database.updateObject({
1414
- className: 'Test2',
1415
- context,
1416
- select: { name: true },
1417
- data: { age: 20 },
1418
- id: res[0]?.id,
1419
- })
1420
-
1421
- expect(res2?.name).toEqual('test')
1422
-
1423
- expect(mockAfterUpdate).toHaveBeenCalledTimes(1)
1424
- })
1425
-
1426
- it("should empty array if equalTo value is undefined and don't match with any object in database", async () => {
1427
- const roles = await context.wabe.controllers.database.getObjects({
1428
- className: 'Role',
1429
- context: contextWithRoot(context),
1430
- select: { id: true, name: true },
1431
- where: {
1432
- name: { equalTo: undefined },
1433
- },
1434
- })
1435
-
1436
- expect(roles).toEqual([])
1437
- })
1438
-
1439
- it('should filter objects where field exists (exists: true)', async () => {
1440
- await context.wabe.controllers.database.createObjects({
1441
- className: 'Test',
1442
- data: [
1443
- { name: 'Object with name', otherField: 'other' },
1444
- { name: 'Another object with name', otherField: 'other' },
1445
- // @ts-expect-error
1446
- { otherField: 'No name field' },
1447
- ],
1448
- context,
1449
- select: {},
1450
- })
1451
-
1452
- // Test exists: true - should return only objects with name field
1453
- const objectsWithName = await context.wabe.controllers.database.getObjects({
1454
- className: 'Test',
1455
- where: { name: { exists: true } },
1456
- context,
1457
- select: { name: true },
1458
- })
1459
-
1460
- expect(objectsWithName.length).toBe(2)
1461
- expect(objectsWithName.every((obj) => obj?.name)).toBe(true)
1462
- })
1463
-
1464
- it('should filter objects where field does not exist (exists: false)', async () => {
1465
- await context.wabe.controllers.database.createObjects({
1466
- className: 'Test',
1467
- data: [
1468
- {
1469
- name: 'Object with name',
1470
- otherField: 'other',
1471
- anotherField: 'another',
1472
- },
1473
- // @ts-expect-error
1474
- { otherField: 'No name field' },
1475
- // @ts-expect-error
1476
- { anotherField: 'Also no name' },
1477
- ],
1478
- context,
1479
- select: {},
1480
- })
1481
-
1482
- // Test exists: false - should return only objects without name field
1483
- const objectsWithoutName = await context.wabe.controllers.database.getObjects({
1484
- className: 'Test',
1485
- where: { name: { exists: false } },
1486
- context,
1487
- select: { name: true },
1488
- })
1489
-
1490
- expect(objectsWithoutName.length).toBe(2)
1491
- expect(objectsWithoutName.every((obj) => !obj?.name)).toBe(true)
1492
- })
1493
-
1494
- it('should work with exists on AND/OR conditions', async () => {
1495
- await context.wabe.controllers.database.createObjects({
1496
- className: 'Test',
1497
- data: [
1498
- { name: 'John', age: 25 },
1499
- { name: 'Jane', age: 30 },
1500
- // @ts-expect-error
1501
- { age: 35 },
1502
- // @ts-expect-error
1503
- { name: 'Bob' },
1504
- ],
1505
- context,
1506
- select: {},
1507
- })
1508
-
1509
- // Test with AND condition
1510
- const objectsWithNameAndAge = await context.wabe.controllers.database.getObjects({
1511
- className: 'Test',
1512
- // @ts-expect-error
1513
- where: {
1514
- AND: [{ name: { exists: true } }, { age: { exists: true } }],
1515
- },
1516
- context,
1517
- select: { name: true, age: true },
1518
- })
1519
-
1520
- expect(objectsWithNameAndAge.length).toBe(2)
1521
- expect(objectsWithNameAndAge.every((obj) => obj?.name && obj?.age)).toBe(true)
1522
- })
1523
- })
1524
-
1525
- const graphql = {
1526
- signUpWith: gql`
1527
- mutation signUpWith($input: SignUpWithInput!) {
1528
- signUpWith(input: $input) {
1529
- id
1530
- accessToken
1531
- refreshToken
1532
- }
1533
- }
1534
- `,
1535
- users: gql`
1536
- query users {
1537
- users {
1538
- edges {
1539
- node {
1540
- id
1541
- email
1542
- role {
1543
- id
1544
- name
1545
- }
1546
- }
1547
- }
1548
- }
1549
- }
1550
- `,
1551
- }