mock-config-server 3.3.1 → 3.3.3
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/dist/src/core/database/createDatabaseRoutes/storages/File/FileStorage.js +0 -5
- package/dist/src/core/database/createDatabaseRoutes/storages/File/FileWriter.js +4 -8
- package/dist/src/core/database/createDatabaseRoutes/storages/Memory/MemoryStorage.js +0 -4
- package/package.json +2 -2
- package/dist/src/core/database/createDatabaseRoutes/createDatabaseRoutes.test.ts +0 -112
- package/dist/src/core/database/createDatabaseRoutes/helpers/array/createNewId/createNewId.test.ts +0 -13
- package/dist/src/core/database/createDatabaseRoutes/helpers/array/findIndexById/findIndexById.test.ts +0 -17
- package/dist/src/core/database/createDatabaseRoutes/helpers/array/isIndex/isIndex.test.ts +0 -30
- package/dist/src/core/database/createDatabaseRoutes/helpers/createNestedDatabaseRoutes/createNestedDatabaseRoutes.test.ts +0 -399
- package/dist/src/core/database/createDatabaseRoutes/helpers/createShallowDatabaseRoutes/createShallowDatabaseRoutes.test.ts +0 -118
- package/dist/src/core/database/createDatabaseRoutes/helpers/operators/operators.d.ts +0 -3
- package/dist/src/core/database/createDatabaseRoutes/helpers/operators/operators.js +0 -30
- package/dist/src/core/database/createDatabaseRoutes/helpers/search/search.d.ts +0 -3
- package/dist/src/core/database/createDatabaseRoutes/helpers/search/search.js +0 -31
- package/dist/src/core/database/createDatabaseRoutes/helpers/splitDatabaseByNesting/splitDatabaseByNesting.test.ts +0 -25
- package/dist/src/core/database/createDatabaseRoutes/storages/File/FileStorage.test.ts +0 -156
- package/dist/src/core/database/createDatabaseRoutes/storages/File/FileWriter.test.ts +0 -48
- package/dist/src/core/database/createDatabaseRoutes/storages/Memory/MemoryStorage.test.ts +0 -96
- package/dist/src/core/graphql/createGraphQLRoutes/createGraphQLRoutes.test.ts +0 -851
- package/dist/src/core/graphql/createGraphQLRoutes/helpers/prepareGraphQLRequestConfigs/prepareGraphQLRequestConfigs.test.ts +0 -116
- package/dist/src/core/middlewares/cookieParseMiddleware/cookieParseMiddleware.test.ts +0 -22
- package/dist/src/core/middlewares/cookieParseMiddleware/helpers/parseCookie/parseCookie.test.ts +0 -45
- package/dist/src/core/middlewares/corsMiddleware/corsMiddleware.test.ts +0 -152
- package/dist/src/core/middlewares/corsMiddleware/helpers/getAllowedOrigins/getAllowedOrigins.test.ts +0 -15
- package/dist/src/core/middlewares/errorMiddleware/errorMiddleware.test.ts +0 -29
- package/dist/src/core/middlewares/noCorsMiddleware/noCorsMiddleware.test.ts +0 -49
- package/dist/src/core/middlewares/notFoundMiddleware/helpers/getGraphqlUrlSuggestions/getGraphqlUrlSuggestions.test.ts +0 -27
- package/dist/src/core/middlewares/notFoundMiddleware/helpers/getLevenshteinDistance/getLevenshteinDistance.test.ts +0 -12
- package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/getRestUrlSuggestions.test.ts +0 -54
- package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/helpers/getActualRestUrlMeaningfulString/getActualRestUrlMeaningfulString.test.ts +0 -12
- package/dist/src/core/middlewares/notFoundMiddleware/helpers/getRestUrlSuggestions/helpers/getPatternRestUrlMeaningfulString/getPatternRestUrlMeaningfulString.test.ts +0 -10
- package/dist/src/core/middlewares/notFoundMiddleware/notFoundMiddleware.test.ts +0 -285
- package/dist/src/core/rest/createRestRoutes/createRestRoutes.test.ts +0 -648
- package/dist/src/core/rest/createRestRoutes/helpers/prepareRestRequestConfigs/prepareRestRequestConfigs.test.ts +0 -154
- package/dist/src/utils/helpers/config/resolveEntityValues/resolveEntityValues.test.ts +0 -1452
- package/dist/src/utils/helpers/entities/convertToEntityDescriptor/convertToEntityDescriptor.test.ts +0 -27
- package/dist/src/utils/helpers/entities/isEntityDescriptor/isEntityDescriptor.test.ts +0 -15
- package/dist/src/utils/helpers/graphql/getGraphQLInput/getGraphQLInput.test.ts +0 -140
- package/dist/src/utils/helpers/graphql/parseQuery/parseQuery.test.ts +0 -32
- package/dist/src/utils/helpers/interceptors/callRequestInterceptor/callRequestInterceptors.test.ts +0 -53
- package/dist/src/utils/helpers/interceptors/callResponseInterceptors/callResponseInterceptors.test.ts +0 -262
- package/dist/src/utils/helpers/isPlainObject/isPlainObject.test.ts +0 -20
- package/dist/src/utils/helpers/isPrimitive/isPrimitive.test.ts +0 -26
- package/dist/src/utils/helpers/isRegExp/isRegExp.test.ts +0 -20
- package/dist/src/utils/helpers/url/convertWin32PathToUnix/convertWin32PathToUnix.test.ts +0 -21
- package/dist/src/utils/helpers/url/getUrlParts/getUrlParts.test.ts +0 -8
- package/dist/src/utils/helpers/url/removeLeadingAndTrailingSlashes/removeLeadingAndTrailingSlashes.test.ts +0 -10
- package/dist/src/utils/helpers/url/urlJoin/urlJoin.test.ts +0 -9
|
@@ -1,851 +0,0 @@
|
|
|
1
|
-
import express from 'express';
|
|
2
|
-
import request from 'supertest';
|
|
3
|
-
|
|
4
|
-
import { urlJoin } from '@/utils/helpers';
|
|
5
|
-
import type { GraphqlConfig, MockServerConfig } from '@/utils/types';
|
|
6
|
-
|
|
7
|
-
import { createGraphQLRoutes } from './createGraphQLRoutes';
|
|
8
|
-
|
|
9
|
-
const createServer = (
|
|
10
|
-
mockServerConfig: Pick<MockServerConfig, 'interceptors' | 'baseUrl'> & {
|
|
11
|
-
graphql: GraphqlConfig;
|
|
12
|
-
}
|
|
13
|
-
) => {
|
|
14
|
-
const { baseUrl, graphql, interceptors } = mockServerConfig;
|
|
15
|
-
const server = express();
|
|
16
|
-
const routerBase = express.Router();
|
|
17
|
-
const routerWithRoutes = createGraphQLRoutes({
|
|
18
|
-
router: routerBase,
|
|
19
|
-
graphqlConfig: graphql,
|
|
20
|
-
serverResponseInterceptor: interceptors?.response
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
const graphqlBaseUrl = urlJoin(baseUrl ?? '/', graphql?.baseUrl ?? '/');
|
|
24
|
-
|
|
25
|
-
server.use(express.json());
|
|
26
|
-
server.use(graphqlBaseUrl, routerWithRoutes);
|
|
27
|
-
return server;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
describe('createRestRoutes', () => {
|
|
31
|
-
test('Should return 400 and description text for invalid query', async () => {
|
|
32
|
-
const server = createServer({
|
|
33
|
-
graphql: {
|
|
34
|
-
configs: [
|
|
35
|
-
{
|
|
36
|
-
operationName: 'GetUsers',
|
|
37
|
-
operationType: 'query',
|
|
38
|
-
routes: [
|
|
39
|
-
{
|
|
40
|
-
entities: {
|
|
41
|
-
headers: {
|
|
42
|
-
key1: 'value1',
|
|
43
|
-
key2: 'value2'
|
|
44
|
-
},
|
|
45
|
-
query: {
|
|
46
|
-
key1: 'value1'
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
|
-
data: { name: 'John', surname: 'Doe' }
|
|
50
|
-
}
|
|
51
|
-
]
|
|
52
|
-
}
|
|
53
|
-
]
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
const postResponse = await request(server).post('/').send({ query: 'invalid query' });
|
|
58
|
-
|
|
59
|
-
expect(postResponse.statusCode).toBe(400);
|
|
60
|
-
expect(postResponse.body).toStrictEqual({
|
|
61
|
-
message: 'Query is invalid, you must use a valid GraphQL query'
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
const getResponse = await request(server).get('/').query({
|
|
65
|
-
query: 'invalid query'
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
expect(postResponse.statusCode).toBe(400);
|
|
69
|
-
expect(getResponse.body).toStrictEqual({
|
|
70
|
-
message: 'Query is invalid, you must use a valid GraphQL query'
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
test('Should return 404 and description text for no matched request configs', async () => {
|
|
75
|
-
const server = createServer({
|
|
76
|
-
graphql: {
|
|
77
|
-
configs: [
|
|
78
|
-
{
|
|
79
|
-
operationName: 'GetUsers',
|
|
80
|
-
operationType: 'query',
|
|
81
|
-
routes: [
|
|
82
|
-
{
|
|
83
|
-
entities: {
|
|
84
|
-
headers: {
|
|
85
|
-
key1: 'value1'
|
|
86
|
-
}
|
|
87
|
-
},
|
|
88
|
-
data: { name: 'John', surname: 'Doe' }
|
|
89
|
-
}
|
|
90
|
-
]
|
|
91
|
-
}
|
|
92
|
-
]
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
const postResponse = await request(server)
|
|
97
|
-
.post('/')
|
|
98
|
-
.send({ query: 'query GetUsers { users { name } }' })
|
|
99
|
-
.set({ key2: 'value2' });
|
|
100
|
-
|
|
101
|
-
expect(postResponse.statusCode).toBe(404);
|
|
102
|
-
|
|
103
|
-
const getResponse = await request(server).get('/').set({ key2: 'value2' }).query({
|
|
104
|
-
query: 'query GetUsers { users { name } }'
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
expect(getResponse.statusCode).toBe(404);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
test('Should have response Cache-Control header equals to max-age=0, must-revalidate', async () => {
|
|
111
|
-
const server = createServer({
|
|
112
|
-
graphql: {
|
|
113
|
-
configs: [
|
|
114
|
-
{
|
|
115
|
-
operationName: 'GetUsers',
|
|
116
|
-
operationType: 'query',
|
|
117
|
-
routes: [{ data: { name: 'John', surname: 'Doe' } }]
|
|
118
|
-
}
|
|
119
|
-
]
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
const postResponse = await request(server)
|
|
124
|
-
.post('/')
|
|
125
|
-
.send({ query: 'query GetUsers { users { name } }' });
|
|
126
|
-
expect(postResponse.headers['cache-control']).toBe('max-age=0, must-revalidate');
|
|
127
|
-
|
|
128
|
-
const getResponse = await request(server)
|
|
129
|
-
.get('/')
|
|
130
|
-
.query({ query: 'query GetUsers { users { name } }' });
|
|
131
|
-
expect(getResponse.headers['cache-control']).toBe('max-age=0, must-revalidate');
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
describe('createRestRoutes: content', () => {
|
|
136
|
-
test('Should correctly use data function', async () => {
|
|
137
|
-
const server = createServer({
|
|
138
|
-
graphql: {
|
|
139
|
-
configs: [
|
|
140
|
-
{
|
|
141
|
-
operationName: 'GetUsers',
|
|
142
|
-
operationType: 'query',
|
|
143
|
-
routes: [
|
|
144
|
-
{
|
|
145
|
-
entities: {
|
|
146
|
-
query: {
|
|
147
|
-
key1: 'value1'
|
|
148
|
-
}
|
|
149
|
-
},
|
|
150
|
-
data: ({ url }, { query }) => ({
|
|
151
|
-
url,
|
|
152
|
-
query
|
|
153
|
-
})
|
|
154
|
-
}
|
|
155
|
-
]
|
|
156
|
-
}
|
|
157
|
-
]
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
const response = await request(server).get('/').query({
|
|
162
|
-
query: 'query GetUsers { users { name } }',
|
|
163
|
-
key1: 'value1'
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
expect(response.statusCode).toBe(200);
|
|
167
|
-
expect(response.body).toEqual({
|
|
168
|
-
url: `/?query=${encodeURIComponent('query GetUsers { users { name } }')}&key1=value1`,
|
|
169
|
-
query: {
|
|
170
|
-
key1: 'value1'
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
test('Should correctly use data function with polling setting', async () => {
|
|
176
|
-
const server = createServer({
|
|
177
|
-
graphql: {
|
|
178
|
-
configs: [
|
|
179
|
-
{
|
|
180
|
-
operationName: 'GetUsers',
|
|
181
|
-
operationType: 'query',
|
|
182
|
-
routes: [
|
|
183
|
-
{
|
|
184
|
-
settings: { polling: true },
|
|
185
|
-
entities: {
|
|
186
|
-
query: {
|
|
187
|
-
key1: 'value1'
|
|
188
|
-
}
|
|
189
|
-
},
|
|
190
|
-
queue: [
|
|
191
|
-
{
|
|
192
|
-
data: ({ url }, { query }) => ({
|
|
193
|
-
url,
|
|
194
|
-
query
|
|
195
|
-
})
|
|
196
|
-
}
|
|
197
|
-
]
|
|
198
|
-
}
|
|
199
|
-
]
|
|
200
|
-
}
|
|
201
|
-
]
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
const response = await request(server).get('/').query({
|
|
206
|
-
query: 'query GetUsers { users { name } }',
|
|
207
|
-
key1: 'value1'
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
expect(response.statusCode).toBe(200);
|
|
211
|
-
expect(response.body).toEqual({
|
|
212
|
-
url: `/?query=${encodeURIComponent('query GetUsers { users { name } }')}&key1=value1`,
|
|
213
|
-
query: {
|
|
214
|
-
key1: 'value1'
|
|
215
|
-
}
|
|
216
|
-
});
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
test('Should return same polling data with time param', async () => {
|
|
220
|
-
jest.useFakeTimers();
|
|
221
|
-
const server = createServer({
|
|
222
|
-
graphql: {
|
|
223
|
-
configs: [
|
|
224
|
-
{
|
|
225
|
-
operationName: 'GetUsers',
|
|
226
|
-
operationType: 'query',
|
|
227
|
-
routes: [
|
|
228
|
-
{
|
|
229
|
-
settings: { polling: true },
|
|
230
|
-
queue: [
|
|
231
|
-
{ time: 2000, data: { name: 'John', surname: 'Doe' } },
|
|
232
|
-
{ data: { name: 'John', surname: 'Smith' } }
|
|
233
|
-
]
|
|
234
|
-
}
|
|
235
|
-
]
|
|
236
|
-
}
|
|
237
|
-
]
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
const query = {
|
|
242
|
-
query: 'query GetUsers { users { name } }',
|
|
243
|
-
key1: 'value1'
|
|
244
|
-
};
|
|
245
|
-
|
|
246
|
-
const firstResponse = await request(server).get('/').query(query);
|
|
247
|
-
expect(firstResponse.statusCode).toBe(200);
|
|
248
|
-
expect(firstResponse.body).toEqual({ name: 'John', surname: 'Doe' });
|
|
249
|
-
|
|
250
|
-
jest.advanceTimersByTime(1000);
|
|
251
|
-
|
|
252
|
-
const secondResponse = await request(server).get('/').query(query);
|
|
253
|
-
expect(secondResponse.statusCode).toBe(200);
|
|
254
|
-
expect(secondResponse.body).toEqual({ name: 'John', surname: 'Doe' });
|
|
255
|
-
|
|
256
|
-
jest.advanceTimersByTime(1000);
|
|
257
|
-
|
|
258
|
-
const thirdResponse = await request(server).get('/').query(query);
|
|
259
|
-
expect(thirdResponse.statusCode).toBe(200);
|
|
260
|
-
expect(thirdResponse.body).toEqual({ name: 'John', surname: 'Smith' });
|
|
261
|
-
|
|
262
|
-
jest.useRealTimers();
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
test('Should correct handle empty queue', async () => {
|
|
266
|
-
const server = createServer({
|
|
267
|
-
graphql: {
|
|
268
|
-
configs: [
|
|
269
|
-
{
|
|
270
|
-
operationName: 'GetUsers',
|
|
271
|
-
operationType: 'query',
|
|
272
|
-
routes: [
|
|
273
|
-
{
|
|
274
|
-
settings: { polling: true },
|
|
275
|
-
queue: []
|
|
276
|
-
}
|
|
277
|
-
]
|
|
278
|
-
}
|
|
279
|
-
]
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
const query = {
|
|
284
|
-
query: 'query GetUsers { users { name } }'
|
|
285
|
-
};
|
|
286
|
-
|
|
287
|
-
const response = await request(server).get('/').query(query);
|
|
288
|
-
expect(response.statusCode).toBe(404);
|
|
289
|
-
});
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
describe('createRestRoutes: settings', () => {
|
|
293
|
-
test('Should correctly process the request with polling', async () => {
|
|
294
|
-
const server = createServer({
|
|
295
|
-
graphql: {
|
|
296
|
-
configs: [
|
|
297
|
-
{
|
|
298
|
-
operationName: 'GetUsers',
|
|
299
|
-
operationType: 'query',
|
|
300
|
-
routes: [
|
|
301
|
-
{
|
|
302
|
-
settings: { polling: true },
|
|
303
|
-
queue: [
|
|
304
|
-
{ data: { name: 'John', surname: 'Doe' } },
|
|
305
|
-
{ data: { name: 'John', surname: 'Smith' } }
|
|
306
|
-
]
|
|
307
|
-
}
|
|
308
|
-
]
|
|
309
|
-
}
|
|
310
|
-
]
|
|
311
|
-
}
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
const query = {
|
|
315
|
-
query: 'query GetUsers { users { name } }'
|
|
316
|
-
};
|
|
317
|
-
|
|
318
|
-
const firstResponse = await request(server).get('/').query(query);
|
|
319
|
-
expect(firstResponse.statusCode).toBe(200);
|
|
320
|
-
expect(firstResponse.body).toEqual({ name: 'John', surname: 'Doe' });
|
|
321
|
-
|
|
322
|
-
const secondResponse = await request(server).get('/').query(query);
|
|
323
|
-
expect(secondResponse.statusCode).toBe(200);
|
|
324
|
-
expect(secondResponse.body).toEqual({ name: 'John', surname: 'Smith' });
|
|
325
|
-
|
|
326
|
-
const thirdResponse = await request(server).get('/').query(query);
|
|
327
|
-
expect(thirdResponse.statusCode).toBe(200);
|
|
328
|
-
expect(thirdResponse.body).toEqual({ name: 'John', surname: 'Doe' });
|
|
329
|
-
});
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
describe('createRestRoutes: entities', () => {
|
|
333
|
-
test('Should match config by entities "includes" behavior', async () => {
|
|
334
|
-
const server = createServer({
|
|
335
|
-
graphql: {
|
|
336
|
-
configs: [
|
|
337
|
-
{
|
|
338
|
-
operationName: 'GetUsers',
|
|
339
|
-
operationType: 'query',
|
|
340
|
-
routes: [
|
|
341
|
-
{
|
|
342
|
-
entities: {
|
|
343
|
-
headers: {
|
|
344
|
-
key1: 'value1',
|
|
345
|
-
key2: 'value2'
|
|
346
|
-
},
|
|
347
|
-
query: {
|
|
348
|
-
key1: 'value1'
|
|
349
|
-
}
|
|
350
|
-
},
|
|
351
|
-
data: { name: 'John', surname: 'Doe' }
|
|
352
|
-
}
|
|
353
|
-
]
|
|
354
|
-
}
|
|
355
|
-
]
|
|
356
|
-
}
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
const postResponse = await request(server)
|
|
360
|
-
.post('/')
|
|
361
|
-
.send({ query: 'query GetUsers { users { name } }' })
|
|
362
|
-
.set({ key1: 'value1', key2: 'value2' })
|
|
363
|
-
.query({ key1: 'value1', key2: 'value2' });
|
|
364
|
-
|
|
365
|
-
expect(postResponse.statusCode).toBe(200);
|
|
366
|
-
expect(postResponse.body).toStrictEqual({ name: 'John', surname: 'Doe' });
|
|
367
|
-
|
|
368
|
-
const getResponse = await request(server)
|
|
369
|
-
.get('/')
|
|
370
|
-
.set({ key1: 'value1', key2: 'value2' })
|
|
371
|
-
.query({
|
|
372
|
-
query: 'query GetUsers { users { name } }',
|
|
373
|
-
key1: 'value1',
|
|
374
|
-
key2: 'value2'
|
|
375
|
-
});
|
|
376
|
-
|
|
377
|
-
expect(getResponse.statusCode).toBe(200);
|
|
378
|
-
expect(getResponse.body).toStrictEqual({ name: 'John', surname: 'Doe' });
|
|
379
|
-
});
|
|
380
|
-
|
|
381
|
-
test('Should match config by entities "includes" behavior with operationName regexp', async () => {
|
|
382
|
-
const server = createServer({
|
|
383
|
-
graphql: {
|
|
384
|
-
configs: [
|
|
385
|
-
{
|
|
386
|
-
operationName: /^Get(.+?)sers$/g,
|
|
387
|
-
operationType: 'query',
|
|
388
|
-
routes: [
|
|
389
|
-
{
|
|
390
|
-
entities: {
|
|
391
|
-
headers: {
|
|
392
|
-
key1: 'value1',
|
|
393
|
-
key2: 'value2'
|
|
394
|
-
},
|
|
395
|
-
query: {
|
|
396
|
-
key1: 'value1'
|
|
397
|
-
}
|
|
398
|
-
},
|
|
399
|
-
data: { name: 'John', surname: 'Doe' }
|
|
400
|
-
}
|
|
401
|
-
]
|
|
402
|
-
}
|
|
403
|
-
]
|
|
404
|
-
}
|
|
405
|
-
});
|
|
406
|
-
|
|
407
|
-
const postResponse = await request(server)
|
|
408
|
-
.post('/')
|
|
409
|
-
.send({ query: 'query GetUsers { users { name } }' })
|
|
410
|
-
.set({ key1: 'value1', key2: 'value2' })
|
|
411
|
-
.query({ key1: 'value1', key2: 'value2' });
|
|
412
|
-
|
|
413
|
-
expect(postResponse.statusCode).toBe(200);
|
|
414
|
-
expect(postResponse.body).toStrictEqual({ name: 'John', surname: 'Doe' });
|
|
415
|
-
|
|
416
|
-
const getResponse = await request(server)
|
|
417
|
-
.get('/')
|
|
418
|
-
.set({ key1: 'value1', key2: 'value2' })
|
|
419
|
-
.query({
|
|
420
|
-
query: 'query GetUsers { users { name } }',
|
|
421
|
-
key1: 'value1',
|
|
422
|
-
key2: 'value2'
|
|
423
|
-
});
|
|
424
|
-
|
|
425
|
-
expect(getResponse.statusCode).toBe(200);
|
|
426
|
-
expect(getResponse.body).toStrictEqual({ name: 'John', surname: 'Doe' });
|
|
427
|
-
});
|
|
428
|
-
|
|
429
|
-
test('Should give priority to more specific route config', async () => {
|
|
430
|
-
const server = createServer({
|
|
431
|
-
graphql: {
|
|
432
|
-
configs: [
|
|
433
|
-
{
|
|
434
|
-
operationName: 'GetUsers',
|
|
435
|
-
operationType: 'query',
|
|
436
|
-
routes: [
|
|
437
|
-
{
|
|
438
|
-
entities: {
|
|
439
|
-
headers: {
|
|
440
|
-
key1: 'value1',
|
|
441
|
-
key2: 'value2'
|
|
442
|
-
},
|
|
443
|
-
query: {
|
|
444
|
-
key1: 'value1'
|
|
445
|
-
}
|
|
446
|
-
},
|
|
447
|
-
data: { name: 'John', surname: 'Doe' }
|
|
448
|
-
},
|
|
449
|
-
{
|
|
450
|
-
entities: {
|
|
451
|
-
headers: {
|
|
452
|
-
key1: 'value1',
|
|
453
|
-
key2: 'value2'
|
|
454
|
-
},
|
|
455
|
-
query: {
|
|
456
|
-
key1: 'value1',
|
|
457
|
-
key2: 'value2'
|
|
458
|
-
}
|
|
459
|
-
},
|
|
460
|
-
data: { name: 'John', surname: 'Smith' }
|
|
461
|
-
}
|
|
462
|
-
]
|
|
463
|
-
}
|
|
464
|
-
]
|
|
465
|
-
}
|
|
466
|
-
});
|
|
467
|
-
|
|
468
|
-
const postResponse = await request(server)
|
|
469
|
-
.post('/')
|
|
470
|
-
.send({ query: 'query GetUsers { users { name } }' })
|
|
471
|
-
.set({ key1: 'value1', key2: 'value2' })
|
|
472
|
-
.query({ key1: 'value1', key2: 'value2' });
|
|
473
|
-
|
|
474
|
-
expect(postResponse.statusCode).toBe(200);
|
|
475
|
-
expect(postResponse.body).toStrictEqual({ name: 'John', surname: 'Smith' });
|
|
476
|
-
|
|
477
|
-
const getResponse = await request(server)
|
|
478
|
-
.get('/')
|
|
479
|
-
.set({ key1: 'value1', key2: 'value2' })
|
|
480
|
-
.query({
|
|
481
|
-
query: 'query GetUsers { users { name } }',
|
|
482
|
-
key1: 'value1',
|
|
483
|
-
key2: 'value2'
|
|
484
|
-
});
|
|
485
|
-
|
|
486
|
-
expect(getResponse.statusCode).toBe(200);
|
|
487
|
-
expect(getResponse.body).toStrictEqual({ name: 'John', surname: 'Smith' });
|
|
488
|
-
});
|
|
489
|
-
|
|
490
|
-
test('Should strictly compare plain array body if top level descriptor used', async () => {
|
|
491
|
-
const server = createServer({
|
|
492
|
-
graphql: {
|
|
493
|
-
configs: [
|
|
494
|
-
{
|
|
495
|
-
operationName: 'GetUsers',
|
|
496
|
-
operationType: 'query',
|
|
497
|
-
routes: [
|
|
498
|
-
{
|
|
499
|
-
entities: {
|
|
500
|
-
variables: {
|
|
501
|
-
checkMode: 'equals',
|
|
502
|
-
value: [
|
|
503
|
-
{
|
|
504
|
-
key1: 'value1',
|
|
505
|
-
key2: { nestedKey1: 'nestedValue1' }
|
|
506
|
-
}
|
|
507
|
-
]
|
|
508
|
-
}
|
|
509
|
-
},
|
|
510
|
-
data: { name: 'John', surname: 'Doe' }
|
|
511
|
-
}
|
|
512
|
-
]
|
|
513
|
-
}
|
|
514
|
-
]
|
|
515
|
-
}
|
|
516
|
-
});
|
|
517
|
-
|
|
518
|
-
const successPostResponse = await request(server)
|
|
519
|
-
.post('/')
|
|
520
|
-
.set('Content-Type', 'application/json')
|
|
521
|
-
.send({
|
|
522
|
-
query: 'query GetUsers { users { name } }',
|
|
523
|
-
variables: {
|
|
524
|
-
key1: 'value1',
|
|
525
|
-
key2: { nestedKey1: 'nestedValue1' }
|
|
526
|
-
}
|
|
527
|
-
});
|
|
528
|
-
|
|
529
|
-
expect(successPostResponse.statusCode).toBe(200);
|
|
530
|
-
expect(successPostResponse.body).toStrictEqual({ name: 'John', surname: 'Doe' });
|
|
531
|
-
|
|
532
|
-
const failedPostResponse = await request(server)
|
|
533
|
-
.post('/')
|
|
534
|
-
.set('Content-Type', 'application/json')
|
|
535
|
-
.send({
|
|
536
|
-
query: 'query GetUsers { users { name } }',
|
|
537
|
-
variables: {
|
|
538
|
-
key1: 'value1',
|
|
539
|
-
key2: { nestedKey1: 'nestedValue1', nestedKey2: 'nestedValue2' }
|
|
540
|
-
}
|
|
541
|
-
});
|
|
542
|
-
|
|
543
|
-
expect(failedPostResponse.statusCode).toBe(404);
|
|
544
|
-
|
|
545
|
-
const successGetResponse = await request(server)
|
|
546
|
-
.get('/')
|
|
547
|
-
.set('Content-Type', 'application/json')
|
|
548
|
-
.query({
|
|
549
|
-
query: 'query GetUsers { users { name } }',
|
|
550
|
-
variables: '{ "key1": "value1", "key2": { "nestedKey1": "nestedValue1" } }'
|
|
551
|
-
});
|
|
552
|
-
|
|
553
|
-
expect(successGetResponse.statusCode).toBe(200);
|
|
554
|
-
expect(successGetResponse.body).toStrictEqual({ name: 'John', surname: 'Doe' });
|
|
555
|
-
|
|
556
|
-
const failedGetResponse = await request(server)
|
|
557
|
-
.get('/')
|
|
558
|
-
.set('Content-Type', 'application/json')
|
|
559
|
-
.query({
|
|
560
|
-
query: 'query GetUsers { users { name } }',
|
|
561
|
-
variables:
|
|
562
|
-
'{ "key1": "value1", "key2": { "nestedKey1": "nestedValue1", "nestedKey2": "nestedValue2" } }'
|
|
563
|
-
});
|
|
564
|
-
|
|
565
|
-
expect(failedGetResponse.statusCode).toBe(404);
|
|
566
|
-
});
|
|
567
|
-
|
|
568
|
-
test('Should strictly compare plain object variables if top level descriptor used', async () => {
|
|
569
|
-
const server = createServer({
|
|
570
|
-
graphql: {
|
|
571
|
-
configs: [
|
|
572
|
-
{
|
|
573
|
-
operationName: 'GetUsers',
|
|
574
|
-
operationType: 'query',
|
|
575
|
-
routes: [
|
|
576
|
-
{
|
|
577
|
-
entities: {
|
|
578
|
-
variables: {
|
|
579
|
-
checkMode: 'equals',
|
|
580
|
-
value: {
|
|
581
|
-
key1: 'value1',
|
|
582
|
-
key2: { nestedKey1: 'nestedValue1' }
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
},
|
|
586
|
-
data: { name: 'John', surname: 'Doe' }
|
|
587
|
-
}
|
|
588
|
-
]
|
|
589
|
-
}
|
|
590
|
-
]
|
|
591
|
-
}
|
|
592
|
-
});
|
|
593
|
-
|
|
594
|
-
const postResponse = await request(server)
|
|
595
|
-
.post('/')
|
|
596
|
-
.set('Content-Type', 'application/json')
|
|
597
|
-
.send({
|
|
598
|
-
query: 'query GetUsers { users { name } }',
|
|
599
|
-
variables: {
|
|
600
|
-
key1: 'value1',
|
|
601
|
-
key2: { nestedKey1: 'nestedValue1' }
|
|
602
|
-
}
|
|
603
|
-
});
|
|
604
|
-
|
|
605
|
-
expect(postResponse.statusCode).toBe(200);
|
|
606
|
-
expect(postResponse.body).toStrictEqual({ name: 'John', surname: 'Doe' });
|
|
607
|
-
|
|
608
|
-
const getResponse = await request(server)
|
|
609
|
-
.get('/')
|
|
610
|
-
.set('Content-Type', 'application/json')
|
|
611
|
-
.query({
|
|
612
|
-
query: 'query GetUsers { users { name } }',
|
|
613
|
-
variables: '{ "key1": "value1", "key2": { "nestedKey1": "nestedValue1" } }'
|
|
614
|
-
});
|
|
615
|
-
|
|
616
|
-
expect(getResponse.statusCode).toBe(200);
|
|
617
|
-
expect(getResponse.body).toStrictEqual({ name: 'John', surname: 'Doe' });
|
|
618
|
-
});
|
|
619
|
-
|
|
620
|
-
test('Should correctly resolve flat object variables with descriptors', async () => {
|
|
621
|
-
const server = createServer({
|
|
622
|
-
graphql: {
|
|
623
|
-
configs: [
|
|
624
|
-
{
|
|
625
|
-
operationName: 'GetUsers',
|
|
626
|
-
operationType: 'query',
|
|
627
|
-
routes: [
|
|
628
|
-
{
|
|
629
|
-
entities: {
|
|
630
|
-
variables: {
|
|
631
|
-
key1: 'value1',
|
|
632
|
-
'key2.nestedKey1': {
|
|
633
|
-
checkMode: 'equals',
|
|
634
|
-
value: 'nestedValue1'
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
},
|
|
638
|
-
data: { name: 'John', surname: 'Doe' }
|
|
639
|
-
}
|
|
640
|
-
]
|
|
641
|
-
}
|
|
642
|
-
]
|
|
643
|
-
}
|
|
644
|
-
});
|
|
645
|
-
|
|
646
|
-
const postResponse = await request(server)
|
|
647
|
-
.post('/')
|
|
648
|
-
.set('Content-Type', 'application/json')
|
|
649
|
-
.send({
|
|
650
|
-
query: 'query GetUsers { users { name } }',
|
|
651
|
-
variables: {
|
|
652
|
-
key1: 'value1',
|
|
653
|
-
key2: { nestedKey1: 'nestedValue1', nestedKey2: 'nestedValue2' }
|
|
654
|
-
}
|
|
655
|
-
});
|
|
656
|
-
|
|
657
|
-
expect(postResponse.statusCode).toBe(200);
|
|
658
|
-
expect(postResponse.body).toStrictEqual({ name: 'John', surname: 'Doe' });
|
|
659
|
-
|
|
660
|
-
const getResponse = await request(server)
|
|
661
|
-
.get('/')
|
|
662
|
-
.set('Content-Type', 'application/json')
|
|
663
|
-
.query({
|
|
664
|
-
query: 'query GetUsers { users { name } }',
|
|
665
|
-
variables:
|
|
666
|
-
'{ "key1": "value1", "key2": { "nestedKey1": "nestedValue1", "nestedKey2": "nestedValue2" } }'
|
|
667
|
-
});
|
|
668
|
-
|
|
669
|
-
expect(getResponse.statusCode).toBe(200);
|
|
670
|
-
expect(getResponse.body).toStrictEqual({ name: 'John', surname: 'Doe' });
|
|
671
|
-
});
|
|
672
|
-
|
|
673
|
-
test('Should be case-insensitive for header keys', async () => {
|
|
674
|
-
const server = createServer({
|
|
675
|
-
graphql: {
|
|
676
|
-
configs: [
|
|
677
|
-
{
|
|
678
|
-
operationName: 'GetUsers',
|
|
679
|
-
operationType: 'query',
|
|
680
|
-
routes: [
|
|
681
|
-
{
|
|
682
|
-
entities: {
|
|
683
|
-
headers: {
|
|
684
|
-
lowercase: 'lowercase',
|
|
685
|
-
UPPERCASE: 'UPPERCASE'
|
|
686
|
-
}
|
|
687
|
-
},
|
|
688
|
-
data: { name: 'John', surname: 'Doe' }
|
|
689
|
-
}
|
|
690
|
-
]
|
|
691
|
-
}
|
|
692
|
-
]
|
|
693
|
-
}
|
|
694
|
-
});
|
|
695
|
-
|
|
696
|
-
const postResponse = await request(server)
|
|
697
|
-
.post('/')
|
|
698
|
-
.send({ query: 'query GetUsers { users { name } }' })
|
|
699
|
-
.set({ LowerCase: 'lowercase', upperCase: 'UPPERCASE' });
|
|
700
|
-
|
|
701
|
-
expect(postResponse.statusCode).toBe(200);
|
|
702
|
-
expect(postResponse.body).toStrictEqual({ name: 'John', surname: 'Doe' });
|
|
703
|
-
|
|
704
|
-
const getResponse = await request(server)
|
|
705
|
-
.get('/')
|
|
706
|
-
.set({ LowerCase: 'lowercase', upperCase: 'UPPERCASE' })
|
|
707
|
-
.query({ query: 'query GetUsers { users { name } }' });
|
|
708
|
-
|
|
709
|
-
expect(getResponse.statusCode).toBe(200);
|
|
710
|
-
expect(getResponse.body).toStrictEqual({ name: 'John', surname: 'Doe' });
|
|
711
|
-
});
|
|
712
|
-
});
|
|
713
|
-
|
|
714
|
-
describe('createRestRoutes: interceptors', () => {
|
|
715
|
-
test('Should call request interceptor', async () => {
|
|
716
|
-
const requestInterceptor = jest.fn();
|
|
717
|
-
const server = createServer({
|
|
718
|
-
graphql: {
|
|
719
|
-
configs: [
|
|
720
|
-
{
|
|
721
|
-
operationName: 'GetUsers',
|
|
722
|
-
operationType: 'query',
|
|
723
|
-
routes: [
|
|
724
|
-
{
|
|
725
|
-
entities: {
|
|
726
|
-
variables: {
|
|
727
|
-
key1: 'value1',
|
|
728
|
-
key2: 'value2'
|
|
729
|
-
}
|
|
730
|
-
},
|
|
731
|
-
data: { name: 'John', surname: 'Doe' }
|
|
732
|
-
}
|
|
733
|
-
],
|
|
734
|
-
interceptors: { request: requestInterceptor }
|
|
735
|
-
},
|
|
736
|
-
{
|
|
737
|
-
operationName: 'CreateUser',
|
|
738
|
-
operationType: 'mutation',
|
|
739
|
-
routes: [
|
|
740
|
-
{
|
|
741
|
-
entities: {
|
|
742
|
-
variables: {
|
|
743
|
-
key1: 'value1',
|
|
744
|
-
key2: 'value2'
|
|
745
|
-
}
|
|
746
|
-
},
|
|
747
|
-
data: { name: 'John', surname: 'Smith' }
|
|
748
|
-
}
|
|
749
|
-
]
|
|
750
|
-
}
|
|
751
|
-
]
|
|
752
|
-
}
|
|
753
|
-
});
|
|
754
|
-
|
|
755
|
-
await request(server).get('/').set('Content-Type', 'application/json').query({
|
|
756
|
-
query: 'query GetUsers { users { name } }',
|
|
757
|
-
variables: '{ "key1": "value1", "key2": "value2" }'
|
|
758
|
-
});
|
|
759
|
-
expect(requestInterceptor.mock.calls.length).toBe(1);
|
|
760
|
-
|
|
761
|
-
await request(server)
|
|
762
|
-
.post('/')
|
|
763
|
-
.set('Content-Type', 'application/json')
|
|
764
|
-
.send({
|
|
765
|
-
query: 'mutation CreateUser($name: String!) { createUser(name: $name) { name } }',
|
|
766
|
-
variables: { key1: 'value1', key2: 'value2' }
|
|
767
|
-
});
|
|
768
|
-
expect(requestInterceptor.mock.calls.length).toBe(1);
|
|
769
|
-
});
|
|
770
|
-
|
|
771
|
-
test('Should call response interceptors in order: route -> request -> server', async () => {
|
|
772
|
-
const routeInterceptor = jest.fn();
|
|
773
|
-
const requestInterceptor = jest.fn();
|
|
774
|
-
const serverInterceptor = jest.fn();
|
|
775
|
-
const server = createServer({
|
|
776
|
-
graphql: {
|
|
777
|
-
configs: [
|
|
778
|
-
{
|
|
779
|
-
operationName: 'GetUsers',
|
|
780
|
-
operationType: 'query',
|
|
781
|
-
routes: [
|
|
782
|
-
{
|
|
783
|
-
entities: {
|
|
784
|
-
variables: {
|
|
785
|
-
key1: 'value1',
|
|
786
|
-
key2: 'value2'
|
|
787
|
-
}
|
|
788
|
-
},
|
|
789
|
-
data: { name: 'John', surname: 'Doe' },
|
|
790
|
-
interceptors: { response: routeInterceptor }
|
|
791
|
-
}
|
|
792
|
-
],
|
|
793
|
-
interceptors: { response: requestInterceptor }
|
|
794
|
-
},
|
|
795
|
-
{
|
|
796
|
-
operationName: 'CreateUser',
|
|
797
|
-
operationType: 'mutation',
|
|
798
|
-
routes: [
|
|
799
|
-
{
|
|
800
|
-
entities: {
|
|
801
|
-
variables: {
|
|
802
|
-
key1: 'value1',
|
|
803
|
-
key2: 'value2'
|
|
804
|
-
}
|
|
805
|
-
},
|
|
806
|
-
data: { name: 'John', surname: 'Smith' }
|
|
807
|
-
}
|
|
808
|
-
]
|
|
809
|
-
}
|
|
810
|
-
]
|
|
811
|
-
},
|
|
812
|
-
interceptors: { response: serverInterceptor }
|
|
813
|
-
});
|
|
814
|
-
|
|
815
|
-
await request(server).get('/').set('Content-Type', 'application/json').query({
|
|
816
|
-
query: 'query GetUsers { users { name } }',
|
|
817
|
-
variables: '{ "key1": "value1", "key2": "value2" }'
|
|
818
|
-
});
|
|
819
|
-
expect(routeInterceptor.mock.calls.length).toBe(1);
|
|
820
|
-
expect(requestInterceptor.mock.calls.length).toBe(1);
|
|
821
|
-
expect(serverInterceptor.mock.calls.length).toBe(1);
|
|
822
|
-
expect(routeInterceptor.mock.invocationCallOrder[0]).toBeLessThan(
|
|
823
|
-
requestInterceptor.mock.invocationCallOrder[0]
|
|
824
|
-
);
|
|
825
|
-
expect(requestInterceptor.mock.invocationCallOrder[0]).toBeLessThan(
|
|
826
|
-
serverInterceptor.mock.invocationCallOrder[0]
|
|
827
|
-
);
|
|
828
|
-
|
|
829
|
-
await request(server)
|
|
830
|
-
.post('/')
|
|
831
|
-
.set('Content-Type', 'application/json')
|
|
832
|
-
.send({
|
|
833
|
-
query: 'mutation CreateUser($name: String!) { createUser(name: $name) { name } }',
|
|
834
|
-
variables: { key1: 'value1', key2: 'value2' }
|
|
835
|
-
});
|
|
836
|
-
expect(routeInterceptor.mock.calls.length).toBe(1);
|
|
837
|
-
expect(requestInterceptor.mock.calls.length).toBe(1);
|
|
838
|
-
expect(serverInterceptor.mock.calls.length).toBe(2);
|
|
839
|
-
|
|
840
|
-
await request(server)
|
|
841
|
-
.post('/')
|
|
842
|
-
.set('Content-Type', 'application/json')
|
|
843
|
-
.send({
|
|
844
|
-
query: 'query GetSettings { settings { notifications } }',
|
|
845
|
-
variables: { key1: 'value1', key2: 'value2' }
|
|
846
|
-
});
|
|
847
|
-
expect(routeInterceptor.mock.calls.length).toBe(1);
|
|
848
|
-
expect(requestInterceptor.mock.calls.length).toBe(1);
|
|
849
|
-
expect(serverInterceptor.mock.calls.length).toBe(2);
|
|
850
|
-
});
|
|
851
|
-
});
|