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.
- package/package.json +4 -1
- package/dev/index.ts +0 -215
- package/generated/schema.graphql +0 -1945
- package/generated/wabe.ts +0 -448
- package/src/authentication/OTP.test.ts +0 -69
- package/src/authentication/OTP.ts +0 -64
- package/src/authentication/Session.test.ts +0 -629
- package/src/authentication/Session.ts +0 -517
- package/src/authentication/cookies.ts +0 -10
- package/src/authentication/defaultAuthentication.ts +0 -209
- package/src/authentication/index.ts +0 -4
- package/src/authentication/interface.ts +0 -177
- package/src/authentication/oauth/GitHub.test.ts +0 -91
- package/src/authentication/oauth/GitHub.ts +0 -121
- package/src/authentication/oauth/Google.test.ts +0 -91
- package/src/authentication/oauth/Google.ts +0 -101
- package/src/authentication/oauth/Oauth2Client.test.ts +0 -219
- package/src/authentication/oauth/Oauth2Client.ts +0 -135
- package/src/authentication/oauth/index.ts +0 -2
- package/src/authentication/oauth/utils.test.ts +0 -33
- package/src/authentication/oauth/utils.ts +0 -27
- package/src/authentication/providers/EmailOTP.test.ts +0 -127
- package/src/authentication/providers/EmailOTP.ts +0 -95
- package/src/authentication/providers/EmailPassword.test.ts +0 -263
- package/src/authentication/providers/EmailPassword.ts +0 -138
- package/src/authentication/providers/EmailPasswordSRP.test.ts +0 -208
- package/src/authentication/providers/EmailPasswordSRP.ts +0 -191
- package/src/authentication/providers/GitHub.ts +0 -24
- package/src/authentication/providers/Google.ts +0 -24
- package/src/authentication/providers/OAuth.test.ts +0 -185
- package/src/authentication/providers/OAuth.ts +0 -106
- package/src/authentication/providers/PhonePassword.test.ts +0 -221
- package/src/authentication/providers/PhonePassword.ts +0 -136
- package/src/authentication/providers/QRCodeOTP.test.ts +0 -77
- package/src/authentication/providers/QRCodeOTP.ts +0 -69
- package/src/authentication/providers/index.ts +0 -6
- package/src/authentication/resolvers/refreshResolver.test.ts +0 -30
- package/src/authentication/resolvers/refreshResolver.ts +0 -19
- package/src/authentication/resolvers/signInWithResolver.inte.test.ts +0 -59
- package/src/authentication/resolvers/signInWithResolver.test.ts +0 -306
- package/src/authentication/resolvers/signInWithResolver.ts +0 -106
- package/src/authentication/resolvers/signOutResolver.test.ts +0 -38
- package/src/authentication/resolvers/signOutResolver.ts +0 -18
- package/src/authentication/resolvers/signUpWithResolver.test.ts +0 -180
- package/src/authentication/resolvers/signUpWithResolver.ts +0 -68
- package/src/authentication/resolvers/verifyChallenge.test.ts +0 -230
- package/src/authentication/resolvers/verifyChallenge.ts +0 -78
- package/src/authentication/roles.test.ts +0 -49
- package/src/authentication/roles.ts +0 -40
- package/src/authentication/security.ts +0 -278
- package/src/authentication/utils.test.ts +0 -97
- package/src/authentication/utils.ts +0 -39
- package/src/cache/InMemoryCache.test.ts +0 -62
- package/src/cache/InMemoryCache.ts +0 -45
- package/src/cron/index.test.ts +0 -17
- package/src/cron/index.ts +0 -43
- package/src/database/DatabaseController.test.ts +0 -613
- package/src/database/DatabaseController.ts +0 -1415
- package/src/database/index.test.ts +0 -1551
- package/src/database/index.ts +0 -9
- package/src/database/interface.ts +0 -308
- package/src/email/DevAdapter.ts +0 -7
- package/src/email/EmailController.test.ts +0 -29
- package/src/email/EmailController.ts +0 -13
- package/src/email/index.ts +0 -2
- package/src/email/interface.ts +0 -36
- package/src/email/templates/sendOtpCode.ts +0 -120
- package/src/file/FileController.ts +0 -28
- package/src/file/FileDevAdapter.ts +0 -51
- package/src/file/hookDeleteFile.ts +0 -25
- package/src/file/hookReadFile.ts +0 -66
- package/src/file/hookUploadFile.ts +0 -52
- package/src/file/index.test.ts +0 -1031
- package/src/file/index.ts +0 -2
- package/src/file/interface.ts +0 -63
- package/src/file/security.ts +0 -156
- package/src/graphql/GraphQLSchema.test.ts +0 -5099
- package/src/graphql/GraphQLSchema.ts +0 -886
- package/src/graphql/index.ts +0 -2
- package/src/graphql/parseGraphqlSchema.ts +0 -85
- package/src/graphql/parser.test.ts +0 -203
- package/src/graphql/parser.ts +0 -707
- package/src/graphql/pointerAndRelationFunction.ts +0 -191
- package/src/graphql/resolvers.ts +0 -464
- package/src/graphql/tests/aggregation.test.ts +0 -1115
- package/src/graphql/tests/e2e.test.ts +0 -590
- package/src/graphql/tests/scalars.test.ts +0 -250
- package/src/graphql/types.ts +0 -227
- package/src/hooks/HookObject.test.ts +0 -122
- package/src/hooks/HookObject.ts +0 -165
- package/src/hooks/authentication.ts +0 -67
- package/src/hooks/createUser.test.ts +0 -77
- package/src/hooks/createUser.ts +0 -10
- package/src/hooks/defaultFields.test.ts +0 -176
- package/src/hooks/defaultFields.ts +0 -32
- package/src/hooks/deleteSession.test.ts +0 -181
- package/src/hooks/deleteSession.ts +0 -20
- package/src/hooks/hashFieldHook.test.ts +0 -152
- package/src/hooks/hashFieldHook.ts +0 -89
- package/src/hooks/index.test.ts +0 -258
- package/src/hooks/index.ts +0 -420
- package/src/hooks/permissions.test.ts +0 -412
- package/src/hooks/permissions.ts +0 -93
- package/src/hooks/protected.test.ts +0 -551
- package/src/hooks/protected.ts +0 -74
- package/src/hooks/searchableFields.test.ts +0 -147
- package/src/hooks/searchableFields.ts +0 -86
- package/src/hooks/session.test.ts +0 -134
- package/src/hooks/session.ts +0 -76
- package/src/hooks/setEmail.test.ts +0 -216
- package/src/hooks/setEmail.ts +0 -33
- package/src/hooks/setupAcl.test.ts +0 -618
- package/src/hooks/setupAcl.ts +0 -25
- package/src/hooks/virtualFields.test.ts +0 -228
- package/src/hooks/virtualFields.ts +0 -48
- package/src/index.ts +0 -9
- package/src/schema/Schema.test.ts +0 -482
- package/src/schema/Schema.ts +0 -839
- package/src/schema/defaultResolvers.ts +0 -93
- package/src/schema/index.ts +0 -1
- package/src/schema/resolvers/meResolver.test.ts +0 -62
- package/src/schema/resolvers/meResolver.ts +0 -10
- package/src/schema/resolvers/resetPassword.test.ts +0 -341
- package/src/schema/resolvers/resetPassword.ts +0 -63
- package/src/schema/resolvers/sendEmail.test.ts +0 -118
- package/src/schema/resolvers/sendEmail.ts +0 -21
- package/src/schema/resolvers/sendOtpCode.test.ts +0 -141
- package/src/schema/resolvers/sendOtpCode.ts +0 -52
- package/src/security.test.ts +0 -4136
- package/src/server/defaultSessionHandler.test.ts +0 -62
- package/src/server/defaultSessionHandler.ts +0 -104
- package/src/server/generateCodegen.ts +0 -433
- package/src/server/index.test.ts +0 -843
- package/src/server/index.ts +0 -336
- package/src/server/interface.ts +0 -11
- package/src/server/routes/authHandler.ts +0 -171
- package/src/server/routes/index.ts +0 -48
- package/src/utils/crypto.test.ts +0 -41
- package/src/utils/crypto.ts +0 -105
- package/src/utils/database.ts +0 -8
- package/src/utils/export.ts +0 -12
- package/src/utils/helper.ts +0 -204
- package/src/utils/index.test.ts +0 -11
- package/src/utils/index.ts +0 -196
- package/src/utils/preload.ts +0 -8
- package/src/utils/testHelper.ts +0 -124
- 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
|
-
})
|