wabe 0.6.12 → 0.6.13

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 (147) hide show
  1. package/package.json +4 -1
  2. package/dev/index.ts +0 -215
  3. package/generated/schema.graphql +0 -1945
  4. package/generated/wabe.ts +0 -448
  5. package/src/authentication/OTP.test.ts +0 -69
  6. package/src/authentication/OTP.ts +0 -64
  7. package/src/authentication/Session.test.ts +0 -629
  8. package/src/authentication/Session.ts +0 -517
  9. package/src/authentication/cookies.ts +0 -10
  10. package/src/authentication/defaultAuthentication.ts +0 -209
  11. package/src/authentication/index.ts +0 -4
  12. package/src/authentication/interface.ts +0 -177
  13. package/src/authentication/oauth/GitHub.test.ts +0 -91
  14. package/src/authentication/oauth/GitHub.ts +0 -121
  15. package/src/authentication/oauth/Google.test.ts +0 -91
  16. package/src/authentication/oauth/Google.ts +0 -101
  17. package/src/authentication/oauth/Oauth2Client.test.ts +0 -219
  18. package/src/authentication/oauth/Oauth2Client.ts +0 -135
  19. package/src/authentication/oauth/index.ts +0 -2
  20. package/src/authentication/oauth/utils.test.ts +0 -33
  21. package/src/authentication/oauth/utils.ts +0 -27
  22. package/src/authentication/providers/EmailOTP.test.ts +0 -127
  23. package/src/authentication/providers/EmailOTP.ts +0 -95
  24. package/src/authentication/providers/EmailPassword.test.ts +0 -263
  25. package/src/authentication/providers/EmailPassword.ts +0 -138
  26. package/src/authentication/providers/EmailPasswordSRP.test.ts +0 -208
  27. package/src/authentication/providers/EmailPasswordSRP.ts +0 -191
  28. package/src/authentication/providers/GitHub.ts +0 -24
  29. package/src/authentication/providers/Google.ts +0 -24
  30. package/src/authentication/providers/OAuth.test.ts +0 -185
  31. package/src/authentication/providers/OAuth.ts +0 -106
  32. package/src/authentication/providers/PhonePassword.test.ts +0 -221
  33. package/src/authentication/providers/PhonePassword.ts +0 -136
  34. package/src/authentication/providers/QRCodeOTP.test.ts +0 -77
  35. package/src/authentication/providers/QRCodeOTP.ts +0 -69
  36. package/src/authentication/providers/index.ts +0 -6
  37. package/src/authentication/resolvers/refreshResolver.test.ts +0 -30
  38. package/src/authentication/resolvers/refreshResolver.ts +0 -19
  39. package/src/authentication/resolvers/signInWithResolver.inte.test.ts +0 -59
  40. package/src/authentication/resolvers/signInWithResolver.test.ts +0 -306
  41. package/src/authentication/resolvers/signInWithResolver.ts +0 -106
  42. package/src/authentication/resolvers/signOutResolver.test.ts +0 -38
  43. package/src/authentication/resolvers/signOutResolver.ts +0 -18
  44. package/src/authentication/resolvers/signUpWithResolver.test.ts +0 -180
  45. package/src/authentication/resolvers/signUpWithResolver.ts +0 -68
  46. package/src/authentication/resolvers/verifyChallenge.test.ts +0 -230
  47. package/src/authentication/resolvers/verifyChallenge.ts +0 -78
  48. package/src/authentication/roles.test.ts +0 -49
  49. package/src/authentication/roles.ts +0 -40
  50. package/src/authentication/security.ts +0 -278
  51. package/src/authentication/utils.test.ts +0 -97
  52. package/src/authentication/utils.ts +0 -39
  53. package/src/cache/InMemoryCache.test.ts +0 -62
  54. package/src/cache/InMemoryCache.ts +0 -45
  55. package/src/cron/index.test.ts +0 -17
  56. package/src/cron/index.ts +0 -43
  57. package/src/database/DatabaseController.test.ts +0 -613
  58. package/src/database/DatabaseController.ts +0 -1415
  59. package/src/database/index.test.ts +0 -1551
  60. package/src/database/index.ts +0 -9
  61. package/src/database/interface.ts +0 -308
  62. package/src/email/DevAdapter.ts +0 -7
  63. package/src/email/EmailController.test.ts +0 -29
  64. package/src/email/EmailController.ts +0 -13
  65. package/src/email/index.ts +0 -2
  66. package/src/email/interface.ts +0 -36
  67. package/src/email/templates/sendOtpCode.ts +0 -120
  68. package/src/file/FileController.ts +0 -28
  69. package/src/file/FileDevAdapter.ts +0 -51
  70. package/src/file/hookDeleteFile.ts +0 -25
  71. package/src/file/hookReadFile.ts +0 -66
  72. package/src/file/hookUploadFile.ts +0 -52
  73. package/src/file/index.test.ts +0 -1031
  74. package/src/file/index.ts +0 -2
  75. package/src/file/interface.ts +0 -63
  76. package/src/file/security.ts +0 -156
  77. package/src/graphql/GraphQLSchema.test.ts +0 -5099
  78. package/src/graphql/GraphQLSchema.ts +0 -886
  79. package/src/graphql/index.ts +0 -2
  80. package/src/graphql/parseGraphqlSchema.ts +0 -85
  81. package/src/graphql/parser.test.ts +0 -203
  82. package/src/graphql/parser.ts +0 -707
  83. package/src/graphql/pointerAndRelationFunction.ts +0 -191
  84. package/src/graphql/resolvers.ts +0 -464
  85. package/src/graphql/tests/aggregation.test.ts +0 -1115
  86. package/src/graphql/tests/e2e.test.ts +0 -590
  87. package/src/graphql/tests/scalars.test.ts +0 -250
  88. package/src/graphql/types.ts +0 -227
  89. package/src/hooks/HookObject.test.ts +0 -122
  90. package/src/hooks/HookObject.ts +0 -165
  91. package/src/hooks/authentication.ts +0 -67
  92. package/src/hooks/createUser.test.ts +0 -77
  93. package/src/hooks/createUser.ts +0 -10
  94. package/src/hooks/defaultFields.test.ts +0 -176
  95. package/src/hooks/defaultFields.ts +0 -32
  96. package/src/hooks/deleteSession.test.ts +0 -181
  97. package/src/hooks/deleteSession.ts +0 -20
  98. package/src/hooks/hashFieldHook.test.ts +0 -152
  99. package/src/hooks/hashFieldHook.ts +0 -89
  100. package/src/hooks/index.test.ts +0 -258
  101. package/src/hooks/index.ts +0 -420
  102. package/src/hooks/permissions.test.ts +0 -412
  103. package/src/hooks/permissions.ts +0 -93
  104. package/src/hooks/protected.test.ts +0 -551
  105. package/src/hooks/protected.ts +0 -74
  106. package/src/hooks/searchableFields.test.ts +0 -147
  107. package/src/hooks/searchableFields.ts +0 -86
  108. package/src/hooks/session.test.ts +0 -134
  109. package/src/hooks/session.ts +0 -76
  110. package/src/hooks/setEmail.test.ts +0 -216
  111. package/src/hooks/setEmail.ts +0 -33
  112. package/src/hooks/setupAcl.test.ts +0 -618
  113. package/src/hooks/setupAcl.ts +0 -25
  114. package/src/hooks/virtualFields.test.ts +0 -228
  115. package/src/hooks/virtualFields.ts +0 -48
  116. package/src/index.ts +0 -9
  117. package/src/schema/Schema.test.ts +0 -482
  118. package/src/schema/Schema.ts +0 -839
  119. package/src/schema/defaultResolvers.ts +0 -93
  120. package/src/schema/index.ts +0 -1
  121. package/src/schema/resolvers/meResolver.test.ts +0 -62
  122. package/src/schema/resolvers/meResolver.ts +0 -10
  123. package/src/schema/resolvers/resetPassword.test.ts +0 -341
  124. package/src/schema/resolvers/resetPassword.ts +0 -63
  125. package/src/schema/resolvers/sendEmail.test.ts +0 -118
  126. package/src/schema/resolvers/sendEmail.ts +0 -21
  127. package/src/schema/resolvers/sendOtpCode.test.ts +0 -141
  128. package/src/schema/resolvers/sendOtpCode.ts +0 -52
  129. package/src/security.test.ts +0 -4136
  130. package/src/server/defaultSessionHandler.test.ts +0 -62
  131. package/src/server/defaultSessionHandler.ts +0 -104
  132. package/src/server/generateCodegen.ts +0 -433
  133. package/src/server/index.test.ts +0 -843
  134. package/src/server/index.ts +0 -336
  135. package/src/server/interface.ts +0 -11
  136. package/src/server/routes/authHandler.ts +0 -171
  137. package/src/server/routes/index.ts +0 -48
  138. package/src/utils/crypto.test.ts +0 -41
  139. package/src/utils/crypto.ts +0 -105
  140. package/src/utils/database.ts +0 -8
  141. package/src/utils/export.ts +0 -12
  142. package/src/utils/helper.ts +0 -204
  143. package/src/utils/index.test.ts +0 -11
  144. package/src/utils/index.ts +0 -196
  145. package/src/utils/preload.ts +0 -8
  146. package/src/utils/testHelper.ts +0 -124
  147. package/tsconfig.json +0 -32
@@ -1,5099 +0,0 @@
1
- import { beforeAll, describe, expect, it } from 'bun:test'
2
- import getPort from 'get-port'
3
- import { GraphQLObjectType, GraphQLSchema } from 'graphql'
4
- import { gql } from 'graphql-request'
5
- import { v4 as uuid } from 'uuid'
6
- import { Schema, type SchemaInterface } from '../schema'
7
- import { Wabe } from '../server'
8
- import { type DevWabeTypes, getAnonymousClient, getGraphqlClient } from '../utils/helper'
9
- import { GraphQLSchema as WabeGraphQLSchema } from './GraphQLSchema'
10
- import { getTypeFromGraphQLSchema } from './parseGraphqlSchema'
11
- import { getDatabaseAdapter } from '../utils/testHelper'
12
-
13
- const createWabe = async (schema: SchemaInterface<DevWabeTypes>) => {
14
- const databaseId = uuid()
15
-
16
- const port = await getPort()
17
-
18
- const wabe = new Wabe({
19
- isProduction: false,
20
- port,
21
- schema,
22
- rootKey: 'dev',
23
- database: {
24
- // @ts-expect-error
25
- adapter: await getDatabaseAdapter(databaseId),
26
- },
27
- security: {
28
- disableCSRFProtection: true,
29
- },
30
- })
31
-
32
- await wabe.start()
33
-
34
- const client = getGraphqlClient(port)
35
-
36
- return { client, wabe, port }
37
- }
38
-
39
- describe('GraphqlSchema', () => {
40
- let schema: GraphQLSchema
41
-
42
- beforeAll(() => {
43
- const wabeSchema = new Schema({
44
- schema: {
45
- classes: [
46
- {
47
- name: 'TestClass2',
48
- fields: {
49
- field1: {
50
- type: 'Object',
51
- required: true,
52
- object: {
53
- name: 'TestObject',
54
- fields: {
55
- testSubObject: {
56
- type: 'Array',
57
- typeValue: 'Object',
58
- required: true,
59
- object: {
60
- name: 'FieldsObject',
61
- required: true,
62
- fields: {
63
- name: {
64
- type: 'String',
65
- required: true,
66
- },
67
- },
68
- },
69
- },
70
- },
71
- },
72
- },
73
- },
74
- },
75
- {
76
- name: 'TestClass',
77
- fields: { field1: { type: 'String' } },
78
- },
79
- {
80
- name: 'SecondClass',
81
- fields: {
82
- pointer: { type: 'Pointer', class: 'TestClass' },
83
- },
84
- },
85
- {
86
- name: 'ThirdClass',
87
- fields: {
88
- pointer: {
89
- type: 'Pointer',
90
- class: 'FourthClass',
91
- },
92
- },
93
- },
94
- {
95
- name: 'FourthClass',
96
- fields: {
97
- pointer: {
98
- type: 'Pointer',
99
- class: 'ThirdClass',
100
- },
101
- },
102
- },
103
- {
104
- name: 'FifthClass',
105
- fields: {
106
- relation: {
107
- type: 'Relation',
108
- class: 'SixthClass',
109
- },
110
- },
111
- },
112
- {
113
- name: 'SixthClass',
114
- fields: {
115
- field6: { type: 'String' },
116
- },
117
- },
118
- {
119
- name: 'TestClassRequired',
120
- fields: {
121
- field7: {
122
- type: 'String',
123
- required: true,
124
- },
125
- field8: {
126
- type: 'Array',
127
- required: true,
128
- requiredValue: true,
129
- typeValue: 'Int',
130
- },
131
- field9: {
132
- type: 'Array',
133
- required: true,
134
- typeValue: 'Object',
135
- object: {
136
- name: 'TestObjectArray',
137
- fields: {
138
- field10: {
139
- type: 'Int',
140
- required: true,
141
- },
142
- },
143
- },
144
- },
145
- },
146
- },
147
- {
148
- name: 'TestClassFile',
149
- fields: {
150
- file: {
151
- type: 'File',
152
- required: true,
153
- },
154
- },
155
- },
156
- ],
157
- resolvers: {
158
- mutations: {
159
- customMutation: {
160
- type: 'Boolean',
161
- resolve: () => true,
162
- },
163
- mutationWithCustomTypes: {
164
- type: 'Array',
165
- typeValue: 'Object',
166
- required: true,
167
- typeValueRequired: true,
168
- outputObject: {
169
- name: 'TestMutation',
170
- fields: {
171
- name: {
172
- type: 'String',
173
- },
174
- },
175
- },
176
- resolve: () => {
177
- return [{ name: 'test' }]
178
- },
179
- },
180
- },
181
- queries: {
182
- customQuery: {
183
- type: 'Boolean',
184
- resolve: () => true,
185
- },
186
- queryWithCustomTypes: {
187
- type: 'Array',
188
- typeValue: 'Object',
189
- required: true,
190
- typeValueRequired: true,
191
- outputObject: {
192
- name: 'TestQuery',
193
- fields: {
194
- name: {
195
- type: 'String',
196
- },
197
- },
198
- },
199
- resolve: () => {
200
- return [{ name: 'test' }]
201
- },
202
- },
203
- },
204
- },
205
- },
206
- } as any)
207
-
208
- const graphqlSchema = new WabeGraphQLSchema(wabeSchema)
209
-
210
- const types = graphqlSchema.createSchema()
211
-
212
- schema = new GraphQLSchema({
213
- query: new GraphQLObjectType({
214
- name: 'Query',
215
- fields: types.queries,
216
- }),
217
- mutation: new GraphQLObjectType({
218
- name: 'Mutation',
219
- fields: types.mutations,
220
- }),
221
- types: [...types.scalars, ...types.enums, ...types.objects],
222
- })
223
- })
224
-
225
- it('should work with fragments in all operations (query, create, update, delete) and nested fragments', async () => {
226
- const { wabe } = await createWabe({
227
- classes: [
228
- {
229
- name: 'TestClass',
230
- fields: {
231
- field: {
232
- type: 'String',
233
- },
234
- field1: {
235
- type: 'String',
236
- },
237
- field2: {
238
- type: 'String',
239
- },
240
- },
241
- },
242
- ],
243
- })
244
-
245
- const rootClient = getGraphqlClient(wabe.config.port)
246
-
247
- // Define fragments for all operations
248
- const fragments = `
249
- fragment BasicFields on TestClass {
250
- id
251
- field
252
- }
253
-
254
- fragment ExtendedFields on TestClass {
255
- ...BasicFields
256
- field1
257
- field2
258
- }
259
- `
260
-
261
- // Test CREATE operation with fragments
262
- const createResult = await rootClient.request<any>(gql`
263
- ${fragments}
264
- mutation createTestClass {
265
- createTestClass(
266
- input: {
267
- fields: {
268
- field: "testField"
269
- field1: "value1"
270
- field2: "value2"
271
- }
272
- }
273
- ) {
274
- testClass {
275
- ...ExtendedFields
276
- }
277
- }
278
- }
279
- `)
280
-
281
- expect(createResult.createTestClass.testClass.field).toBe('testField')
282
- expect(createResult.createTestClass.testClass.field1).toBe('value1')
283
- expect(createResult.createTestClass.testClass.field2).toBe('value2')
284
- expect(createResult.createTestClass.testClass.id).toBeDefined()
285
-
286
- const objectId = createResult.createTestClass.testClass.id
287
-
288
- // Test QUERY operation with fragments (simple fragment)
289
- const queryResult = await rootClient.request<any>(gql`
290
- fragment Test on TestClass {
291
- id
292
- field
293
- }
294
-
295
- query testClasses {
296
- testClasses {
297
- edges {
298
- node {
299
- ...Test
300
- }
301
- }
302
- }
303
- }
304
- `)
305
-
306
- expect(queryResult.testClasses.edges[0].node.field).toBe('testField')
307
- expect(queryResult.testClasses.edges[0].node.id).toBe(objectId)
308
-
309
- // Test UPDATE operation with fragments
310
- const updateResult = await rootClient.request<any>(gql`
311
- ${fragments}
312
- mutation updateTestClass {
313
- updateTestClass(
314
- input: {
315
- id: "${objectId}"
316
- fields: { field: "updatedField", field1: "updated1", field2: "updated2" }
317
- }
318
- ) {
319
- testClass {
320
- ...ExtendedFields
321
- }
322
- }
323
- }
324
- `)
325
-
326
- expect(updateResult.updateTestClass.testClass.field).toBe('updatedField')
327
- expect(updateResult.updateTestClass.testClass.field1).toBe('updated1')
328
- expect(updateResult.updateTestClass.testClass.field2).toBe('updated2')
329
- expect(updateResult.updateTestClass.testClass.id).toBe(objectId)
330
-
331
- // Test DELETE operation with fragments
332
- const deleteResult = await rootClient.request<any>(gql`
333
- ${fragments}
334
- mutation deleteTestClass {
335
- deleteTestClass(
336
- input: { id: "${objectId}" }
337
- ) {
338
- testClass {
339
- ...ExtendedFields
340
- }
341
- }
342
- }
343
- `)
344
-
345
- expect(deleteResult.deleteTestClass.testClass.field).toBe('updatedField')
346
- expect(deleteResult.deleteTestClass.testClass.field1).toBe('updated1')
347
- expect(deleteResult.deleteTestClass.testClass.field2).toBe('updated2')
348
- expect(deleteResult.deleteTestClass.testClass.id).toBe(objectId)
349
-
350
- await wabe.close()
351
- })
352
-
353
- it('should work with fragments in all operations (query, create, update, delete) and nested fragments', async () => {
354
- const { wabe } = await createWabe({
355
- classes: [
356
- {
357
- name: 'TestClass',
358
- fields: {
359
- field1: {
360
- type: 'String',
361
- },
362
- field2: {
363
- type: 'String',
364
- },
365
- field3: {
366
- type: 'String',
367
- },
368
- field4: {
369
- type: 'String',
370
- },
371
- },
372
- },
373
- ],
374
- })
375
-
376
- const rootClient = getGraphqlClient(wabe.config.port)
377
-
378
- // Define fragments for all operations
379
- const fragments = `
380
- fragment BasicFields on TestClass {
381
- id
382
- field1
383
- }
384
-
385
- fragment ExtendedFields on TestClass {
386
- ...BasicFields
387
- field2
388
- }
389
-
390
- fragment FullFields on TestClass {
391
- ...ExtendedFields
392
- field3
393
- }
394
-
395
- fragment CompleteFields on TestClass {
396
- ...FullFields
397
- field4
398
- }
399
- `
400
-
401
- // Test CREATE operation with fragments of fragments
402
- const createResult = await rootClient.request<any>(gql`
403
- ${fragments}
404
- mutation createTestClass {
405
- createTestClass(
406
- input: {
407
- fields: {
408
- field1: "created1"
409
- field2: "created2"
410
- field3: "created3"
411
- field4: "created4"
412
- }
413
- }
414
- ) {
415
- testClass {
416
- ...CompleteFields
417
- }
418
- }
419
- }
420
- `)
421
-
422
- expect(createResult.createTestClass.testClass.field1).toBe('created1')
423
- expect(createResult.createTestClass.testClass.field2).toBe('created2')
424
- expect(createResult.createTestClass.testClass.field3).toBe('created3')
425
- expect(createResult.createTestClass.testClass.field4).toBe('created4')
426
- expect(createResult.createTestClass.testClass.id).toBeDefined()
427
-
428
- const objectId = createResult.createTestClass.testClass.id
429
-
430
- // Test QUERY operation with fragments of fragments
431
- const queryResult = await rootClient.request<any>(gql`
432
- ${fragments}
433
- query testClass {
434
- testClass(id: "${objectId}") {
435
- ...CompleteFields
436
- }
437
- }
438
- `)
439
-
440
- expect(queryResult.testClass.field1).toBe('created1')
441
- expect(queryResult.testClass.field2).toBe('created2')
442
- expect(queryResult.testClass.field3).toBe('created3')
443
- expect(queryResult.testClass.field4).toBe('created4')
444
- expect(queryResult.testClass.id).toBe(objectId)
445
-
446
- // Test UPDATE operation with fragments of fragments
447
- const updateResult = await rootClient.request<any>(gql`
448
- ${fragments}
449
- mutation updateTestClass {
450
- updateTestClass(
451
- input: {
452
- id: "${objectId}"
453
- fields: { field1: "updated1", field2: "updated2", field3: "updated3", field4: "updated4" }
454
- }
455
- ) {
456
- testClass {
457
- ...CompleteFields
458
- }
459
- }
460
- }
461
- `)
462
-
463
- expect(updateResult.updateTestClass.testClass.field1).toBe('updated1')
464
- expect(updateResult.updateTestClass.testClass.field2).toBe('updated2')
465
- expect(updateResult.updateTestClass.testClass.field3).toBe('updated3')
466
- expect(updateResult.updateTestClass.testClass.field4).toBe('updated4')
467
- expect(updateResult.updateTestClass.testClass.id).toBe(objectId)
468
-
469
- // Test DELETE operation with fragments of fragments
470
- const deleteResult = await rootClient.request<any>(gql`
471
- ${fragments}
472
- mutation deleteTestClass {
473
- deleteTestClass(input: { id: "${objectId}" }) {
474
- testClass {
475
- ...CompleteFields
476
- }
477
- }
478
- }
479
- `)
480
-
481
- expect(deleteResult.deleteTestClass.testClass.field1).toBe('updated1')
482
- expect(deleteResult.deleteTestClass.testClass.field2).toBe('updated2')
483
- expect(deleteResult.deleteTestClass.testClass.field3).toBe('updated3')
484
- expect(deleteResult.deleteTestClass.testClass.field4).toBe('updated4')
485
- expect(deleteResult.deleteTestClass.testClass.id).toBe(objectId)
486
-
487
- await wabe.close()
488
- })
489
-
490
- it('should work with fragments across related classes in all operations', async () => {
491
- const { wabe } = await createWabe({
492
- classes: [
493
- {
494
- name: 'PremierClasse',
495
- fields: {
496
- field1: {
497
- type: 'String',
498
- },
499
- },
500
- },
501
- {
502
- name: 'DeuxiemeClasse',
503
- fields: {
504
- field2: {
505
- type: 'String',
506
- },
507
- premierClasses: {
508
- type: 'Relation',
509
- // @ts-expect-error
510
- class: 'PremierClasse',
511
- },
512
- },
513
- },
514
- ],
515
- })
516
-
517
- const rootClient = getGraphqlClient(wabe.config.port)
518
-
519
- // Define fragments for related classes
520
- const fragments = `
521
- fragment TestPremierClasse on PremierClasse {
522
- id
523
- field1
524
- }
525
-
526
- fragment TestDeuxiemeClasse on DeuxiemeClasse {
527
- id
528
- field2
529
- premierClasses {
530
- edges {
531
- node {
532
- ...TestPremierClasse
533
- }
534
- }
535
- }
536
- }
537
- `
538
-
539
- // Create a PremierClasse object first
540
- const premierClasseResult = await rootClient.request<any>(gql`
541
- mutation createPremierClasse {
542
- createPremierClasse(input: { fields: { field1: "premierValue" } }) {
543
- premierClasse {
544
- id
545
- field1
546
- }
547
- }
548
- }
549
- `)
550
-
551
- const premierClasseId = premierClasseResult.createPremierClasse.premierClasse.id
552
-
553
- // Test CREATE operation with fragments across related classes
554
- const createResult = await rootClient.request<any>(gql`
555
- ${fragments}
556
- mutation createDeuxiemeClasse {
557
- createDeuxiemeClasse(
558
- input: {
559
- fields: {
560
- field2: "deuxiemeValue"
561
- premierClasses: {
562
- createAndAdd: [{ field1: "nestedPremierValue" }]
563
- }
564
- }
565
- }
566
- ) {
567
- deuxiemeClasse {
568
- ...TestDeuxiemeClasse
569
- }
570
- }
571
- }
572
- `)
573
-
574
- expect(createResult.createDeuxiemeClasse.deuxiemeClasse.field2).toBe('deuxiemeValue')
575
- expect(createResult.createDeuxiemeClasse.deuxiemeClasse.id).toBeDefined()
576
- expect(createResult.createDeuxiemeClasse.deuxiemeClasse.premierClasses.edges.length).toBe(1)
577
- expect(
578
- createResult.createDeuxiemeClasse.deuxiemeClasse.premierClasses.edges[0].node.field1,
579
- ).toBe('nestedPremierValue')
580
- expect(
581
- createResult.createDeuxiemeClasse.deuxiemeClasse.premierClasses.edges[0].node.id,
582
- ).toBeDefined()
583
-
584
- const deuxiemeClasseId = createResult.createDeuxiemeClasse.deuxiemeClasse.id
585
-
586
- // Test QUERY operation with fragments across related classes
587
- const queryResult = await rootClient.request<any>(gql`
588
- ${fragments}
589
- query deuxiemeClass {
590
- deuxiemeClasse(id: "${deuxiemeClasseId}") {
591
- ...TestDeuxiemeClasse
592
- }
593
- }
594
- `)
595
-
596
- expect(queryResult.deuxiemeClasse.field2).toBe('deuxiemeValue')
597
- expect(queryResult.deuxiemeClasse.id).toBe(deuxiemeClasseId)
598
- expect(queryResult.deuxiemeClasse.premierClasses.edges.length).toBe(1)
599
- expect(queryResult.deuxiemeClasse.premierClasses.edges[0].node.field1).toBe(
600
- 'nestedPremierValue',
601
- )
602
-
603
- // Test UPDATE operation with fragments across related classes
604
- const updateResult = await rootClient.request<any>(gql`
605
- ${fragments}
606
- mutation updateDeuxiemeClasse {
607
- updateDeuxiemeClasse(
608
- input: {
609
- id: "${deuxiemeClasseId}"
610
- fields: {
611
- field2: "updatedDeuxiemeValue"
612
- premierClasses: {
613
- add: ["${premierClasseId}"]
614
- }
615
- }
616
- }
617
- ) {
618
- deuxiemeClasse {
619
- ...TestDeuxiemeClasse
620
- }
621
- }
622
- }
623
- `)
624
-
625
- expect(updateResult.updateDeuxiemeClasse.deuxiemeClasse.field2).toBe('updatedDeuxiemeValue')
626
- expect(updateResult.updateDeuxiemeClasse.deuxiemeClasse.id).toBe(deuxiemeClasseId)
627
- expect(updateResult.updateDeuxiemeClasse.deuxiemeClasse.premierClasses.edges.length).toBe(2)
628
-
629
- // Test DELETE operation with fragments across related classes
630
- const deleteResult = await rootClient.request<any>(gql`
631
- ${fragments}
632
- mutation deleteDeuxiemeClasse {
633
- deleteDeuxiemeClasse(input: { id: "${deuxiemeClasseId}" }) {
634
- deuxiemeClasse {
635
- ...TestDeuxiemeClasse
636
- }
637
- }
638
- }
639
- `)
640
-
641
- expect(deleteResult.deleteDeuxiemeClasse.deuxiemeClasse.field2).toBe('updatedDeuxiemeValue')
642
- expect(deleteResult.deleteDeuxiemeClasse.deuxiemeClasse.id).toBe(deuxiemeClasseId)
643
- expect(deleteResult.deleteDeuxiemeClasse.deuxiemeClasse.premierClasses.edges.length).toBe(2)
644
-
645
- await wabe.close()
646
- })
647
-
648
- it('should be able to only get ok output on query / mutation that returns connection object', async () => {
649
- const { wabe, client } = await createWabe({
650
- classes: [
651
- {
652
- name: 'TestClass',
653
- fields: {
654
- field1: {
655
- type: 'String',
656
- },
657
- },
658
- permissions: {
659
- read: {
660
- authorizedRoles: [],
661
- requireAuthentication: true,
662
- },
663
- },
664
- },
665
- ],
666
- })
667
-
668
- await client.request(gql`
669
- mutation deleteTestClasses {
670
- deleteTestClasses(input: { where: { field1: { equalTo: "field1" } } }) {
671
- ok
672
- }
673
- }
674
- `)
675
-
676
- await client.request(gql`
677
- query testsClasses {
678
- testClasses {
679
- ok
680
- }
681
- }
682
- `)
683
-
684
- await wabe.close()
685
- })
686
-
687
- it('should set correctly the where input on array field', async () => {
688
- const { wabe } = await createWabe({
689
- classes: [
690
- {
691
- name: 'TestClassOnly',
692
- fields: {
693
- field1: {
694
- type: 'Object',
695
- object: {
696
- name: 'TestObject',
697
- required: true,
698
- fields: {
699
- field1: {
700
- type: 'Array',
701
- typeValue: 'String',
702
- required: true,
703
- requiredValue: true,
704
- },
705
- },
706
- },
707
- },
708
- },
709
- },
710
- ],
711
- })
712
-
713
- expect(
714
- getTypeFromGraphQLSchema({
715
- schema: wabe.config.graphqlSchema || ({} as any),
716
- type: 'Type',
717
- name: 'TestClassOnlyTestObjectWhereInput',
718
- }).input.field1,
719
- ).toEqual('ArrayWhereInput')
720
-
721
- await wabe.close()
722
- })
723
-
724
- it('should set correctly the where input on object field', async () => {
725
- const { wabe } = await createWabe({
726
- classes: [
727
- {
728
- name: 'TestClassOnly',
729
- fields: {
730
- field1: {
731
- type: 'Object',
732
- object: {
733
- name: 'TestObject',
734
- required: true,
735
- fields: {
736
- field1: {
737
- type: 'Object',
738
- object: {
739
- name: 'TestTata',
740
- fields: {
741
- field2: {
742
- type: 'String',
743
- },
744
- },
745
- },
746
- },
747
- },
748
- },
749
- },
750
- },
751
- },
752
- ],
753
- })
754
-
755
- expect(
756
- getTypeFromGraphQLSchema({
757
- schema: wabe.config.graphqlSchema || ({} as any),
758
- type: 'Type',
759
- name: 'TestClassOnlyTestObjectWhereInput',
760
- }).input.field1,
761
- ).toEqual('TestClassOnlyTestObjectField1WhereInput')
762
-
763
- expect(
764
- getTypeFromGraphQLSchema({
765
- schema: wabe.config.graphqlSchema || ({} as any),
766
- type: 'Type',
767
- name: 'TestClassOnlyTestObjectField1WhereInput',
768
- }).input.field2,
769
- ).toEqual('StringWhereInput')
770
-
771
- await wabe.close()
772
- })
773
-
774
- it('should request totalCount on relation', async () => {
775
- const { wabe } = await createWabe({
776
- classes: [
777
- {
778
- name: 'TestClass1',
779
- fields: {
780
- field1: {
781
- type: 'Relation',
782
- // @ts-expect-error
783
- class: 'TestClass2',
784
- },
785
- },
786
- },
787
- {
788
- name: 'TestClass2',
789
- fields: {
790
- field2: {
791
- type: 'String',
792
- },
793
- },
794
- },
795
- ],
796
- })
797
-
798
- const rootClient = getGraphqlClient(wabe.config.port)
799
-
800
- const result1 = await rootClient.request<any>(gql`
801
- mutation createTestClass1 {
802
- createTestClass1(input: { fields: { field1: { createAndAdd: [{ field2: "field2" }] } } }) {
803
- testClass1 {
804
- id
805
- }
806
- }
807
- }
808
- `)
809
-
810
- const result2 = await rootClient.request<any>(gql`
811
- query testClass1 {
812
- testClass1(id: "${result1.createTestClass1.testClass1.id}") {
813
- field1 {
814
- totalCount
815
- }
816
- }
817
- }
818
- `)
819
-
820
- expect(result2.testClass1.field1.totalCount).toEqual(1)
821
-
822
- await wabe.close()
823
- })
824
-
825
- it('should respect connection arguments on relation object query', async () => {
826
- const { wabe } = await createWabe({
827
- classes: [
828
- {
829
- name: 'TestClass1',
830
- fields: {
831
- field1: {
832
- type: 'Relation',
833
- // @ts-expect-error
834
- class: 'TestClass2',
835
- },
836
- },
837
- },
838
- {
839
- name: 'TestClass2',
840
- fields: {
841
- field2: {
842
- type: 'String',
843
- },
844
- age: {
845
- type: 'Int',
846
- },
847
- },
848
- },
849
- ],
850
- })
851
-
852
- const rootClient = getGraphqlClient(wabe.config.port)
853
-
854
- const result1 = await rootClient.request<any>(gql`
855
- mutation createTestClass1 {
856
- createTestClass1(
857
- input: {
858
- fields: {
859
- field1: {
860
- createAndAdd: [
861
- { field2: "field2a", age: 10 }
862
- { field2: "field2b", age: 20 }
863
- { field2: "field2c", age: 30 }
864
- ]
865
- }
866
- }
867
- }
868
- ) {
869
- testClass1 {
870
- id
871
- }
872
- }
873
- }
874
- `)
875
-
876
- // limit with first
877
- const resultFirst = await rootClient.request<any>(gql`
878
- query testClass1 {
879
- testClass1(id: "${result1.createTestClass1.testClass1.id}") {
880
- field1(first: 2) {
881
- totalCount
882
- edges {
883
- node {
884
- field2
885
- }
886
- }
887
- }
888
- }
889
- }
890
- `)
891
-
892
- expect(resultFirst.testClass1.field1.edges).toHaveLength(2)
893
- expect(resultFirst.testClass1.field1.totalCount).toEqual(3) // 3 in DB
894
-
895
- // skip with offset
896
- const resultOffset = await rootClient.request<any>(gql`
897
- query testClass1 {
898
- testClass1(id: "${result1.createTestClass1.testClass1.id}") {
899
- field1(offset: 2) {
900
- edges {
901
- node {
902
- field2
903
- }
904
- }
905
- }
906
- }
907
- }
908
- `)
909
-
910
- expect(resultOffset.testClass1.field1.edges).toHaveLength(1)
911
-
912
- // order
913
- const resultOrder = await rootClient.request<any>(gql`
914
- query testClass1 {
915
- testClass1(id: "${result1.createTestClass1.testClass1.id}") {
916
- field1(order: [age_DESC]) {
917
- edges {
918
- node {
919
- age
920
- }
921
- }
922
- }
923
- }
924
- }
925
- `)
926
-
927
- expect(resultOrder.testClass1.field1.edges[0].node.age).toEqual(30)
928
- expect(resultOrder.testClass1.field1.edges[1].node.age).toEqual(20)
929
- expect(resultOrder.testClass1.field1.edges[2].node.age).toEqual(10)
930
-
931
- // filter with where
932
- const resultWhere = await rootClient.request<any>(gql`
933
- query testClass1 {
934
- testClass1(id: "${result1.createTestClass1.testClass1.id}") {
935
- field1(where: { age: { greaterThan: 15 } }) {
936
- totalCount
937
- edges {
938
- node {
939
- age
940
- }
941
- }
942
- }
943
- }
944
- }
945
- `)
946
-
947
- expect(resultWhere.testClass1.field1.edges).toHaveLength(2)
948
- expect(resultWhere.testClass1.field1.totalCount).toEqual(2)
949
-
950
- await wabe.close()
951
- })
952
-
953
- it('should respect connection arguments on relation object query (multiple objects)', async () => {
954
- const { wabe } = await createWabe({
955
- classes: [
956
- {
957
- name: 'TestClass1',
958
- fields: {
959
- name: {
960
- type: 'String',
961
- },
962
- field1: {
963
- type: 'Relation',
964
- // @ts-expect-error
965
- class: 'TestClass2',
966
- },
967
- },
968
- },
969
- {
970
- name: 'TestClass2',
971
- fields: {
972
- field2: {
973
- type: 'String',
974
- },
975
- age: {
976
- type: 'Int',
977
- },
978
- },
979
- },
980
- ],
981
- })
982
-
983
- const rootClient = getGraphqlClient(wabe.config.port)
984
-
985
- await rootClient.request<any>(gql`
986
- mutation createTestClass1 {
987
- createTestClass1(
988
- input: {
989
- fields: {
990
- name: "Object1"
991
- field1: {
992
- createAndAdd: [
993
- { field2: "field2a", age: 10 }
994
- { field2: "field2b", age: 20 }
995
- { field2: "field2c", age: 30 }
996
- ]
997
- }
998
- }
999
- }
1000
- ) {
1001
- testClass1 {
1002
- id
1003
- }
1004
- }
1005
- }
1006
- `)
1007
-
1008
- await rootClient.request<any>(gql`
1009
- mutation createTestClass1 {
1010
- createTestClass1(
1011
- input: {
1012
- fields: {
1013
- name: "Object2"
1014
- field1: { createAndAdd: [{ field2: "field2x", age: 40 }, { field2: "field2y", age: 50 }] }
1015
- }
1016
- }
1017
- ) {
1018
- testClass1 {
1019
- id
1020
- }
1021
- }
1022
- }
1023
- `)
1024
-
1025
- // limit with first, offset, where, and order nested in multiple Query
1026
- const resultMultipleFirst = await rootClient.request<any>(gql`
1027
- query testClasses1 {
1028
- testClass1s(order: [name_ASC]) {
1029
- edges {
1030
- node {
1031
- name
1032
- field1(first: 2, offset: 1, order: [age_ASC], where: { age: { greaterThan: 15 } }) {
1033
- totalCount
1034
- edges {
1035
- node {
1036
- age
1037
- }
1038
- }
1039
- }
1040
- }
1041
- }
1042
- }
1043
- }
1044
- `)
1045
-
1046
- expect(resultMultipleFirst.testClass1s.edges[0].node.name).toBe('Object1')
1047
- expect(resultMultipleFirst.testClass1s.edges[0].node.field1.totalCount).toEqual(2) // Total matching over 15: 20 and 30
1048
- expect(resultMultipleFirst.testClass1s.edges[0].node.field1.edges).toHaveLength(1) // Due to first: 2 and offset: 1 we get 1 element (the age 30)
1049
- expect(resultMultipleFirst.testClass1s.edges[0].node.field1.edges[0].node.age).toEqual(30) // Resulting set after offset is age 30
1050
-
1051
- expect(resultMultipleFirst.testClass1s.edges[1].node.name).toBe('Object2')
1052
- expect(resultMultipleFirst.testClass1s.edges[1].node.field1.totalCount).toEqual(2) // Total matching over 15: 40 and 50
1053
- expect(resultMultipleFirst.testClass1s.edges[1].node.field1.edges).toHaveLength(1) // Due to first: 2 and offset: 1 we get 1 element (age 50)
1054
- expect(resultMultipleFirst.testClass1s.edges[1].node.field1.edges[0].node.age).toEqual(50) // Resulting set after offset is age 50
1055
-
1056
- await wabe.close()
1057
- })
1058
-
1059
- it('should request relation object on single object query', async () => {
1060
- const { wabe } = await createWabe({
1061
- classes: [
1062
- {
1063
- name: 'TestClass1',
1064
- fields: {
1065
- field1: {
1066
- type: 'Relation',
1067
- // @ts-expect-error
1068
- class: 'TestClass2',
1069
- },
1070
- },
1071
- },
1072
- {
1073
- name: 'TestClass2',
1074
- fields: {
1075
- field2: {
1076
- type: 'String',
1077
- },
1078
- },
1079
- },
1080
- ],
1081
- })
1082
-
1083
- const rootClient = getGraphqlClient(wabe.config.port)
1084
-
1085
- const result1 = await rootClient.request<any>(gql`
1086
- mutation createTestClass1 {
1087
- createTestClass1(input: { fields: { field1: { createAndAdd: [{ field2: "field2" }] } } }) {
1088
- testClass1 {
1089
- id
1090
- }
1091
- }
1092
- }
1093
- `)
1094
-
1095
- const result2 = await rootClient.request<any>(gql`
1096
- query testClass1 {
1097
- testClass1(id: "${result1.createTestClass1.testClass1.id}") {
1098
- field1 {
1099
- edges {
1100
- node {
1101
- field2
1102
- }
1103
- }
1104
- }
1105
- }
1106
- }
1107
- `)
1108
-
1109
- expect(result2.testClass1.field1.edges[0].node.field2).toBe('field2')
1110
-
1111
- await wabe.close()
1112
- })
1113
-
1114
- it('should have FileInput input on Create and Update fields input when we use a File field', async () => {
1115
- const { wabe } = await createWabe({
1116
- classes: [
1117
- {
1118
- name: 'TestClass',
1119
- fields: {
1120
- file: {
1121
- type: 'File',
1122
- required: true,
1123
- },
1124
- },
1125
- },
1126
- ],
1127
- })
1128
-
1129
- expect(
1130
- getTypeFromGraphQLSchema({
1131
- schema: wabe.config.graphqlSchema || ({} as any),
1132
- type: 'Type',
1133
- name: 'TestClassCreateFieldsInput',
1134
- }).input.file,
1135
- ).toEqual('FileInput!')
1136
-
1137
- expect(
1138
- getTypeFromGraphQLSchema({
1139
- schema: wabe.config.graphqlSchema || ({} as any),
1140
- type: 'Type',
1141
- name: 'TestClassUpdateFieldsInput',
1142
- }).input.file,
1143
- ).toEqual('FileInput!')
1144
-
1145
- await wabe.close()
1146
- })
1147
-
1148
- it('should have FileInfo object on the wabe object when we use a File field', async () => {
1149
- const { wabe } = await createWabe({
1150
- classes: [
1151
- {
1152
- name: 'TestClass',
1153
- fields: {
1154
- file: {
1155
- type: 'File',
1156
- required: true,
1157
- },
1158
- },
1159
- },
1160
- ],
1161
- })
1162
-
1163
- expect(
1164
- getTypeFromGraphQLSchema({
1165
- schema: wabe.config.graphqlSchema || ({} as any),
1166
- type: 'Type',
1167
- name: 'TestClass',
1168
- }).input.file,
1169
- ).toEqual('FileInfo!')
1170
-
1171
- await wabe.close()
1172
- })
1173
-
1174
- it('should be able to create a phone field that check correctly if the phone is valid across the world', async () => {
1175
- const { client, wabe } = await createWabe({
1176
- classes: [
1177
- {
1178
- name: 'TestClass',
1179
- fields: {
1180
- phone: {
1181
- type: 'Phone',
1182
- },
1183
- },
1184
- },
1185
- ],
1186
- })
1187
-
1188
- // French mobile valid
1189
- await client.request<any>(gql`
1190
- mutation createTestClass {
1191
- createTestClass(input: { fields: { phone: "+33612345678" } }) {
1192
- testClass {
1193
- phone
1194
- }
1195
- }
1196
- }
1197
- `)
1198
-
1199
- // USA californian valid
1200
- await client.request<any>(gql`
1201
- mutation createTestClass {
1202
- createTestClass(input: { fields: { phone: "+14155552671" } }) {
1203
- testClass {
1204
- phone
1205
- }
1206
- }
1207
- }
1208
- `)
1209
-
1210
- // Brasil mobile valid
1211
- await client.request<any>(gql`
1212
- mutation createTestClass {
1213
- createTestClass(input: { fields: { phone: "+5511998765432" } }) {
1214
- testClass {
1215
- phone
1216
- }
1217
- }
1218
- }
1219
- `)
1220
-
1221
- // French mobile not valid
1222
- expect(
1223
- client.request<any>(gql`
1224
- mutation createTestClass {
1225
- createTestClass(input: { fields: { phone: "+3361234578" } }) {
1226
- testClass {
1227
- phone
1228
- }
1229
- }
1230
- }
1231
- `),
1232
- ).rejects.toThrow('Expected value of type "Phone", found "+3361234578"')
1233
-
1234
- // USA californian not valid
1235
- expect(
1236
- client.request<any>(gql`
1237
- mutation createTestClass {
1238
- createTestClass(input: { fields: { phone: "+1415555267" } }) {
1239
- testClass {
1240
- phone
1241
- }
1242
- }
1243
- }
1244
- `),
1245
- ).rejects.toThrow('Expected value of type "Phone", found "+1415555267"')
1246
-
1247
- // Brasil mobile not valid
1248
- expect(
1249
- client.request<any>(gql`
1250
- mutation createTestClass {
1251
- createTestClass(input: { fields: { phone: "+5511234567" } }) {
1252
- testClass {
1253
- phone
1254
- }
1255
- }
1256
- }
1257
- `),
1258
- ).rejects.toThrow('Expected value of type "Phone", found "+5511234567"')
1259
-
1260
- await wabe.close()
1261
- })
1262
-
1263
- it('should be able to create an array in an object', async () => {
1264
- const { wabe } = await createWabe({
1265
- classes: [
1266
- {
1267
- name: 'TestClass',
1268
- fields: {
1269
- field1: {
1270
- type: 'Array',
1271
- typeValue: 'Object',
1272
- object: {
1273
- name: 'SubObject',
1274
- fields: {
1275
- field2: {
1276
- type: 'Array',
1277
- typeValue: 'String',
1278
- required: true,
1279
- requiredValue: false,
1280
- },
1281
- field3: { type: 'Int' },
1282
- },
1283
- },
1284
- },
1285
- },
1286
- },
1287
- ],
1288
- })
1289
-
1290
- expect(
1291
- getTypeFromGraphQLSchema({
1292
- schema: wabe.config.graphqlSchema || ({} as any),
1293
- type: 'Type',
1294
- name: 'TestClassSubObject',
1295
- }).input,
1296
- ).toEqual({
1297
- field2: '[String]!',
1298
- field3: 'Int',
1299
- })
1300
-
1301
- await wabe.close()
1302
- })
1303
-
1304
- // It is useful when we have the permission to create but not to read the data
1305
- // We should be able to create a new object without return any data
1306
- // Just use the "ok" field
1307
- it('should be able to create a new object with mutation without return any data', async () => {
1308
- const { wabe } = await createWabe({
1309
- classes: [
1310
- {
1311
- name: 'TestClass',
1312
- fields: {
1313
- name: {
1314
- type: 'String',
1315
- },
1316
- },
1317
- permissions: {
1318
- // Anyone can create a new object
1319
- create: {
1320
- requireAuthentication: false,
1321
- },
1322
- // No one can read the data
1323
- read: {
1324
- authorizedRoles: [],
1325
- requireAuthentication: true,
1326
- },
1327
- },
1328
- },
1329
- ],
1330
- })
1331
-
1332
- const anonymousClient = getAnonymousClient(wabe.config.port)
1333
-
1334
- const res = await anonymousClient.request<any>(
1335
- gql`
1336
- mutation createTestClass {
1337
- createTestClass(input: { fields: { name: "A" } }) {
1338
- ok
1339
- }
1340
- }
1341
- `,
1342
- {},
1343
- )
1344
-
1345
- expect(res.createTestClass.ok).toBe(true)
1346
-
1347
- await wabe.close()
1348
- })
1349
-
1350
- it('should be able to update an object with mutation without return any data', async () => {
1351
- const { client, wabe } = await createWabe({
1352
- classes: [
1353
- {
1354
- name: 'TestClass',
1355
- fields: {
1356
- name: {
1357
- type: 'String',
1358
- },
1359
- },
1360
- permissions: {
1361
- // Anyone can create a new object
1362
- create: {
1363
- requireAuthentication: false,
1364
- },
1365
- update: {
1366
- requireAuthentication: false,
1367
- },
1368
- // No one can read the data
1369
- read: {
1370
- authorizedRoles: [],
1371
- requireAuthentication: true,
1372
- },
1373
- },
1374
- },
1375
- ],
1376
- })
1377
-
1378
- const res = await client.request<any>(
1379
- gql`
1380
- mutation createTestClass {
1381
- createTestClass(input: { fields: { name: "A" } }) {
1382
- testClass {
1383
- id
1384
- }
1385
- }
1386
- }
1387
- `,
1388
- {},
1389
- )
1390
-
1391
- const anonymousClient = getAnonymousClient(wabe.config.port)
1392
-
1393
- const res2 = await anonymousClient.request<any>(
1394
- gql`
1395
- mutation updateTestClass {
1396
- updateTestClass(
1397
- input: {
1398
- fields: { name: "A" },
1399
- id: "${res.createTestClass.testClass.id}"
1400
- }
1401
- ) {
1402
- ok
1403
- }
1404
- }
1405
- `,
1406
- {},
1407
- )
1408
-
1409
- expect(res2.updateTestClass.ok).toBe(true)
1410
-
1411
- await wabe.close()
1412
- })
1413
-
1414
- it('should be able to delete an object with mutation without return any data', async () => {
1415
- const { client, wabe } = await createWabe({
1416
- classes: [
1417
- {
1418
- name: 'TestClass',
1419
- fields: {
1420
- name: {
1421
- type: 'String',
1422
- },
1423
- },
1424
- permissions: {
1425
- create: {
1426
- requireAuthentication: false,
1427
- },
1428
- delete: {
1429
- requireAuthentication: false,
1430
- },
1431
- },
1432
- },
1433
- ],
1434
- })
1435
-
1436
- const res = await client.request<any>(
1437
- gql`
1438
- mutation createTestClass {
1439
- createTestClass(input: { fields: { name: "A" } }) {
1440
- testClass {
1441
- id
1442
- }
1443
- }
1444
- }
1445
- `,
1446
- {},
1447
- )
1448
-
1449
- const anonymousClient = getAnonymousClient(wabe.config.port)
1450
-
1451
- const res2 = await anonymousClient.request<any>(
1452
- gql`
1453
- mutation deleteTestClass {
1454
- deleteTestClass(
1455
- input: {
1456
- id: "${res.createTestClass.testClass.id}"
1457
- }
1458
- ) {
1459
- ok
1460
- }
1461
- }
1462
- `,
1463
- {},
1464
- )
1465
-
1466
- expect(res2.deleteTestClass.ok).toBe(true)
1467
-
1468
- await wabe.close()
1469
- })
1470
-
1471
- it('should order the element in the query by name and age ASC using order enum', async () => {
1472
- const { client, wabe } = await createWabe({
1473
- classes: [
1474
- {
1475
- name: 'TestClass',
1476
- fields: {
1477
- name: {
1478
- type: 'String',
1479
- },
1480
- age: {
1481
- type: 'Int',
1482
- },
1483
- },
1484
- },
1485
- ],
1486
- })
1487
-
1488
- await client.request<any>(
1489
- gql`
1490
- mutation createTestClasses {
1491
- createTestClasses(
1492
- input: {
1493
- fields: [
1494
- { name: "A", age: 20 }
1495
- { name: "B", age: 19 }
1496
- { name: "C", age: 18 }
1497
- { name: "D", age: 17 }
1498
- ]
1499
- }
1500
- ) {
1501
- edges {
1502
- node {
1503
- name
1504
- }
1505
- }
1506
- }
1507
- }
1508
- `,
1509
- {},
1510
- )
1511
-
1512
- const res = await client.request<any>(
1513
- gql`
1514
- query testClasses {
1515
- testClasses(order: [name_DESC, age_ASC]) {
1516
- edges {
1517
- node {
1518
- name
1519
- }
1520
- }
1521
- }
1522
- }
1523
- `,
1524
- {},
1525
- )
1526
-
1527
- expect(res.testClasses.edges[0].node.name).toBe('D')
1528
- expect(res.testClasses.edges[1].node.name).toBe('C')
1529
- expect(res.testClasses.edges[2].node.name).toBe('B')
1530
- expect(res.testClasses.edges[3].node.name).toBe('A')
1531
-
1532
- await wabe.close()
1533
- })
1534
-
1535
- it('should order the element in the query by name ASC using order enum', async () => {
1536
- const { client, wabe } = await createWabe({
1537
- classes: [
1538
- {
1539
- name: 'TestClass',
1540
- fields: {
1541
- name: {
1542
- type: 'String',
1543
- },
1544
- },
1545
- },
1546
- ],
1547
- })
1548
-
1549
- await client.request<any>(
1550
- gql`
1551
- mutation createTestClasses {
1552
- createTestClasses(
1553
- input: { fields: [{ name: "test1" }, { name: "test2" }, { name: "test3" }, { name: "test4" }] }
1554
- ) {
1555
- edges {
1556
- node {
1557
- name
1558
- }
1559
- }
1560
- }
1561
- }
1562
- `,
1563
- {},
1564
- )
1565
-
1566
- const res = await client.request<any>(
1567
- gql`
1568
- query testClasses {
1569
- testClasses(where: { name: { equalTo: "test1" } }, order: [name_ASC]) {
1570
- edges {
1571
- node {
1572
- name
1573
- }
1574
- }
1575
- }
1576
- }
1577
- `,
1578
- {},
1579
- )
1580
-
1581
- expect(res.testClasses.edges[0].node.name).toBe('test1')
1582
-
1583
- await wabe.close()
1584
- })
1585
-
1586
- it('should use the searchUsers to search all testClasses for corresponding term', async () => {
1587
- const { client, wabe } = await createWabe({
1588
- classes: [
1589
- {
1590
- name: 'TestClass',
1591
- fields: {
1592
- name: {
1593
- type: 'String',
1594
- },
1595
- age: {
1596
- type: 'Int',
1597
- },
1598
- },
1599
- searchableFields: ['name'],
1600
- },
1601
- ],
1602
- })
1603
-
1604
- await client.request<any>(
1605
- gql`
1606
- mutation createTestClass {
1607
- createTestClass(input: { fields: { name: "test", age: 30 } }) {
1608
- testClass {
1609
- name
1610
- }
1611
- }
1612
- }
1613
- `,
1614
- {},
1615
- )
1616
-
1617
- const res = await client.request<any>(gql`
1618
- query testClasses {
1619
- testClasses(where: { AND: [{ age: { equalTo: 30 } }, { search: { contains: "t" } }] }) {
1620
- totalCount
1621
- }
1622
- }
1623
- `)
1624
-
1625
- expect(res.testClasses.totalCount).toEqual(1)
1626
-
1627
- const res2 = await client.request<any>(gql`
1628
- query testClasses {
1629
- testClasses(where: { search: { contains: "invalid" } }) {
1630
- totalCount
1631
- }
1632
- }
1633
- `)
1634
-
1635
- expect(res2.testClasses.totalCount).toEqual(0)
1636
-
1637
- const res3 = await client.request<any>(gql`
1638
- query testClasses {
1639
- testClasses(where: { search: { contains: "test" } }) {
1640
- totalCount
1641
- }
1642
- }
1643
- `)
1644
-
1645
- expect(res3.testClasses.totalCount).toEqual(1)
1646
-
1647
- const res4 = await client.request<any>(gql`
1648
- query testClasses {
1649
- testClasses(where: { AND: [{ age: { equalTo: 1111 } }, { search: { contains: "test" } }] }) {
1650
- totalCount
1651
- }
1652
- }
1653
- `)
1654
-
1655
- expect(res4.testClasses.totalCount).toEqual(0)
1656
-
1657
- const res5 = await client.request<any>(gql`
1658
- query testClasses {
1659
- testClasses(where: { AND: [{ age: { equalTo: 30 } }, { search: { contains: "" } }] }) {
1660
- totalCount
1661
- }
1662
- }
1663
- `)
1664
-
1665
- expect(res5.testClasses.totalCount).toEqual(1)
1666
-
1667
- await wabe.close()
1668
- })
1669
-
1670
- it('should contain totalCount elements in query multiple objects', () => {
1671
- expect(
1672
- getTypeFromGraphQLSchema({
1673
- schema,
1674
- type: 'Type',
1675
- name: 'TestClassConnection',
1676
- }).input.totalCount,
1677
- ).toEqual('Int')
1678
- })
1679
-
1680
- it('should totalCount all elements corresponding to where object', async () => {
1681
- const { client, wabe } = await createWabe({
1682
- classes: [
1683
- {
1684
- name: 'TestClass',
1685
- fields: {
1686
- field1: {
1687
- type: 'Object',
1688
- object: {
1689
- name: 'SubObject',
1690
- fields: {
1691
- field2: { type: 'String' },
1692
- field3: { type: 'Int' },
1693
- },
1694
- },
1695
- },
1696
- },
1697
- },
1698
- ],
1699
- })
1700
-
1701
- await client.request<any>(
1702
- gql`
1703
- mutation createTestClass {
1704
- createTestClass(input: { fields: { field1: { field2: "test", field3: 1 } } }) {
1705
- testClass {
1706
- field1 {
1707
- field2
1708
- }
1709
- }
1710
- }
1711
- }
1712
- `,
1713
- {},
1714
- )
1715
-
1716
- const res = await client.request<any>(gql`
1717
- query testClasses {
1718
- testClasses {
1719
- totalCount
1720
- }
1721
- }
1722
- `)
1723
-
1724
- expect(res.testClasses.totalCount).toEqual(1)
1725
-
1726
- await wabe.close()
1727
- })
1728
-
1729
- it('should request an object with pointer in same class (issue #5)', async () => {
1730
- const { client, wabe } = await createWabe({
1731
- classes: [],
1732
- })
1733
-
1734
- await client.request<any>(gql`
1735
- mutation createOnboarding {
1736
- createUser(
1737
- input: {
1738
- fields: {
1739
- authentication: { emailPassword: { email: "test@gmail.com", password: "password" } }
1740
- }
1741
- }
1742
- ) {
1743
- user {
1744
- email
1745
- }
1746
- }
1747
- }
1748
- `)
1749
-
1750
- const res = await client.request<any>(gql`
1751
- query users {
1752
- users {
1753
- edges {
1754
- node {
1755
- authentication {
1756
- emailPassword {
1757
- email
1758
- password
1759
- }
1760
- }
1761
- }
1762
- }
1763
- }
1764
- }
1765
- `)
1766
-
1767
- expect(res.users.edges[0].node.authentication.emailPassword).toEqual({
1768
- email: 'test@gmail.com',
1769
- password: expect.any(String),
1770
- })
1771
-
1772
- await wabe.close()
1773
- })
1774
-
1775
- it('should support custom output types for queries and mutations', () => {
1776
- expect(
1777
- getTypeFromGraphQLSchema({
1778
- schema,
1779
- type: 'Query',
1780
- name: 'queryWithCustomTypes',
1781
- }).output,
1782
- ).toEqual('[TestQuery!]!')
1783
-
1784
- expect(
1785
- getTypeFromGraphQLSchema({
1786
- schema,
1787
- type: 'Mutation',
1788
- name: 'mutationWithCustomTypes',
1789
- }).output,
1790
- ).toEqual('[TestMutation!]!')
1791
- })
1792
-
1793
- it('should have required field on object fields', () => {
1794
- expect(
1795
- getTypeFromGraphQLSchema({
1796
- schema,
1797
- type: 'Type',
1798
- name: 'TestClassRequired',
1799
- }).input.field7,
1800
- ).toEqual('String!')
1801
-
1802
- expect(
1803
- getTypeFromGraphQLSchema({
1804
- schema,
1805
- type: 'Type',
1806
- name: 'TestClassRequired',
1807
- }).input.field8,
1808
- ).toEqual('[Int!]!')
1809
-
1810
- expect(
1811
- getTypeFromGraphQLSchema({
1812
- schema,
1813
- type: 'Type',
1814
- name: 'TestClassRequired',
1815
- }).input.field9,
1816
- ).toEqual('[TestClassRequiredTestObjectArray]!')
1817
- })
1818
-
1819
- it('should support object of array of object', () => {
1820
- expect(
1821
- getTypeFromGraphQLSchema({
1822
- schema,
1823
- type: 'Type',
1824
- name: 'TestClass2',
1825
- }).input.field1,
1826
- ).toEqual('TestClass2TestObject!')
1827
-
1828
- expect(
1829
- getTypeFromGraphQLSchema({
1830
- schema,
1831
- type: 'Type',
1832
- name: 'TestClass2TestObject',
1833
- }).input.testSubObject,
1834
- ).toEqual('[TestClass2TestObjectFieldsObject!]!')
1835
-
1836
- expect(
1837
- getTypeFromGraphQLSchema({
1838
- schema,
1839
- type: 'Type',
1840
- name: 'TestClass2TestObjectFieldsObject',
1841
- }).input,
1842
- ).toEqual({ name: 'String!' })
1843
- })
1844
-
1845
- it('should support an array of object in graphql schema', async () => {
1846
- const { client, wabe } = await createWabe({
1847
- classes: [
1848
- {
1849
- name: 'TestClass',
1850
- fields: {
1851
- field1: {
1852
- type: 'Array',
1853
- typeValue: 'Object',
1854
- object: {
1855
- name: 'Field1Object',
1856
- fields: {
1857
- name: {
1858
- type: 'String',
1859
- },
1860
- },
1861
- },
1862
- },
1863
- },
1864
- },
1865
- ],
1866
- })
1867
-
1868
- const res = await client.request<any>(gql`
1869
- mutation createTestClass {
1870
- createTestClass(input: { fields: { field1: [{ name: "test" }, { name: "test2" }] } }) {
1871
- testClass {
1872
- id
1873
- field1 {
1874
- name
1875
- }
1876
- }
1877
- }
1878
- }
1879
- `)
1880
-
1881
- expect(res.createTestClass.testClass.field1).toEqual([{ name: 'test' }, { name: 'test2' }])
1882
-
1883
- await wabe.close()
1884
- })
1885
-
1886
- it('should return an array in a query', async () => {
1887
- const { client, wabe } = await createWabe({
1888
- classes: [
1889
- {
1890
- name: 'TestClass',
1891
- fields: {
1892
- field1: {
1893
- type: 'String',
1894
- },
1895
- },
1896
- },
1897
- ],
1898
- resolvers: {
1899
- queries: {
1900
- testQuery: {
1901
- resolve: () => {
1902
- return ['test']
1903
- },
1904
- type: 'Array',
1905
- typeValue: 'String',
1906
- },
1907
- },
1908
- },
1909
- })
1910
-
1911
- const res = await client.request<any>(gql`
1912
- query testQuery {
1913
- testQuery
1914
- }
1915
- `)
1916
-
1917
- expect(res.testQuery).toEqual(['test'])
1918
-
1919
- await wabe.close()
1920
- })
1921
-
1922
- it('should return an object in a query', async () => {
1923
- const { client, wabe } = await createWabe({
1924
- classes: [
1925
- {
1926
- name: 'TestClass',
1927
- fields: {
1928
- field1: {
1929
- type: 'String',
1930
- },
1931
- },
1932
- },
1933
- ],
1934
- resolvers: {
1935
- queries: {
1936
- testQuery: {
1937
- resolve: () => {
1938
- return { test: 'test' }
1939
- },
1940
- type: 'Object',
1941
- outputObject: {
1942
- name: 'TestQueryOutput',
1943
- fields: {
1944
- test: {
1945
- type: 'String',
1946
- },
1947
- },
1948
- },
1949
- },
1950
- },
1951
- },
1952
- })
1953
-
1954
- const res = await client.request<any>(gql`
1955
- query testQuery {
1956
- testQuery {
1957
- test
1958
- }
1959
- }
1960
- `)
1961
-
1962
- expect(res.testQuery.test).toEqual('test')
1963
-
1964
- await wabe.close()
1965
- })
1966
-
1967
- it('should return an array in a mutation', async () => {
1968
- const { client, wabe } = await createWabe({
1969
- classes: [
1970
- {
1971
- name: 'TestClass',
1972
- fields: {
1973
- field1: {
1974
- type: 'String',
1975
- },
1976
- },
1977
- },
1978
- ],
1979
- resolvers: {
1980
- mutations: {
1981
- testMutation: {
1982
- resolve: () => {
1983
- return ['test']
1984
- },
1985
- type: 'Array',
1986
- typeValue: 'String',
1987
- },
1988
- },
1989
- },
1990
- })
1991
-
1992
- const res = await client.request<any>(gql`
1993
- mutation testMutation {
1994
- testMutation
1995
- }
1996
- `)
1997
-
1998
- expect(res.testMutation).toEqual(['test'])
1999
-
2000
- await wabe.close()
2001
- })
2002
-
2003
- it('should return an object in a mutation', async () => {
2004
- const { client, wabe } = await createWabe({
2005
- classes: [
2006
- {
2007
- name: 'TestClass',
2008
- fields: {
2009
- field1: {
2010
- type: 'String',
2011
- },
2012
- },
2013
- },
2014
- ],
2015
- resolvers: {
2016
- mutations: {
2017
- testMutation: {
2018
- resolve: () => {
2019
- return { test: 'test' }
2020
- },
2021
- type: 'Object',
2022
- outputObject: {
2023
- name: 'TestMutationOutput',
2024
- fields: {
2025
- test: {
2026
- type: 'String',
2027
- },
2028
- },
2029
- },
2030
- },
2031
- },
2032
- },
2033
- })
2034
-
2035
- const res = await client.request<any>(gql`
2036
- mutation testMutation {
2037
- testMutation {
2038
- test
2039
- }
2040
- }
2041
- `)
2042
-
2043
- expect(res.testMutation.test).toEqual('test')
2044
-
2045
- await wabe.close()
2046
- })
2047
-
2048
- it('should have a custom enum as value in type', async () => {
2049
- const { client, wabe } = await createWabe({
2050
- classes: [
2051
- {
2052
- name: 'TestClass',
2053
- fields: {
2054
- field1: {
2055
- // @ts-expect-error
2056
- type: 'CustomEnum',
2057
- },
2058
- },
2059
- },
2060
- ],
2061
- enums: [
2062
- {
2063
- name: 'CustomEnum',
2064
- values: {
2065
- Value1: 'Value1',
2066
- Value2: 'Value2',
2067
- },
2068
- },
2069
- ],
2070
- })
2071
-
2072
- await client.request<any>(gql`
2073
- mutation createTestClass {
2074
- createTestClass(input: { fields: { field1: Value1 } }) {
2075
- testClass {
2076
- field1
2077
- }
2078
- }
2079
- }
2080
- `)
2081
-
2082
- const res = await client.request<any>(gql`
2083
- query testClasses {
2084
- testClasses(where: { field1: { equalTo: "Value1" } }) {
2085
- edges {
2086
- node {
2087
- id
2088
- field1
2089
- }
2090
- }
2091
- }
2092
- }
2093
- `)
2094
-
2095
- expect(res.testClasses.edges.length).toBe(1)
2096
- expect(res.testClasses.edges[0].node.field1).toBe('Value1')
2097
-
2098
- const resNotEqual = await client.request<any>(gql`
2099
- query testClasses {
2100
- testClasses(where: { field1: { notEqualTo: "Value1" } }) {
2101
- edges {
2102
- node {
2103
- id
2104
- field1
2105
- }
2106
- }
2107
- }
2108
- }
2109
- `)
2110
-
2111
- expect(resNotEqual.testClasses.edges.length).toBe(0)
2112
-
2113
- await wabe.close()
2114
- })
2115
-
2116
- it('should have correct WhereInput object', () => {
2117
- expect(
2118
- getTypeFromGraphQLSchema({
2119
- schema,
2120
- type: 'Type',
2121
- name: 'TestClassWhereInput',
2122
- }).input,
2123
- ).toEqual({
2124
- id: 'IdWhereInput',
2125
- AND: '[TestClassWhereInput]',
2126
- OR: '[TestClassWhereInput]',
2127
- field1: 'StringWhereInput',
2128
- acl: 'TestClassACLObjectWhereInput',
2129
- createdAt: 'DateWhereInput',
2130
- updatedAt: 'DateWhereInput',
2131
- search: 'SearchWhereInput',
2132
- })
2133
- })
2134
-
2135
- it('should resolve virtual fields in GraphQL queries', async () => {
2136
- const { client, wabe } = await createWabe({
2137
- classes: [
2138
- {
2139
- name: 'VirtualPerson',
2140
- fields: {
2141
- firstName: { type: 'String' },
2142
- lastName: { type: 'String' },
2143
- age: { type: 'Int' },
2144
- fullName: {
2145
- type: 'Virtual',
2146
- returnType: 'String',
2147
- // @ts-expect-error
2148
- dependsOn: ['firstName', 'lastName'],
2149
- callback: (object: any) =>
2150
- `${object.firstName || ''} ${object.lastName || ''}`.trim(),
2151
- },
2152
- isAdult: {
2153
- type: 'Virtual',
2154
- returnType: 'Boolean',
2155
- // @ts-expect-error
2156
- dependsOn: ['age'],
2157
- callback: (object: any) => (object.age || 0) >= 18,
2158
- },
2159
- },
2160
- permissions: {
2161
- read: { requireAuthentication: false },
2162
- create: { requireAuthentication: false },
2163
- update: { requireAuthentication: false },
2164
- delete: { requireAuthentication: false },
2165
- },
2166
- },
2167
- ],
2168
- })
2169
-
2170
- const created = await client.request<{
2171
- createVirtualPerson: {
2172
- virtualPerson: {
2173
- id: string
2174
- }
2175
- }
2176
- }>(gql`
2177
- mutation createVirtualPerson {
2178
- createVirtualPerson(input: { fields: { firstName: "Ada", lastName: "Lovelace", age: 37 } }) {
2179
- virtualPerson {
2180
- id
2181
- }
2182
- }
2183
- }
2184
- `)
2185
-
2186
- const read = await client.request<{
2187
- virtualPerson: {
2188
- id: string
2189
- firstName: string
2190
- lastName: string
2191
- age: number
2192
- fullName: string
2193
- isAdult: boolean
2194
- }
2195
- }>(
2196
- gql`
2197
- query virtualPerson($id: ID) {
2198
- virtualPerson(id: $id) {
2199
- id
2200
- firstName
2201
- lastName
2202
- age
2203
- fullName
2204
- isAdult
2205
- }
2206
- }
2207
- `,
2208
- { id: created.createVirtualPerson.virtualPerson.id },
2209
- )
2210
-
2211
- expect(read.virtualPerson.id).toBe(created.createVirtualPerson.virtualPerson.id)
2212
- expect(read.virtualPerson.firstName).toBe('Ada')
2213
- expect(read.virtualPerson.lastName).toBe('Lovelace')
2214
- expect(read.virtualPerson.age).toBe(37)
2215
- expect(read.virtualPerson.fullName).toBe('Ada Lovelace')
2216
- expect(read.virtualPerson.isAdult).toBe(true)
2217
-
2218
- const list = await client.request<{
2219
- virtualPersons: {
2220
- edges: Array<{
2221
- node: {
2222
- fullName: string
2223
- isAdult: boolean
2224
- }
2225
- }>
2226
- }
2227
- }>(gql`
2228
- query virtualPersons {
2229
- virtualPersons {
2230
- edges {
2231
- node {
2232
- fullName
2233
- isAdult
2234
- }
2235
- }
2236
- }
2237
- }
2238
- `)
2239
-
2240
- expect(list.virtualPersons.edges[0]?.node.fullName).toBe('Ada Lovelace')
2241
- expect(list.virtualPersons.edges[0]?.node.isAdult).toBe(true)
2242
-
2243
- await wabe.close()
2244
- })
2245
-
2246
- it('should resolve virtual field returning array in GraphQL queries', async () => {
2247
- const { client, wabe } = await createWabe({
2248
- classes: [
2249
- {
2250
- name: 'VirtualPersonWithArray',
2251
- fields: {
2252
- firstName: { type: 'String' },
2253
- lastName: { type: 'String' },
2254
- nameParts: {
2255
- type: 'Virtual',
2256
- returnType: 'Array',
2257
- typeValue: 'String',
2258
- // @ts-expect-error
2259
- dependsOn: ['firstName', 'lastName'],
2260
- callback: (object: any) =>
2261
- [object.firstName || '', object.lastName || ''].filter(Boolean),
2262
- },
2263
- },
2264
- permissions: {
2265
- read: { requireAuthentication: false },
2266
- create: { requireAuthentication: false },
2267
- update: { requireAuthentication: false },
2268
- delete: { requireAuthentication: false },
2269
- },
2270
- },
2271
- ],
2272
- })
2273
-
2274
- const created = await client.request<{
2275
- createVirtualPersonWithArray: {
2276
- virtualPersonWithArray: { id: string }
2277
- }
2278
- }>(gql`
2279
- mutation createVirtualPersonWithArray {
2280
- createVirtualPersonWithArray(input: { fields: { firstName: "Ada", lastName: "Lovelace" } }) {
2281
- virtualPersonWithArray {
2282
- id
2283
- }
2284
- }
2285
- }
2286
- `)
2287
-
2288
- const read = await client.request<{
2289
- virtualPersonWithArray: {
2290
- id: string
2291
- firstName: string
2292
- lastName: string
2293
- nameParts: string[]
2294
- }
2295
- }>(
2296
- gql`
2297
- query virtualPersonWithArray($id: ID) {
2298
- virtualPersonWithArray(id: $id) {
2299
- id
2300
- firstName
2301
- lastName
2302
- nameParts
2303
- }
2304
- }
2305
- `,
2306
- {
2307
- id: created.createVirtualPersonWithArray.virtualPersonWithArray.id,
2308
- },
2309
- )
2310
-
2311
- expect(read.virtualPersonWithArray.nameParts).toEqual(['Ada', 'Lovelace'])
2312
-
2313
- await wabe.close()
2314
- })
2315
-
2316
- it('should resolve virtual field returning array of objects in GraphQL queries', async () => {
2317
- const { client, wabe } = await createWabe({
2318
- classes: [
2319
- {
2320
- name: 'VirtualPersonWithObjectArray',
2321
- fields: {
2322
- firstName: { type: 'String' },
2323
- lastName: { type: 'String' },
2324
- nameInfos: {
2325
- type: 'Virtual',
2326
- returnType: 'Array',
2327
- typeValue: 'Object',
2328
- object: {
2329
- name: 'NameInfo',
2330
- fields: {
2331
- label: { type: 'String' },
2332
- value: { type: 'String' },
2333
- },
2334
- },
2335
- // @ts-expect-error
2336
- dependsOn: ['firstName', 'lastName'],
2337
- callback: (object: any) => [
2338
- {
2339
- label: 'First',
2340
- value: object.firstName || '',
2341
- },
2342
- { label: 'Last', value: object.lastName || '' },
2343
- ],
2344
- },
2345
- },
2346
- permissions: {
2347
- read: { requireAuthentication: false },
2348
- create: { requireAuthentication: false },
2349
- update: { requireAuthentication: false },
2350
- delete: { requireAuthentication: false },
2351
- },
2352
- },
2353
- ],
2354
- })
2355
-
2356
- const created = await client.request<{
2357
- createVirtualPersonWithObjectArray: {
2358
- virtualPersonWithObjectArray: { id: string }
2359
- }
2360
- }>(gql`
2361
- mutation createVirtualPersonWithObjectArray {
2362
- createVirtualPersonWithObjectArray(
2363
- input: { fields: { firstName: "Grace", lastName: "Hopper" } }
2364
- ) {
2365
- virtualPersonWithObjectArray {
2366
- id
2367
- }
2368
- }
2369
- }
2370
- `)
2371
-
2372
- const read = await client.request<{
2373
- virtualPersonWithObjectArray: {
2374
- id: string
2375
- nameInfos: Array<{ label: string; value: string }>
2376
- }
2377
- }>(
2378
- gql`
2379
- query virtualPersonWithObjectArray($id: ID) {
2380
- virtualPersonWithObjectArray(id: $id) {
2381
- id
2382
- nameInfos {
2383
- label
2384
- value
2385
- }
2386
- }
2387
- }
2388
- `,
2389
- {
2390
- id: created.createVirtualPersonWithObjectArray.virtualPersonWithObjectArray.id,
2391
- },
2392
- )
2393
-
2394
- expect(read.virtualPersonWithObjectArray.nameInfos).toEqual([
2395
- { label: 'First', value: 'Grace' },
2396
- { label: 'Last', value: 'Hopper' },
2397
- ])
2398
-
2399
- await wabe.close()
2400
- })
2401
-
2402
- it('should have ConnectionObject on field of relation in ObjectType', () => {
2403
- expect(
2404
- getTypeFromGraphQLSchema({
2405
- schema,
2406
- type: 'Type',
2407
- name: 'FifthClass',
2408
- }).input.relation,
2409
- ).toEqual('SixthClassConnection')
2410
- })
2411
-
2412
- it('should have a TestClassRelationInput', () => {
2413
- expect(
2414
- getTypeFromGraphQLSchema({
2415
- schema,
2416
- type: 'Type',
2417
- name: 'TestClassRelationInput',
2418
- }).input.createAndAdd,
2419
- ).toEqual('[TestClassCreateFieldsInput!]')
2420
- })
2421
-
2422
- it('should have a RelationInput on SixthClass on field relation of FifthClass', () => {
2423
- expect(
2424
- getTypeFromGraphQLSchema({
2425
- schema,
2426
- type: 'Type',
2427
- name: 'FifthClassInput',
2428
- }).input.relation,
2429
- ).toEqual('SixthClassRelationInput')
2430
- })
2431
-
2432
- it('should have RelationWhereInput with have and isEmpty for relation fields', () => {
2433
- expect(
2434
- getTypeFromGraphQLSchema({
2435
- schema,
2436
- type: 'Type',
2437
- name: 'FifthClassWhereInput',
2438
- }).input.relation,
2439
- ).toEqual('SixthClassRelationWhereInput')
2440
-
2441
- expect(
2442
- getTypeFromGraphQLSchema({
2443
- schema,
2444
- type: 'Type',
2445
- name: 'SixthClassRelationWhereInput',
2446
- }).input,
2447
- ).toEqual({
2448
- have: 'SixthClassWhereInput',
2449
- isEmpty: 'Boolean',
2450
- })
2451
- })
2452
-
2453
- it('should filter by relation with have', async () => {
2454
- const { client, wabe } = await createWabe({
2455
- classes: [
2456
- {
2457
- name: 'TestClass',
2458
- fields: {
2459
- field1: { type: 'String' },
2460
- },
2461
- },
2462
- {
2463
- name: 'TestClass2',
2464
- fields: {
2465
- name: { type: 'String' },
2466
- field2: {
2467
- type: 'Relation',
2468
- // @ts-expect-error
2469
- class: 'TestClass',
2470
- },
2471
- },
2472
- },
2473
- ],
2474
- })
2475
-
2476
- await client.request<any>(gql`
2477
- mutation createTestClass2 {
2478
- createTestClass2(
2479
- input: { fields: { name: "matchParent", field2: { createAndAdd: [{ field1: "match" }] } } }
2480
- ) {
2481
- testClass2 {
2482
- id
2483
- }
2484
- }
2485
- }
2486
- `)
2487
-
2488
- await client.request<any>(gql`
2489
- mutation createTestClass2 {
2490
- createTestClass2(
2491
- input: { fields: { name: "otherParent", field2: { createAndAdd: [{ field1: "other" }] } } }
2492
- ) {
2493
- testClass2 {
2494
- id
2495
- }
2496
- }
2497
- }
2498
- `)
2499
-
2500
- const res = await client.request<any>(gql`
2501
- query testClass2s {
2502
- testClass2s(where: { field2: { have: { field1: { equalTo: "match" } } } }) {
2503
- totalCount
2504
- edges {
2505
- node {
2506
- name
2507
- }
2508
- }
2509
- }
2510
- }
2511
- `)
2512
-
2513
- expect(res.testClass2s.totalCount).toBe(1)
2514
- expect(res.testClass2s.edges[0]?.node.name).toBe('matchParent')
2515
-
2516
- const res2 = await client.request<any>(gql`
2517
- query testClass2s {
2518
- testClass2s(where: { field2: { have: { field1: { notEqualTo: "match" } } } }) {
2519
- totalCount
2520
- edges {
2521
- node {
2522
- name
2523
- }
2524
- }
2525
- }
2526
- }
2527
- `)
2528
-
2529
- expect(res2.testClass2s.totalCount).toBe(1)
2530
- expect(res2.testClass2s.edges[0]?.node.name).toBe('otherParent')
2531
-
2532
- await wabe.close()
2533
- })
2534
-
2535
- it('should filter by relation with isEmpty', async () => {
2536
- const { client, wabe } = await createWabe({
2537
- classes: [
2538
- {
2539
- name: 'TestClass',
2540
- fields: {
2541
- field1: { type: 'String' },
2542
- },
2543
- },
2544
- {
2545
- name: 'TestClass2',
2546
- fields: {
2547
- name: { type: 'String' },
2548
- field2: {
2549
- type: 'Relation',
2550
- // @ts-expect-error
2551
- class: 'TestClass',
2552
- },
2553
- },
2554
- },
2555
- ],
2556
- })
2557
-
2558
- await client.request<any>(gql`
2559
- mutation createTestClass2 {
2560
- createTestClass2(input: { fields: { name: "empty" } }) {
2561
- testClass2 {
2562
- id
2563
- }
2564
- }
2565
- }
2566
- `)
2567
-
2568
- await client.request<any>(gql`
2569
- mutation createTestClass2 {
2570
- createTestClass2(
2571
- input: { fields: { name: "withItems", field2: { createAndAdd: [{ field1: "x" }] } } }
2572
- ) {
2573
- testClass2 {
2574
- id
2575
- }
2576
- }
2577
- }
2578
- `)
2579
-
2580
- const resEmpty = await client.request<any>(gql`
2581
- query testClass2s {
2582
- testClass2s(where: { field2: { isEmpty: true } }) {
2583
- totalCount
2584
- edges {
2585
- node {
2586
- name
2587
- }
2588
- }
2589
- }
2590
- }
2591
- `)
2592
-
2593
- expect(resEmpty.testClass2s.totalCount).toBe(1)
2594
- expect(resEmpty.testClass2s.edges[0]?.node.name).toBe('empty')
2595
-
2596
- const resNonEmpty = await client.request<any>(gql`
2597
- query testClass2s {
2598
- testClass2s(where: { field2: { isEmpty: false } }) {
2599
- totalCount
2600
- edges {
2601
- node {
2602
- name
2603
- }
2604
- }
2605
- }
2606
- }
2607
- `)
2608
-
2609
- expect(resNonEmpty.testClass2s.totalCount).toBe(1)
2610
- expect(resNonEmpty.testClass2s.edges[0]?.node.name).toBe('withItems')
2611
-
2612
- await wabe.close()
2613
- })
2614
-
2615
- it('should have the pointer in the object when there is a circular dependency in pointer', () => {
2616
- expect(
2617
- getTypeFromGraphQLSchema({
2618
- schema,
2619
- type: 'Type',
2620
- name: 'ThirdClass',
2621
- }).input.pointer,
2622
- ).toEqual('FourthClass')
2623
-
2624
- expect(
2625
- getTypeFromGraphQLSchema({
2626
- schema,
2627
- type: 'Type',
2628
- name: 'FourthClass',
2629
- }).input.pointer,
2630
- ).toEqual('ThirdClass')
2631
-
2632
- expect(
2633
- getTypeFromGraphQLSchema({
2634
- schema,
2635
- type: 'Type',
2636
- name: 'ThirdClassInput',
2637
- }).input.pointer,
2638
- ).toEqual('FourthClassPointerInput')
2639
-
2640
- expect(
2641
- getTypeFromGraphQLSchema({
2642
- schema,
2643
- type: 'Type',
2644
- name: 'FourthClassInput',
2645
- }).input.pointer,
2646
- ).toEqual('ThirdClassPointerInput')
2647
-
2648
- expect(
2649
- getTypeFromGraphQLSchema({
2650
- schema,
2651
- type: 'Type',
2652
- name: 'ThirdClassPointerInput',
2653
- }).input.createAndLink,
2654
- ).toEqual('ThirdClassCreateFieldsInput')
2655
-
2656
- expect(
2657
- getTypeFromGraphQLSchema({
2658
- schema,
2659
- type: 'Type',
2660
- name: 'FourthClassPointerInput',
2661
- }).input.createAndLink,
2662
- ).toEqual('FourthClassCreateFieldsInput')
2663
- })
2664
-
2665
- it('should have TestClassPointerInput', () => {
2666
- expect(
2667
- getTypeFromGraphQLSchema({
2668
- schema,
2669
- type: 'Type',
2670
- name: 'TestClassPointerInput',
2671
- }).input.createAndLink,
2672
- ).toEqual('TestClassCreateFieldsInput')
2673
- })
2674
-
2675
- it('should have a type with a pointer to TestClass', () => {
2676
- expect(
2677
- getTypeFromGraphQLSchema({
2678
- schema,
2679
- type: 'Type',
2680
- name: 'SecondClass',
2681
- }).input.pointer,
2682
- ).toEqual('TestClass')
2683
- })
2684
-
2685
- it('should have pointer input on SecondClassCreateFieldsInput', () => {
2686
- expect(
2687
- getTypeFromGraphQLSchema({
2688
- schema,
2689
- type: 'Type',
2690
- name: 'SecondClassCreateFieldsInput',
2691
- }).input.pointer,
2692
- ).toEqual('TestClassPointerInput')
2693
- })
2694
-
2695
- it('should have pointer input on SecondClassUpdateFieldsInput', () => {
2696
- expect(
2697
- getTypeFromGraphQLSchema({
2698
- schema,
2699
- type: 'Type',
2700
- name: 'SecondClassUpdateFieldsInput',
2701
- }).input.pointer,
2702
- ).toEqual('TestClassPointerInput')
2703
- })
2704
-
2705
- it('should have ClassCreateInputFieldsInput', () => {
2706
- expect(
2707
- getTypeFromGraphQLSchema({
2708
- schema,
2709
- type: 'Type',
2710
- name: 'TestClassCreateFieldsInput',
2711
- }).input.field1,
2712
- ).toEqual('String')
2713
- })
2714
-
2715
- it('should have ClassUpdateInputFieldsInput', () => {
2716
- expect(
2717
- getTypeFromGraphQLSchema({
2718
- schema,
2719
- type: 'Type',
2720
- name: 'TestClassUpdateFieldsInput',
2721
- }).input.field1,
2722
- ).toEqual('String')
2723
- })
2724
-
2725
- it('should get correct CreateTestClassPaylod type', () => {
2726
- expect(
2727
- getTypeFromGraphQLSchema({
2728
- schema,
2729
- type: 'Type',
2730
- name: 'CreateTestClassPayload',
2731
- }).input,
2732
- ).toEqual({
2733
- ok: 'Boolean',
2734
- testClass: 'TestClass',
2735
- })
2736
- })
2737
-
2738
- it('should return graphql relay standard output for default get query', () => {
2739
- expect(
2740
- getTypeFromGraphQLSchema({
2741
- schema,
2742
- type: 'Query',
2743
- name: 'testClass',
2744
- }),
2745
- ).toEqual({
2746
- input: {
2747
- id: 'ID',
2748
- },
2749
- output: 'TestClass',
2750
- })
2751
- })
2752
-
2753
- it('should return graphql relay standard output for default get query (multiple)', () => {
2754
- expect(
2755
- getTypeFromGraphQLSchema({
2756
- schema,
2757
- type: 'Query',
2758
- name: 'testClasses',
2759
- }),
2760
- ).toEqual({
2761
- input: {
2762
- first: 'Int',
2763
- offset: 'Int',
2764
- where: 'TestClassWhereInput',
2765
- order: '[TestClassOrder!]',
2766
- },
2767
- output: 'TestClassConnection!',
2768
- })
2769
- })
2770
-
2771
- it('should return graphql relay standard output for default create mutation', () => {
2772
- expect(
2773
- getTypeFromGraphQLSchema({
2774
- schema,
2775
- type: 'Mutation',
2776
- name: 'createTestClass',
2777
- }),
2778
- ).toEqual({
2779
- input: { input: 'CreateTestClassInput!' },
2780
- output: 'CreateTestClassPayload',
2781
- })
2782
- })
2783
-
2784
- it('should return graphql relay standard output for default creates mutation (multiple)', () => {
2785
- expect(
2786
- getTypeFromGraphQLSchema({
2787
- schema,
2788
- type: 'Mutation',
2789
- name: 'createTestClasses',
2790
- }),
2791
- ).toEqual({
2792
- input: { input: 'CreateTestClassesInput!' },
2793
- output: 'TestClassConnection!',
2794
- })
2795
- })
2796
-
2797
- it('should return graphql relay standard output for default update mutation (clientMutationId, type)', () => {
2798
- expect(
2799
- getTypeFromGraphQLSchema({
2800
- schema,
2801
- type: 'Mutation',
2802
- name: 'updateTestClass',
2803
- }),
2804
- ).toEqual({
2805
- input: { input: 'UpdateTestClassInput!' },
2806
- output: 'UpdateTestClassPayload',
2807
- })
2808
- })
2809
-
2810
- it('should return graphql relay standard output for default updates (multiple) mutation', () => {
2811
- expect(
2812
- getTypeFromGraphQLSchema({
2813
- schema,
2814
- type: 'Mutation',
2815
- name: 'updateTestClasses',
2816
- }),
2817
- ).toEqual({
2818
- input: { input: 'UpdateTestClassesInput!' },
2819
- output: 'TestClassConnection!',
2820
- })
2821
- })
2822
-
2823
- it('should return graphql relay standard output for default delete mutation (clientMutationId, type)', () => {
2824
- expect(
2825
- getTypeFromGraphQLSchema({
2826
- schema,
2827
- type: 'Mutation',
2828
- name: 'deleteTestClass',
2829
- }),
2830
- ).toEqual({
2831
- input: { input: 'DeleteTestClassInput!' },
2832
- output: 'DeleteTestClassPayload',
2833
- })
2834
- })
2835
-
2836
- it('should return graphql relay standard output for default deletes (multiple) mutation', () => {
2837
- expect(
2838
- getTypeFromGraphQLSchema({
2839
- schema,
2840
- type: 'Mutation',
2841
- name: 'deleteTestClasses',
2842
- }),
2843
- ).toEqual({
2844
- input: { input: 'DeleteTestClassesInput!' },
2845
- output: 'TestClassConnection!',
2846
- })
2847
- })
2848
-
2849
- it('should not create input for mutation when there is no field', () => {
2850
- expect(
2851
- getTypeFromGraphQLSchema({
2852
- schema,
2853
- type: 'Mutation',
2854
- name: 'customMutation',
2855
- }),
2856
- ).toEqual({
2857
- input: {},
2858
- output: 'Boolean',
2859
- })
2860
- })
2861
-
2862
- it('should create custom query with no args', () => {
2863
- expect(
2864
- getTypeFromGraphQLSchema({
2865
- schema,
2866
- type: 'Query',
2867
- name: 'customQuery',
2868
- }),
2869
- ).toEqual({
2870
- input: {},
2871
- output: 'Boolean',
2872
- })
2873
- })
2874
-
2875
- it('should create mutation with sub input', async () => {
2876
- const { client, wabe } = await createWabe({
2877
- classes: [
2878
- {
2879
- name: 'TestClass',
2880
- fields: { field1: { type: 'String' } },
2881
- },
2882
- ],
2883
- resolvers: {
2884
- mutations: {
2885
- customMutation: {
2886
- type: 'Int',
2887
- args: {
2888
- input: {
2889
- sum: {
2890
- type: 'Object',
2891
- object: {
2892
- name: 'Sum',
2893
- fields: {
2894
- a: {
2895
- type: 'Int',
2896
- required: true,
2897
- },
2898
- b: {
2899
- type: 'Int',
2900
- required: true,
2901
- },
2902
- },
2903
- },
2904
- },
2905
- },
2906
- },
2907
- resolve: (_: any, args: any) => args.input.sum.a + args.input.sum.b,
2908
- },
2909
- },
2910
- },
2911
- })
2912
-
2913
- const request = await client.request<any>(
2914
- gql`
2915
- mutation customMutation {
2916
- customMutation(input: { sum: { a: 1, b: 2 } })
2917
- }
2918
- `,
2919
- {},
2920
- )
2921
-
2922
- expect(request.customMutation).toBe(3)
2923
-
2924
- await wabe.close()
2925
- })
2926
-
2927
- it('should create mutation with sub sub input', async () => {
2928
- const { client, wabe } = await createWabe({
2929
- classes: [
2930
- {
2931
- name: 'TestClass',
2932
- fields: { field1: { type: 'String' } },
2933
- },
2934
- ],
2935
- resolvers: {
2936
- mutations: {
2937
- customMutation: {
2938
- type: 'Int',
2939
- args: {
2940
- input: {
2941
- subObject: {
2942
- type: 'Object',
2943
- object: {
2944
- name: 'SubObject',
2945
- fields: {
2946
- sum: {
2947
- type: 'Object',
2948
- object: {
2949
- name: 'Sum',
2950
- fields: {
2951
- a: {
2952
- type: 'Int',
2953
- required: true,
2954
- },
2955
- b: {
2956
- type: 'Int',
2957
- required: true,
2958
- },
2959
- },
2960
- },
2961
- },
2962
- },
2963
- },
2964
- },
2965
- },
2966
- },
2967
- resolve: (_: any, args: any) => args.input.subObject.sum.a + args.input.subObject.sum.b,
2968
- },
2969
- },
2970
- },
2971
- })
2972
-
2973
- const request = await client.request<any>(
2974
- gql`
2975
- mutation customMutation {
2976
- customMutation(input: { subObject: { sum: { a: 1, b: 2 } } })
2977
- }
2978
- `,
2979
- {},
2980
- )
2981
-
2982
- expect(request.customMutation).toBe(3)
2983
-
2984
- await wabe.close()
2985
- })
2986
-
2987
- it('should create custom mutation with sub object and correct input name', async () => {
2988
- const { client, wabe } = await createWabe({
2989
- classes: [
2990
- {
2991
- name: 'TestClass',
2992
- fields: { field1: { type: 'String' } },
2993
- },
2994
- ],
2995
- resolvers: {
2996
- mutations: {
2997
- customMutation: {
2998
- type: 'Int',
2999
- args: {
3000
- input: {
3001
- sum: {
3002
- type: 'Object',
3003
- object: {
3004
- name: 'Sum',
3005
- fields: {
3006
- a: {
3007
- type: 'Int',
3008
- required: true,
3009
- },
3010
- b: {
3011
- type: 'Int',
3012
- required: true,
3013
- },
3014
- },
3015
- },
3016
- },
3017
- },
3018
- },
3019
- resolve: (_: any, args: any) => args.input.sum.a + args.input.sum.b,
3020
- },
3021
- },
3022
- },
3023
- })
3024
-
3025
- const request = await client.request<any>(
3026
- gql`
3027
- mutation customMutation($sum: CustomMutationSumInput!) {
3028
- customMutation(input: { sum: $sum })
3029
- }
3030
- `,
3031
- {
3032
- sum: {
3033
- a: 1,
3034
- b: 2,
3035
- },
3036
- },
3037
- )
3038
-
3039
- expect(request.customMutation).toBe(3)
3040
-
3041
- const request2 = await client.request<any>(
3042
- gql`
3043
- mutation customMutation($input: CustomMutationInput!) {
3044
- customMutation(input: $input)
3045
- }
3046
- `,
3047
- {
3048
- input: {
3049
- sum: {
3050
- a: 1,
3051
- b: 2,
3052
- },
3053
- },
3054
- },
3055
- )
3056
-
3057
- expect(request2.customMutation).toBe(3)
3058
-
3059
- await wabe.close()
3060
- })
3061
-
3062
- it('should create a sub object with the good type', async () => {
3063
- const { client, wabe } = await createWabe({
3064
- classes: [
3065
- {
3066
- name: 'TestClass',
3067
- fields: {
3068
- field1: {
3069
- type: 'Object',
3070
- object: {
3071
- name: 'SubObject',
3072
- fields: {
3073
- field2: { type: 'String' },
3074
- field3: { type: 'Int' },
3075
- },
3076
- },
3077
- },
3078
- },
3079
- },
3080
- ],
3081
- })
3082
-
3083
- await client.request<any>(
3084
- gql`
3085
- mutation createTestClass {
3086
- createTestClass(input: { fields: { field1: { field2: "test", field3: 1 } } }) {
3087
- testClass {
3088
- field1 {
3089
- field2
3090
- }
3091
- }
3092
- }
3093
- }
3094
- `,
3095
- {},
3096
- )
3097
-
3098
- const request = await client.request<any>(
3099
- gql`
3100
- query testClasses($field1WhereInput: TestClassSubObjectWhereInput) {
3101
- testClasses(where: { field1: $field1WhereInput }) {
3102
- edges {
3103
- node {
3104
- field1 {
3105
- field2
3106
- field3
3107
- }
3108
- }
3109
- }
3110
- }
3111
- }
3112
- `,
3113
- {
3114
- field1WhereInput: {
3115
- field2: { equalTo: 'test' },
3116
- },
3117
- },
3118
- )
3119
-
3120
- expect(request.testClasses.edges[0].node.field1.field2).toBe('test')
3121
- expect(request.testClasses.edges[0].node.field1.field3).toBe(1)
3122
-
3123
- await wabe.close()
3124
- })
3125
-
3126
- it('should create an object with a pointer (createAndLink)', async () => {
3127
- const { client, wabe } = await createWabe({
3128
- classes: [
3129
- {
3130
- name: 'TestClass',
3131
- fields: {
3132
- field1: {
3133
- type: 'String',
3134
- },
3135
- },
3136
- },
3137
- {
3138
- name: 'TestClass2',
3139
- fields: {
3140
- name: {
3141
- type: 'String',
3142
- },
3143
- field2: {
3144
- type: 'Pointer',
3145
- // @ts-expect-error
3146
- class: 'TestClass',
3147
- },
3148
- },
3149
- },
3150
- ],
3151
- })
3152
-
3153
- const res = await client.request<any>(
3154
- gql`
3155
- mutation createTestClass {
3156
- createTestClass2(
3157
- input: { fields: { name: "name", field2: { createAndLink: { field1: "field1" } } } }
3158
- ) {
3159
- testClass2 {
3160
- name
3161
- field2 {
3162
- field1
3163
- }
3164
- }
3165
- }
3166
- }
3167
- `,
3168
- {},
3169
- )
3170
-
3171
- expect(res.createTestClass2.testClass2.name).toBe('name')
3172
- expect(res.createTestClass2.testClass2.field2.field1).toBe('field1')
3173
-
3174
- await wabe.close()
3175
- })
3176
-
3177
- it('should link an object to a pointer', async () => {
3178
- const { client, wabe } = await createWabe({
3179
- classes: [
3180
- {
3181
- name: 'TestClass',
3182
- fields: {
3183
- field1: {
3184
- type: 'String',
3185
- },
3186
- },
3187
- },
3188
- {
3189
- name: 'TestClass2',
3190
- fields: {
3191
- name: {
3192
- type: 'String',
3193
- },
3194
- field2: {
3195
- type: 'Pointer',
3196
- // @ts-expect-error
3197
- class: 'TestClass',
3198
- },
3199
- },
3200
- },
3201
- ],
3202
- })
3203
-
3204
- const {
3205
- createTestClass: {
3206
- testClass: { id: idOfTestClass },
3207
- },
3208
- } = await client.request<any>(
3209
- gql`
3210
- mutation createTestClass {
3211
- createTestClass(input: { fields: { field1: "field1" } }) {
3212
- testClass {
3213
- id
3214
- }
3215
- }
3216
- }
3217
- `,
3218
- {},
3219
- )
3220
-
3221
- const res = await client.request<any>(
3222
- gql`
3223
- mutation createTestClass {
3224
- createTestClass2(
3225
- input: {
3226
- fields: {
3227
- name: "name"
3228
- field2: {
3229
- link: "${idOfTestClass}"
3230
- }
3231
- }
3232
- }
3233
- ) {
3234
- testClass2 {
3235
- name
3236
- field2 {
3237
- field1
3238
- }
3239
- }
3240
- }
3241
- }
3242
- `,
3243
- {},
3244
- )
3245
-
3246
- expect(res.createTestClass2.testClass2.name).toBe('name')
3247
- expect(res.createTestClass2.testClass2.field2.field1).toBe('field1')
3248
-
3249
- await wabe.close()
3250
- })
3251
-
3252
- it('should link a pointer on create multiple object', async () => {
3253
- const { client, wabe } = await createWabe({
3254
- classes: [
3255
- {
3256
- name: 'TestClass',
3257
- fields: {
3258
- field1: {
3259
- type: 'String',
3260
- },
3261
- },
3262
- },
3263
- {
3264
- name: 'TestClass2',
3265
- fields: {
3266
- name: {
3267
- type: 'String',
3268
- },
3269
- field2: {
3270
- type: 'Pointer',
3271
- // @ts-expect-error
3272
- class: 'TestClass',
3273
- },
3274
- },
3275
- },
3276
- ],
3277
- })
3278
-
3279
- const res = await client.request<any>(
3280
- gql`
3281
- mutation createTestClass2s {
3282
- createTestClass2s(
3283
- input: { fields: [{ name: "name", field2: { createAndLink: { field1: "field1" } } }] }
3284
- ) {
3285
- edges {
3286
- node {
3287
- name
3288
- field2 {
3289
- field1
3290
- }
3291
- }
3292
- }
3293
- }
3294
- }
3295
- `,
3296
- {},
3297
- )
3298
-
3299
- expect(res.createTestClass2s.edges[0].node.name).toBe('name')
3300
- expect(res.createTestClass2s.edges[0].node.field2.field1).toBe('field1')
3301
-
3302
- await wabe.close()
3303
- })
3304
-
3305
- it('should filter an object (on query) with pointer field', async () => {
3306
- const { client, wabe } = await createWabe({
3307
- classes: [
3308
- {
3309
- name: 'TestClass',
3310
- fields: {
3311
- field1: {
3312
- type: 'String',
3313
- },
3314
- },
3315
- },
3316
- {
3317
- name: 'TestClass2',
3318
- fields: {
3319
- name: {
3320
- type: 'String',
3321
- },
3322
- field2: {
3323
- type: 'Pointer',
3324
- // @ts-expect-error
3325
- class: 'TestClass',
3326
- },
3327
- },
3328
- },
3329
- ],
3330
- })
3331
-
3332
- const res = await client.request<any>(
3333
- gql`
3334
- mutation createTestClass {
3335
- createTestClass2(
3336
- input: { fields: { name: "name", field2: { createAndLink: { field1: "field1" } } } }
3337
- ) {
3338
- testClass2 {
3339
- name
3340
- field2 {
3341
- field1
3342
- }
3343
- }
3344
- }
3345
- }
3346
- `,
3347
- {},
3348
- )
3349
-
3350
- expect(res.createTestClass2.testClass2.name).toBe('name')
3351
- expect(res.createTestClass2.testClass2.field2.field1).toBe('field1')
3352
-
3353
- const queryRes = await client.request<any>(gql`
3354
- query testClass2s {
3355
- testClass2s(where: { field2: { field1: { equalTo: "field1" } } }) {
3356
- edges {
3357
- node {
3358
- name
3359
- }
3360
- }
3361
- }
3362
- }
3363
- `)
3364
-
3365
- expect(queryRes.testClass2s.edges.length).toBe(1)
3366
- expect(queryRes.testClass2s.edges[0].node.name).toBe('name')
3367
-
3368
- await wabe.close()
3369
- })
3370
-
3371
- it('should filter an object (on updates) with pointer field', async () => {
3372
- const { client, wabe } = await createWabe({
3373
- classes: [
3374
- {
3375
- name: 'TestClass',
3376
- fields: {
3377
- field1: {
3378
- type: 'String',
3379
- },
3380
- },
3381
- },
3382
- {
3383
- name: 'TestClass2',
3384
- fields: {
3385
- name: {
3386
- type: 'String',
3387
- },
3388
- field2: {
3389
- type: 'Pointer',
3390
- // @ts-expect-error
3391
- class: 'TestClass',
3392
- },
3393
- },
3394
- },
3395
- ],
3396
- })
3397
-
3398
- const res = await client.request<any>(
3399
- gql`
3400
- mutation createTestClass {
3401
- createTestClass2(
3402
- input: { fields: { name: "name", field2: { createAndLink: { field1: "field1" } } } }
3403
- ) {
3404
- testClass2 {
3405
- name
3406
- field2 {
3407
- field1
3408
- }
3409
- }
3410
- }
3411
- }
3412
- `,
3413
- {},
3414
- )
3415
-
3416
- expect(res.createTestClass2.testClass2.name).toBe('name')
3417
- expect(res.createTestClass2.testClass2.field2.field1).toBe('field1')
3418
-
3419
- const updateRes = await client.request<any>(gql`
3420
- mutation updateTestClass2s {
3421
- updateTestClass2s(
3422
- input: { fields: { name: "name2" }, where: { field2: { field1: { equalTo: "field1" } } } }
3423
- ) {
3424
- edges {
3425
- node {
3426
- name
3427
- }
3428
- }
3429
- }
3430
- }
3431
- `)
3432
-
3433
- expect(updateRes.updateTestClass2s.edges.length).toBe(1)
3434
- expect(updateRes.updateTestClass2s.edges[0].node.name).toBe('name2')
3435
-
3436
- await wabe.close()
3437
- })
3438
-
3439
- it('should filter an object (on deletes) with pointer field', async () => {
3440
- const { client, wabe } = await createWabe({
3441
- classes: [
3442
- {
3443
- name: 'TestClass',
3444
- fields: {
3445
- field1: {
3446
- type: 'String',
3447
- },
3448
- },
3449
- },
3450
- {
3451
- name: 'TestClass2',
3452
- fields: {
3453
- name: {
3454
- type: 'String',
3455
- },
3456
- field2: {
3457
- type: 'Pointer',
3458
- // @ts-expect-error
3459
- class: 'TestClass',
3460
- },
3461
- },
3462
- },
3463
- ],
3464
- })
3465
-
3466
- const res = await client.request<any>(
3467
- gql`
3468
- mutation createTestClass {
3469
- createTestClass2(
3470
- input: { fields: { name: "name", field2: { createAndLink: { field1: "field1" } } } }
3471
- ) {
3472
- testClass2 {
3473
- name
3474
- field2 {
3475
- field1
3476
- }
3477
- }
3478
- }
3479
- }
3480
- `,
3481
- {},
3482
- )
3483
-
3484
- expect(res.createTestClass2.testClass2.name).toBe('name')
3485
- expect(res.createTestClass2.testClass2.field2.field1).toBe('field1')
3486
-
3487
- const deleteRes = await client.request<any>(gql`
3488
- mutation deleteTestClass2s {
3489
- deleteTestClass2s(input: { where: { field2: { field1: { equalTo: "field1" } } } }) {
3490
- edges {
3491
- node {
3492
- name
3493
- }
3494
- }
3495
- }
3496
- }
3497
- `)
3498
-
3499
- expect(deleteRes.deleteTestClass2s.edges.length).toBe(1)
3500
- expect(deleteRes.deleteTestClass2s.edges[0].node.name).toBe('name')
3501
-
3502
- await wabe.close()
3503
- })
3504
-
3505
- it('should create and link a pointer on update', async () => {
3506
- const { client, wabe } = await createWabe({
3507
- classes: [
3508
- {
3509
- name: 'TestClass',
3510
- fields: {
3511
- field1: {
3512
- type: 'String',
3513
- },
3514
- },
3515
- },
3516
- {
3517
- name: 'TestClass2',
3518
- fields: {
3519
- name: {
3520
- type: 'String',
3521
- },
3522
- field2: {
3523
- type: 'Pointer',
3524
- // @ts-expect-error
3525
- class: 'TestClass',
3526
- },
3527
- },
3528
- },
3529
- ],
3530
- })
3531
-
3532
- const res = await client.request<any>(
3533
- gql`
3534
- mutation createTestClass {
3535
- createTestClass2(
3536
- input: { fields: { name: "name", field2: { createAndLink: { field1: "field1" } } } }
3537
- ) {
3538
- testClass2 {
3539
- id
3540
- name
3541
- field2 {
3542
- field1
3543
- }
3544
- }
3545
- }
3546
- }
3547
- `,
3548
- {},
3549
- )
3550
-
3551
- expect(res.createTestClass2.testClass2.name).toBe('name')
3552
- expect(res.createTestClass2.testClass2.field2.field1).toBe('field1')
3553
-
3554
- const resAfterUpdate = await client.request<any>(gql`
3555
- mutation updateTestClass {
3556
- updateTestClass2(
3557
- input: {
3558
- fields: {
3559
- field2: {
3560
- createAndLink: { field1: "field1AfterUpdate" }
3561
- }
3562
- }
3563
- id: "${res.createTestClass2.testClass2.id}"
3564
- }
3565
- ) {
3566
- testClass2 {
3567
- name
3568
- field2 {
3569
- field1
3570
- }
3571
- }
3572
- }
3573
- }
3574
- `)
3575
-
3576
- expect(resAfterUpdate.updateTestClass2.testClass2.name).toBe('name')
3577
- expect(resAfterUpdate.updateTestClass2.testClass2.field2.field1).toBe('field1AfterUpdate')
3578
-
3579
- await wabe.close()
3580
- })
3581
-
3582
- it('should link a pointer on update', async () => {
3583
- const { client, wabe } = await createWabe({
3584
- classes: [
3585
- {
3586
- name: 'TestClass',
3587
- fields: {
3588
- field1: {
3589
- type: 'String',
3590
- },
3591
- },
3592
- },
3593
- {
3594
- name: 'TestClass2',
3595
- fields: {
3596
- name: {
3597
- type: 'String',
3598
- },
3599
- field2: {
3600
- type: 'Pointer',
3601
- // @ts-expect-error
3602
- class: 'TestClass',
3603
- },
3604
- },
3605
- },
3606
- ],
3607
- })
3608
-
3609
- const {
3610
- createTestClass: {
3611
- testClass: { id: idOfTestClass },
3612
- },
3613
- } = await client.request<any>(
3614
- gql`
3615
- mutation createTestClass {
3616
- createTestClass(input: { fields: { field1: "field1" } }) {
3617
- testClass {
3618
- id
3619
- }
3620
- }
3621
- }
3622
- `,
3623
- {},
3624
- )
3625
-
3626
- const res = await client.request<any>(
3627
- gql`
3628
- mutation createTestClass {
3629
- createTestClass2(input: { fields: { name: "name" } }) {
3630
- testClass2 {
3631
- id
3632
- name
3633
- }
3634
- }
3635
- }
3636
- `,
3637
- {},
3638
- )
3639
-
3640
- const resAfterUpdate = await client.request<any>(
3641
- gql`
3642
- mutation updateTestClass {
3643
- updateTestClass2(input: {
3644
- id: "${res.createTestClass2.testClass2.id}"
3645
- fields: {
3646
- field2: { link: "${idOfTestClass}" }
3647
- }
3648
- }){
3649
- testClass2 {
3650
- name
3651
- field2{
3652
- field1
3653
- }
3654
- }
3655
- }
3656
- }
3657
- `,
3658
- {},
3659
- )
3660
-
3661
- expect(resAfterUpdate.updateTestClass2.testClass2.name).toBe('name')
3662
- expect(resAfterUpdate.updateTestClass2.testClass2.field2.field1).toBe('field1')
3663
-
3664
- await wabe.close()
3665
- })
3666
-
3667
- it('should unlink a pointer on update', async () => {
3668
- const { client, wabe } = await createWabe({
3669
- classes: [
3670
- {
3671
- name: 'TestClass',
3672
- fields: {
3673
- field1: {
3674
- type: 'String',
3675
- },
3676
- },
3677
- },
3678
- {
3679
- name: 'TestClass2',
3680
- fields: {
3681
- name: {
3682
- type: 'String',
3683
- },
3684
- field2: {
3685
- type: 'Pointer',
3686
- // @ts-expect-error
3687
- class: 'TestClass',
3688
- },
3689
- },
3690
- },
3691
- ],
3692
- })
3693
-
3694
- const {
3695
- createTestClass: {
3696
- testClass: { id: idOfTestClass },
3697
- },
3698
- } = await client.request<any>(
3699
- gql`
3700
- mutation createTestClass {
3701
- createTestClass(input: { fields: { field1: "field1" } }) {
3702
- testClass {
3703
- id
3704
- }
3705
- }
3706
- }
3707
- `,
3708
- {},
3709
- )
3710
-
3711
- const res = await client.request<any>(
3712
- gql`
3713
- mutation createTestClass {
3714
- createTestClass2(input: { fields: { name: "name", field2: { link : "${idOfTestClass}"} }}) {
3715
- testClass2 {
3716
- id
3717
- name
3718
- field2 {
3719
- field1
3720
- }
3721
- }
3722
- }
3723
- }
3724
- `,
3725
- {},
3726
- )
3727
-
3728
- expect(res.createTestClass2.testClass2.field2.field1).toBe('field1')
3729
-
3730
- const res2 = await client.request<any>(
3731
- gql`
3732
- mutation updateTestClass2 {
3733
- updateTestClass2(input: {
3734
- id: "${res.createTestClass2.testClass2.id}"
3735
- fields: {
3736
- field2: { unlink: true }
3737
- }
3738
- }){
3739
- testClass2 {
3740
- name
3741
- field2{
3742
- field1
3743
- }
3744
- }
3745
- }
3746
- }
3747
- `,
3748
- {},
3749
- )
3750
-
3751
- expect(res2.updateTestClass2.testClass2.field2).toBeNull()
3752
-
3753
- await wabe.close()
3754
- })
3755
-
3756
- it('should link a pointer on update multiple object', async () => {
3757
- const { client, wabe } = await createWabe({
3758
- classes: [
3759
- {
3760
- name: 'TestClass',
3761
- fields: {
3762
- field1: {
3763
- type: 'String',
3764
- },
3765
- },
3766
- },
3767
- {
3768
- name: 'TestClass2',
3769
- fields: {
3770
- name: {
3771
- type: 'String',
3772
- },
3773
- field2: {
3774
- type: 'Pointer',
3775
- // @ts-expect-error
3776
- class: 'TestClass',
3777
- },
3778
- },
3779
- },
3780
- ],
3781
- })
3782
-
3783
- await client.request<any>(
3784
- gql`
3785
- mutation createTestClass2s {
3786
- createTestClass2s(input: { fields: [{ name: "name" }, { name: "name2" }] }) {
3787
- edges {
3788
- node {
3789
- name
3790
- }
3791
- }
3792
- }
3793
- }
3794
- `,
3795
- {},
3796
- )
3797
-
3798
- const resAfterUpdate = await client.request<any>(
3799
- gql`
3800
- mutation updateTestClass2s {
3801
- updateTestClass2s(
3802
- input: {
3803
- where: { name: { equalTo: "name" } }
3804
- fields: { field2: { createAndLink: { field1: "field1UpdateMultiple" } } }
3805
- }
3806
- ) {
3807
- edges {
3808
- node {
3809
- name
3810
- field2 {
3811
- field1
3812
- }
3813
- }
3814
- }
3815
- }
3816
- }
3817
- `,
3818
- {},
3819
- )
3820
-
3821
- expect(resAfterUpdate.updateTestClass2s.edges[0].node.name).toBe('name')
3822
- expect(resAfterUpdate.updateTestClass2s.edges[0].node.field2.field1).toBe(
3823
- 'field1UpdateMultiple',
3824
- )
3825
-
3826
- await wabe.close()
3827
- })
3828
-
3829
- it('should return pointer data on delete an element', async () => {
3830
- const { client, wabe } = await createWabe({
3831
- classes: [
3832
- {
3833
- name: 'TestClass',
3834
- fields: {
3835
- field1: {
3836
- type: 'String',
3837
- },
3838
- },
3839
- },
3840
- {
3841
- name: 'TestClass2',
3842
- fields: {
3843
- name: {
3844
- type: 'String',
3845
- },
3846
- field2: {
3847
- type: 'Pointer',
3848
- // @ts-expect-error
3849
- class: 'TestClass',
3850
- },
3851
- },
3852
- },
3853
- ],
3854
- })
3855
-
3856
- const res = await client.request<any>(
3857
- gql`
3858
- mutation createTestClass {
3859
- createTestClass2(
3860
- input: { fields: { name: "name", field2: { createAndLink: { field1: "field1" } } } }
3861
- ) {
3862
- testClass2 {
3863
- id
3864
- name
3865
- field2 {
3866
- field1
3867
- }
3868
- }
3869
- }
3870
- }
3871
- `,
3872
- {},
3873
- )
3874
-
3875
- expect(res.createTestClass2.testClass2.name).toBe('name')
3876
- expect(res.createTestClass2.testClass2.field2.field1).toBe('field1')
3877
-
3878
- const resAfterDelete = await client.request<any>(gql`
3879
- mutation deleteTestClass2 {
3880
- deleteTestClass2(input: {id: "${res.createTestClass2.testClass2.id}"}) {
3881
- testClass2 {
3882
- name
3883
- field2 {
3884
- field1
3885
- }
3886
- }
3887
- }
3888
- }
3889
- `)
3890
-
3891
- expect(resAfterDelete.deleteTestClass2.testClass2.name).toBe('name')
3892
- expect(resAfterDelete.deleteTestClass2.testClass2.field2.field1).toBe('field1')
3893
-
3894
- await wabe.close()
3895
- })
3896
-
3897
- it('should createAndAdd an object on a relation field (on create)', async () => {
3898
- const { client, wabe } = await createWabe({
3899
- classes: [
3900
- {
3901
- name: 'TestClass',
3902
- fields: {
3903
- field1: {
3904
- type: 'String',
3905
- },
3906
- },
3907
- },
3908
- {
3909
- name: 'TestClass2',
3910
- fields: {
3911
- name: {
3912
- type: 'String',
3913
- },
3914
- field2: {
3915
- type: 'Relation',
3916
- // @ts-expect-error
3917
- class: 'TestClass',
3918
- },
3919
- },
3920
- },
3921
- ],
3922
- })
3923
-
3924
- const res = await client.request<any>(gql`
3925
- mutation createTestClass2 {
3926
- createTestClass2(
3927
- input: {
3928
- fields: {
3929
- name: "name"
3930
- field2: { createAndAdd: [{ field1: "field1" }, { field1: "field2" }] }
3931
- }
3932
- }
3933
- ) {
3934
- testClass2 {
3935
- name
3936
- field2 {
3937
- edges {
3938
- node {
3939
- field1
3940
- }
3941
- }
3942
- }
3943
- }
3944
- }
3945
- }
3946
- `)
3947
-
3948
- const field2AfterUpdate1 = (await wabe.controllers.database.getObjects({
3949
- // @ts-expect-error
3950
- className: 'TestClass2',
3951
- context: {
3952
- wabe,
3953
- isRoot: true,
3954
- },
3955
- })) as any
3956
-
3957
- expect(field2AfterUpdate1[0]?.field2.length).toBe(2)
3958
-
3959
- expect(res.createTestClass2.testClass2.name).toBe('name')
3960
- expect(res.createTestClass2.testClass2.field2.edges[0].node.field1).toBe('field1')
3961
-
3962
- await wabe.close()
3963
- })
3964
-
3965
- it('should add an object on a relation field (on create)', async () => {
3966
- const { client, wabe } = await createWabe({
3967
- classes: [
3968
- {
3969
- name: 'TestClass',
3970
- fields: {
3971
- field1: {
3972
- type: 'String',
3973
- },
3974
- },
3975
- },
3976
- {
3977
- name: 'TestClass2',
3978
- fields: {
3979
- name: {
3980
- type: 'String',
3981
- },
3982
- field2: {
3983
- type: 'Relation',
3984
- // @ts-expect-error
3985
- class: 'TestClass',
3986
- },
3987
- },
3988
- },
3989
- ],
3990
- })
3991
-
3992
- const res = await client.request<any>(gql`
3993
- mutation createTestClass {
3994
- createTestClass(input: { fields: { field1: "field1" } }) {
3995
- testClass {
3996
- id
3997
- }
3998
- }
3999
- }
4000
- `)
4001
-
4002
- const resAfterAdd = await client.request<any>(gql`
4003
- mutation createTestClass2 {
4004
- createTestClass2(
4005
- input: {
4006
- fields: {
4007
- name: "name"
4008
- field2: { add: ["${res.createTestClass.testClass.id}"] }
4009
- }
4010
- }
4011
- ) {
4012
- testClass2 {
4013
- name
4014
- field2 {
4015
- edges {
4016
- node {
4017
- field1
4018
- }
4019
- }
4020
- }
4021
- }
4022
- }
4023
- }
4024
- `)
4025
-
4026
- expect(resAfterAdd.createTestClass2.testClass2.name).toBe('name')
4027
- expect(resAfterAdd.createTestClass2.testClass2.field2.edges[0].node.field1).toBe('field1')
4028
-
4029
- await wabe.close()
4030
- })
4031
-
4032
- it('should createAndAdd an object on a relation field (on createMany)', async () => {
4033
- const { client, wabe } = await createWabe({
4034
- classes: [
4035
- {
4036
- name: 'TestClass',
4037
- fields: {
4038
- field1: {
4039
- type: 'String',
4040
- },
4041
- },
4042
- },
4043
- {
4044
- name: 'TestClass2',
4045
- fields: {
4046
- name: {
4047
- type: 'String',
4048
- },
4049
- field2: {
4050
- type: 'Relation',
4051
- // @ts-expect-error
4052
- class: 'TestClass',
4053
- },
4054
- },
4055
- },
4056
- ],
4057
- })
4058
-
4059
- const res = await client.request<any>(gql`
4060
- mutation createTestClass2s {
4061
- createTestClass2s(
4062
- input: { fields: [{ name: "name", field2: { createAndAdd: [{ field1: "field1" }] } }] }
4063
- ) {
4064
- edges {
4065
- node {
4066
- name
4067
- field2 {
4068
- edges {
4069
- node {
4070
- field1
4071
- }
4072
- }
4073
- }
4074
- }
4075
- }
4076
- }
4077
- }
4078
- `)
4079
-
4080
- expect(res.createTestClass2s.edges[0].node.name).toBe('name')
4081
- expect(res.createTestClass2s.edges[0].node.field2.edges[0].node.field1).toBe('field1')
4082
-
4083
- await wabe.close()
4084
- })
4085
-
4086
- it('should add an object on a relation field (on createMany)', async () => {
4087
- const { client, wabe } = await createWabe({
4088
- classes: [
4089
- {
4090
- name: 'TestClass',
4091
- fields: {
4092
- field1: {
4093
- type: 'String',
4094
- },
4095
- },
4096
- },
4097
- {
4098
- name: 'TestClass2',
4099
- fields: {
4100
- name: {
4101
- type: 'String',
4102
- },
4103
- field2: {
4104
- type: 'Relation',
4105
- // @ts-expect-error
4106
- class: 'TestClass',
4107
- },
4108
- },
4109
- },
4110
- ],
4111
- })
4112
-
4113
- const res = await client.request<any>(gql`
4114
- mutation createTestClass {
4115
- createTestClass(input: { fields: { field1: "field1" } }) {
4116
- testClass {
4117
- id
4118
- }
4119
- }
4120
- }
4121
- `)
4122
-
4123
- const resAfterAdd = await client.request<any>(gql`
4124
- mutation createTestClass2s {
4125
- createTestClass2s(
4126
- input: {
4127
- fields: [
4128
- {
4129
- name: "name"
4130
- field2: { add: ["${res.createTestClass.testClass.id}"] }
4131
- }
4132
- ]
4133
- }
4134
- ) {
4135
- edges {
4136
- node {
4137
- name
4138
- field2 {
4139
- edges {
4140
- node {
4141
- field1
4142
- }
4143
- }
4144
- }
4145
- }
4146
- }
4147
- }
4148
- }
4149
- `)
4150
-
4151
- expect(resAfterAdd.createTestClass2s.edges[0].node.name).toBe('name')
4152
- expect(resAfterAdd.createTestClass2s.edges[0].node.field2.edges[0].node.field1).toBe('field1')
4153
-
4154
- await wabe.close()
4155
- })
4156
-
4157
- it('should createAndAdd an object on a relation field (on update)', async () => {
4158
- const { client, wabe } = await createWabe({
4159
- classes: [
4160
- {
4161
- name: 'TestClass',
4162
- fields: {
4163
- field1: {
4164
- type: 'String',
4165
- },
4166
- },
4167
- },
4168
- {
4169
- name: 'TestClass2',
4170
- fields: {
4171
- name: {
4172
- type: 'String',
4173
- },
4174
- field2: {
4175
- type: 'Relation',
4176
- // @ts-expect-error
4177
- class: 'TestClass',
4178
- },
4179
- },
4180
- },
4181
- ],
4182
- })
4183
-
4184
- const resAfterAdd = await client.request<any>(gql`
4185
- mutation createTestClass2 {
4186
- createTestClass2(input: { fields: { name: "name" } }) {
4187
- testClass2 {
4188
- id
4189
- name
4190
- }
4191
- }
4192
- }
4193
- `)
4194
-
4195
- const resAfterUpdate = await client.request<any>(gql`
4196
- mutation updateTestClass2 {
4197
- updateTestClass2(
4198
- input: {
4199
- id: "${resAfterAdd.createTestClass2.testClass2.id}"
4200
- fields: {
4201
- field2: { createAndAdd: [{ field1: "field1" }] }
4202
- }
4203
- }
4204
- ) {
4205
- testClass2 {
4206
- id
4207
- name
4208
- field2 {
4209
- edges {
4210
- node {
4211
- field1
4212
- }
4213
- }
4214
- }
4215
- }
4216
- }
4217
- }
4218
- `)
4219
-
4220
- expect(resAfterUpdate.updateTestClass2.testClass2.name).toBe('name')
4221
- expect(resAfterUpdate.updateTestClass2.testClass2.field2.edges[0].node.field1).toBe('field1')
4222
-
4223
- await wabe.close()
4224
- })
4225
-
4226
- it('should add an object on a relation field (on update)', async () => {
4227
- const { client, wabe } = await createWabe({
4228
- classes: [
4229
- {
4230
- name: 'TestClass',
4231
- fields: {
4232
- field1: {
4233
- type: 'String',
4234
- },
4235
- },
4236
- },
4237
- {
4238
- name: 'TestClass2',
4239
- fields: {
4240
- name: {
4241
- type: 'String',
4242
- },
4243
- field2: {
4244
- type: 'Relation',
4245
- // @ts-expect-error
4246
- class: 'TestClass',
4247
- },
4248
- },
4249
- },
4250
- ],
4251
- })
4252
-
4253
- const res = await client.request<any>(gql`
4254
- mutation createTestClass {
4255
- createTestClass(input: { fields: { field1: "field1" } }) {
4256
- testClass {
4257
- id
4258
- }
4259
- }
4260
- }
4261
- `)
4262
-
4263
- const res2 = await client.request<any>(gql`
4264
- mutation createTestClass {
4265
- createTestClass(input: { fields: { field1: "field1" } }) {
4266
- testClass {
4267
- id
4268
- }
4269
- }
4270
- }
4271
- `)
4272
-
4273
- const resAfterAdd = await client.request<any>(gql`
4274
- mutation createTestClass2 {
4275
- createTestClass2(input: { fields: { name: "name" } }) {
4276
- testClass2 {
4277
- id
4278
- name
4279
- }
4280
- }
4281
- }
4282
- `)
4283
-
4284
- await client.request<any>(gql`
4285
- mutation updateTestClass2 {
4286
- updateTestClass2(
4287
- input: {
4288
- id: "${resAfterAdd.createTestClass2.testClass2.id}"
4289
- fields: {
4290
- field2: { add: ["${res.createTestClass.testClass.id}"] }
4291
- }
4292
- }
4293
- ) {
4294
- testClass2 {
4295
- id
4296
- name
4297
- field2 {
4298
- edges {
4299
- node {
4300
- field1
4301
- }
4302
- }
4303
- }
4304
- }
4305
- }
4306
- }
4307
- `)
4308
-
4309
- const field2AfterUpdate1 = (await wabe.controllers.database.getObjects({
4310
- // @ts-expect-error
4311
- className: 'TestClass2',
4312
- context: {
4313
- wabe,
4314
- isRoot: true,
4315
- },
4316
- })) as any
4317
-
4318
- expect(field2AfterUpdate1[0]?.field2.length).toBe(1)
4319
-
4320
- const resAfterUpdate2 = await client.request<any>(gql`
4321
- mutation updateTestClass2 {
4322
- updateTestClass2(
4323
- input: {
4324
- id: "${resAfterAdd.createTestClass2.testClass2.id}"
4325
- fields: {
4326
- field2: { add: ["${res2.createTestClass.testClass.id}"] }
4327
- }
4328
- }
4329
- ) {
4330
- testClass2 {
4331
- id
4332
- name
4333
- field2 {
4334
- edges {
4335
- node {
4336
- field1
4337
- }
4338
- }
4339
- }
4340
- }
4341
- }
4342
- }
4343
- `)
4344
-
4345
- const field2AfterUpdate2 = (await wabe.controllers.database.getObjects({
4346
- // @ts-expect-error
4347
- className: 'TestClass2',
4348
- context: {
4349
- wabe,
4350
- isRoot: true,
4351
- },
4352
- // @ts-expect-error
4353
- select: { field2: true },
4354
- })) as any
4355
-
4356
- expect(field2AfterUpdate2[0].field2).toEqual([
4357
- { id: res.createTestClass.testClass.id },
4358
- { id: res2.createTestClass.testClass.id },
4359
- ])
4360
- expect(field2AfterUpdate2[0]?.field2.length).toBe(2)
4361
-
4362
- expect(resAfterUpdate2.updateTestClass2.testClass2.name).toBe('name')
4363
- expect(resAfterUpdate2.updateTestClass2.testClass2.field2.edges.length).toBe(2)
4364
- expect(resAfterUpdate2.updateTestClass2.testClass2.field2.edges[0].node.field1).toBe('field1')
4365
-
4366
- await wabe.close()
4367
- })
4368
-
4369
- it('should remove an object on a relation field (on update)', async () => {
4370
- const { client, wabe } = await createWabe({
4371
- classes: [
4372
- {
4373
- name: 'TestClass',
4374
- fields: {
4375
- field1: {
4376
- type: 'String',
4377
- },
4378
- },
4379
- },
4380
- {
4381
- name: 'TestClass2',
4382
- fields: {
4383
- name: {
4384
- type: 'String',
4385
- },
4386
- field2: {
4387
- type: 'Relation',
4388
- // @ts-expect-error
4389
- class: 'TestClass',
4390
- },
4391
- },
4392
- },
4393
- ],
4394
- })
4395
-
4396
- const resAfterAdd = await client.request<any>(gql`
4397
- mutation createTestClass2 {
4398
- createTestClass2(
4399
- input: { fields: { name: "name", field2: { createAndAdd: [{ field1: "field1" }] } } }
4400
- ) {
4401
- testClass2 {
4402
- id
4403
- name
4404
- field2 {
4405
- edges {
4406
- node {
4407
- id
4408
- field1
4409
- }
4410
- }
4411
- }
4412
- }
4413
- }
4414
- }
4415
- `)
4416
-
4417
- const resAfterUpdate = await client.request<any>(gql`
4418
- mutation updateTestClass2 {
4419
- updateTestClass2(
4420
- input: {
4421
- id: "${resAfterAdd.createTestClass2.testClass2.id}"
4422
- fields: {
4423
- field2: { remove: ["${resAfterAdd.createTestClass2.testClass2.field2.edges[0].node.id}"] }
4424
- }
4425
- }
4426
- ) {
4427
- testClass2 {
4428
- id
4429
- name
4430
- field2 {
4431
- edges {
4432
- node {
4433
- id
4434
- }
4435
- }
4436
- }
4437
- }
4438
- }
4439
- }
4440
- `)
4441
-
4442
- expect(resAfterUpdate.updateTestClass2.testClass2.name).toBe('name')
4443
- expect(resAfterUpdate.updateTestClass2.testClass2.field2.edges.length).toEqual(0)
4444
-
4445
- await wabe.close()
4446
- })
4447
-
4448
- it('should createAndAdd an object on a relation field (on updateMany)', async () => {
4449
- const { client, wabe } = await createWabe({
4450
- classes: [
4451
- {
4452
- name: 'TestClass',
4453
- fields: {
4454
- field1: {
4455
- type: 'String',
4456
- },
4457
- },
4458
- },
4459
- {
4460
- name: 'TestClass2',
4461
- fields: {
4462
- name: {
4463
- type: 'String',
4464
- },
4465
- field2: {
4466
- type: 'Relation',
4467
- // @ts-expect-error
4468
- class: 'TestClass',
4469
- },
4470
- },
4471
- },
4472
- ],
4473
- })
4474
-
4475
- const resAfterAdd = await client.request<any>(gql`
4476
- mutation createTestClass2 {
4477
- createTestClass2(input: { fields: { name: "name" } }) {
4478
- testClass2 {
4479
- id
4480
- name
4481
- }
4482
- }
4483
- }
4484
- `)
4485
-
4486
- const resAfterUpdate = await client.request<any>(gql`
4487
- mutation updateTestClass2s {
4488
- updateTestClass2s(
4489
- input: {
4490
- where: {id: {equalTo: "${resAfterAdd.createTestClass2.testClass2.id}"}}
4491
- fields: {
4492
- field2: { createAndAdd: [{ field1: "field1" }] }
4493
- }
4494
- }
4495
- ) {
4496
- edges {
4497
- node {
4498
- id
4499
- name
4500
- field2 {
4501
- edges {
4502
- node {
4503
- field1
4504
- }
4505
- }
4506
- }
4507
- }
4508
- }
4509
- }
4510
- }
4511
- `)
4512
-
4513
- expect(resAfterUpdate.updateTestClass2s.edges[0].node.name).toBe('name')
4514
- expect(resAfterUpdate.updateTestClass2s.edges[0].node.field2.edges[0].node.field1).toBe(
4515
- 'field1',
4516
- )
4517
-
4518
- await wabe.close()
4519
- })
4520
-
4521
- it('should add an object on a relation field (on updateMany)', async () => {
4522
- const { client, wabe } = await createWabe({
4523
- classes: [
4524
- {
4525
- name: 'TestClass',
4526
- fields: {
4527
- field1: {
4528
- type: 'String',
4529
- },
4530
- },
4531
- },
4532
- {
4533
- name: 'TestClass2',
4534
- fields: {
4535
- name: {
4536
- type: 'String',
4537
- },
4538
- field2: {
4539
- type: 'Relation',
4540
- // @ts-expect-error
4541
- class: 'TestClass',
4542
- },
4543
- },
4544
- },
4545
- ],
4546
- })
4547
-
4548
- const res = await client.request<any>(gql`
4549
- mutation createTestClass {
4550
- createTestClass(input: { fields: { field1: "field1" } }) {
4551
- testClass {
4552
- id
4553
- }
4554
- }
4555
- }
4556
- `)
4557
-
4558
- const res2 = await client.request<any>(gql`
4559
- mutation createTestClass {
4560
- createTestClass(input: { fields: { field1: "field1" } }) {
4561
- testClass {
4562
- id
4563
- }
4564
- }
4565
- }
4566
- `)
4567
-
4568
- const resAfterAdd = await client.request<any>(gql`
4569
- mutation createTestClass2 {
4570
- createTestClass2(input: { fields: { name: "name" } }) {
4571
- testClass2 {
4572
- id
4573
- name
4574
- }
4575
- }
4576
- }
4577
- `)
4578
-
4579
- await client.request<any>(gql`
4580
- mutation updateTestClass2s {
4581
- updateTestClass2s(
4582
- input: {
4583
- where: {id: {equalTo: "${resAfterAdd.createTestClass2.testClass2.id}"}}
4584
- fields: {
4585
- field2: { add: ["${res.createTestClass.testClass.id}"] }
4586
- }
4587
- }
4588
- ) {
4589
- edges {
4590
- node {
4591
- id
4592
- name
4593
- field2 {
4594
- edges {
4595
- node {
4596
- field1
4597
- }
4598
- }
4599
- }
4600
- }
4601
- }
4602
- }
4603
- }
4604
- `)
4605
-
4606
- const resAfterUpdate = await client.request<any>(gql`
4607
- mutation updateTestClass2s {
4608
- updateTestClass2s(
4609
- input: {
4610
- where: {id: {equalTo: "${resAfterAdd.createTestClass2.testClass2.id}"}}
4611
- fields: {
4612
- field2: { add: ["${res2.createTestClass.testClass.id}"] }
4613
- }
4614
- }
4615
- ) {
4616
- edges {
4617
- node {
4618
- id
4619
- name
4620
- field2 {
4621
- edges {
4622
- node {
4623
- field1
4624
- }
4625
- }
4626
- }
4627
- }
4628
- }
4629
- }
4630
- }
4631
- `)
4632
-
4633
- const field2AfterUpdate2 = (await wabe.controllers.database.getObjects({
4634
- // @ts-expect-error
4635
- className: 'TestClass2',
4636
- context: {
4637
- wabe,
4638
- isRoot: true,
4639
- },
4640
- // @ts-expect-error
4641
- select: { field2: true },
4642
- })) as any
4643
-
4644
- expect(field2AfterUpdate2[0]?.field2.length).toBe(2)
4645
- expect(field2AfterUpdate2[0]?.field2).toEqual([
4646
- { id: res.createTestClass.testClass.id },
4647
- { id: res2.createTestClass.testClass.id },
4648
- ])
4649
-
4650
- expect(resAfterUpdate.updateTestClass2s.edges[0].node.name).toBe('name')
4651
- expect(resAfterUpdate.updateTestClass2s.edges[0].node.field2.edges[0].node.field1).toBe(
4652
- 'field1',
4653
- )
4654
-
4655
- await wabe.close()
4656
- })
4657
-
4658
- it('should remove an object on a relation field (on updateMany)', async () => {
4659
- const { client, wabe } = await createWabe({
4660
- classes: [
4661
- {
4662
- name: 'TestClass',
4663
- fields: {
4664
- field1: {
4665
- type: 'String',
4666
- },
4667
- },
4668
- },
4669
- {
4670
- name: 'TestClass2',
4671
- fields: {
4672
- name: {
4673
- type: 'String',
4674
- },
4675
- field2: {
4676
- type: 'Relation',
4677
- // @ts-expect-error
4678
- class: 'TestClass',
4679
- },
4680
- },
4681
- },
4682
- ],
4683
- })
4684
-
4685
- const resAfterAdd = await client.request<any>(gql`
4686
- mutation createTestClass2 {
4687
- createTestClass2(
4688
- input: { fields: { name: "name", field2: { createAndAdd: [{ field1: "field1" }] } } }
4689
- ) {
4690
- testClass2 {
4691
- id
4692
- name
4693
- field2 {
4694
- edges {
4695
- node {
4696
- id
4697
- field1
4698
- }
4699
- }
4700
- }
4701
- }
4702
- }
4703
- }
4704
- `)
4705
-
4706
- const field2BeforeUpdate2 = (await wabe.controllers.database.getObjects({
4707
- // @ts-expect-error
4708
- className: 'TestClass2',
4709
- context: {
4710
- wabe,
4711
- isRoot: true,
4712
- },
4713
- // @ts-expect-error
4714
- select: { field2: true },
4715
- })) as any
4716
-
4717
- expect(field2BeforeUpdate2[0]?.field2).toEqual([
4718
- {
4719
- id: resAfterAdd.createTestClass2.testClass2.field2.edges[0].node.id,
4720
- },
4721
- ])
4722
-
4723
- const resAfterUpdate = await client.request<any>(gql`
4724
- mutation updateTestClass2s {
4725
- updateTestClass2s(
4726
- input: {
4727
- where: {id: {equalTo: "${resAfterAdd.createTestClass2.testClass2.id}"}}
4728
- fields: {
4729
- field2: { remove: ["${resAfterAdd.createTestClass2.testClass2.field2.edges[0].node.id}"] }
4730
- }
4731
- }
4732
- ) {
4733
- edges {
4734
- node {
4735
- id
4736
- name
4737
- field2 {
4738
- edges {
4739
- node {
4740
- field1
4741
- }
4742
- }
4743
- }
4744
- }
4745
- }
4746
- }
4747
- }
4748
- `)
4749
-
4750
- const field2AfterUpdate2 = (await wabe.controllers.database.getObjects({
4751
- // @ts-expect-error
4752
- className: 'TestClass2',
4753
- context: {
4754
- wabe,
4755
- isRoot: true,
4756
- },
4757
- })) as any
4758
-
4759
- expect(field2AfterUpdate2[0]?.field2).toEqual([])
4760
-
4761
- expect(resAfterUpdate.updateTestClass2s.edges[0].node.name).toBe('name')
4762
- expect(resAfterUpdate.updateTestClass2s.edges[0].node.field2.edges.length).toBe(0)
4763
-
4764
- const resAfterRemove = await client.request<any>(gql`
4765
- query testClasses {
4766
- testClasses {
4767
- edges {
4768
- node {
4769
- field1
4770
- }
4771
- }
4772
- }
4773
- }
4774
- `)
4775
-
4776
- expect(resAfterRemove.testClasses.edges.length).toBe(0)
4777
-
4778
- await wabe.close()
4779
- })
4780
-
4781
- it('should remove an object on a relation field (on update)', async () => {
4782
- const { client, wabe } = await createWabe({
4783
- classes: [
4784
- {
4785
- name: 'TestClass',
4786
- fields: {
4787
- field1: {
4788
- type: 'String',
4789
- },
4790
- },
4791
- },
4792
- {
4793
- name: 'TestClass2',
4794
- fields: {
4795
- name: {
4796
- type: 'String',
4797
- },
4798
- field2: {
4799
- type: 'Relation',
4800
- // @ts-expect-error
4801
- class: 'TestClass',
4802
- },
4803
- },
4804
- },
4805
- ],
4806
- })
4807
-
4808
- const resAfterAdd = await client.request<any>(gql`
4809
- mutation createTestClass2 {
4810
- createTestClass2(
4811
- input: { fields: { name: "name", field2: { createAndAdd: [{ field1: "field1" }] } } }
4812
- ) {
4813
- testClass2 {
4814
- id
4815
- name
4816
- field2 {
4817
- edges {
4818
- node {
4819
- id
4820
- field1
4821
- }
4822
- }
4823
- }
4824
- }
4825
- }
4826
- }
4827
- `)
4828
-
4829
- const resAfterUpdate = await client.request<any>(gql`
4830
- mutation updateTestClass2 {
4831
- updateTestClass2(
4832
- input: {
4833
- id: "${resAfterAdd.createTestClass2.testClass2.id}"
4834
- fields: {
4835
- field2: { remove: ["${resAfterAdd.createTestClass2.testClass2.field2.edges[0].node.id}"] }
4836
- }
4837
- }
4838
- ) {
4839
- testClass2{
4840
- id
4841
- name
4842
- field2 {
4843
- edges {
4844
- node {
4845
- field1
4846
- }
4847
- }
4848
- }
4849
- }
4850
- }
4851
- }
4852
- `)
4853
-
4854
- const field2AfterUpdate2 = (await wabe.controllers.database.getObjects({
4855
- // @ts-expect-error
4856
- className: 'TestClass2',
4857
- context: {
4858
- wabe,
4859
- isRoot: true,
4860
- },
4861
- })) as any
4862
-
4863
- expect(field2AfterUpdate2[0]?.field2.length).toBe(0)
4864
-
4865
- expect(resAfterUpdate.updateTestClass2.testClass2.name).toBe('name')
4866
- expect(resAfterUpdate.updateTestClass2.testClass2.field2.edges.length).toBe(0)
4867
-
4868
- const resAfterRemove = await client.request<any>(gql`
4869
- query testClasses {
4870
- testClasses {
4871
- edges {
4872
- node {
4873
- field1
4874
- }
4875
- }
4876
- }
4877
- }
4878
- `)
4879
-
4880
- expect(resAfterRemove.testClasses.edges.length).toBe(0)
4881
-
4882
- await wabe.close()
4883
- })
4884
-
4885
- it('should filter objects where field exists (exists: true)', async () => {
4886
- const { client, wabe } = await createWabe({
4887
- classes: [
4888
- {
4889
- name: 'TestClass',
4890
- fields: {
4891
- name: {
4892
- type: 'String',
4893
- },
4894
- age: {
4895
- type: 'Int',
4896
- },
4897
- active: {
4898
- type: 'Boolean',
4899
- },
4900
- },
4901
- },
4902
- ],
4903
- })
4904
-
4905
- // Create objects with and without the name field
4906
- await client.request<any>(gql`
4907
- mutation createObjects {
4908
- createTestClasses(
4909
- input: {
4910
- fields: [{ name: "Object with name" }, { name: "Another object with name" }, { age: 25 }]
4911
- }
4912
- ) {
4913
- ok
4914
- }
4915
- }
4916
- `)
4917
-
4918
- // Test exists: true - should return only objects with name field
4919
- const res = await client.request<any>(gql`
4920
- query testExistsTrue {
4921
- testClasses(where: { name: { exists: true } }) {
4922
- totalCount
4923
- edges {
4924
- node {
4925
- id
4926
- name
4927
- }
4928
- }
4929
- }
4930
- }
4931
- `)
4932
-
4933
- expect(res.testClasses.totalCount).toBe(2)
4934
- expect(res.testClasses.edges.length).toBe(2)
4935
- expect(res.testClasses.edges.every((edge: any) => edge.node.name)).toBe(true)
4936
-
4937
- await wabe.close()
4938
- })
4939
-
4940
- it('should filter objects where field does not exist (exists: false)', async () => {
4941
- const { client, wabe } = await createWabe({
4942
- classes: [
4943
- {
4944
- name: 'TestClass',
4945
- fields: {
4946
- name: {
4947
- type: 'String',
4948
- },
4949
- age: {
4950
- type: 'Int',
4951
- },
4952
- active: {
4953
- type: 'Boolean',
4954
- },
4955
- },
4956
- },
4957
- ],
4958
- })
4959
-
4960
- // Create objects with and without the name field
4961
- await client.request<any>(gql`
4962
- mutation createObjects {
4963
- createTestClasses(
4964
- input: { fields: [{ name: "Object with name" }, { age: 25 }, { active: true }] }
4965
- ) {
4966
- ok
4967
- }
4968
- }
4969
- `)
4970
-
4971
- // Test exists: false - should return only objects without name field
4972
- const res = await client.request<any>(gql`
4973
- query testExistsFalse {
4974
- testClasses(where: { name: { exists: false } }) {
4975
- totalCount
4976
- edges {
4977
- node {
4978
- id
4979
- name
4980
- }
4981
- }
4982
- }
4983
- }
4984
- `)
4985
-
4986
- expect(res.testClasses.totalCount).toBe(2)
4987
- expect(res.testClasses.edges.length).toBe(2)
4988
- expect(res.testClasses.edges.every((edge: any) => !edge.node.name)).toBe(true)
4989
-
4990
- await wabe.close()
4991
- })
4992
-
4993
- it('should work with AND conditions', async () => {
4994
- const { client, wabe } = await createWabe({
4995
- classes: [
4996
- {
4997
- name: 'TestClass',
4998
- fields: {
4999
- name: {
5000
- type: 'String',
5001
- },
5002
- age: {
5003
- type: 'Int',
5004
- },
5005
- active: {
5006
- type: 'Boolean',
5007
- },
5008
- },
5009
- },
5010
- ],
5011
- })
5012
- // Create objects with different field combinations
5013
- await client.request<any>(gql`
5014
- mutation createObjects {
5015
- createTestClasses(
5016
- input: {
5017
- fields: [{ name: "John", age: 25 }, { name: "Jane", age: 30 }, { age: 35 }, { name: "Bob" }]
5018
- }
5019
- ) {
5020
- ok
5021
- }
5022
- }
5023
- `)
5024
-
5025
- // Test with AND condition
5026
- const res = await client.request<any>(gql`
5027
- query testExistsWithAnd {
5028
- testClasses(where: { AND: [{ name: { exists: true } }, { age: { exists: true } }] }) {
5029
- totalCount
5030
- edges {
5031
- node {
5032
- id
5033
- name
5034
- age
5035
- }
5036
- }
5037
- }
5038
- }
5039
- `)
5040
-
5041
- expect(res.testClasses.totalCount).toBe(2)
5042
- expect(res.testClasses.edges.length).toBe(2)
5043
- expect(res.testClasses.edges.every((edge: any) => edge.node.name && edge.node.age)).toBe(true)
5044
-
5045
- await wabe.close()
5046
- })
5047
-
5048
- it('should work with OR conditions', async () => {
5049
- const { client, wabe } = await createWabe({
5050
- classes: [
5051
- {
5052
- name: 'TestClass',
5053
- fields: {
5054
- name: {
5055
- type: 'String',
5056
- },
5057
- age: {
5058
- type: 'Int',
5059
- },
5060
- active: {
5061
- type: 'Boolean',
5062
- },
5063
- },
5064
- },
5065
- ],
5066
- })
5067
-
5068
- // Create objects with different field combinations
5069
- await client.request<any>(gql`
5070
- mutation createObjects {
5071
- createTestClasses(input: { fields: [{ name: "John", age: 25 }, { name: "Jane" }, { age: 30 }] }) {
5072
- ok
5073
- }
5074
- }
5075
- `)
5076
-
5077
- // Test with OR condition - objects that have either name OR age
5078
- const res = await client.request<any>(gql`
5079
- query testExistsWithOr {
5080
- testClasses(where: { OR: [{ name: { exists: true } }, { age: { exists: true } }] }) {
5081
- totalCount
5082
- edges {
5083
- node {
5084
- id
5085
- name
5086
- age
5087
- }
5088
- }
5089
- }
5090
- }
5091
- `)
5092
-
5093
- // All 3 objects should match (2 have name, 2 have age, 1 has both)
5094
- expect(res.testClasses.totalCount).toBe(3)
5095
- expect(res.testClasses.edges.length).toBe(3)
5096
-
5097
- await wabe.close()
5098
- })
5099
- })