payload 0.20.10-beta.0 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +592 -853
  2. package/components/styles.css +1 -1
  3. package/dist/admin/components/elements/Banner/index.scss +1 -0
  4. package/dist/admin/components/elements/Nav/index.js +2 -2
  5. package/dist/admin/components/forms/field-types/Array/Array.js +1 -1
  6. package/dist/admin/components/forms/field-types/Blocks/Blocks.js +1 -1
  7. package/dist/admin/components/forms/field-types/Checkbox/index.js +1 -1
  8. package/dist/admin/components/forms/field-types/Code/Code.js +1 -1
  9. package/dist/admin/components/forms/field-types/DateTime/index.js +1 -1
  10. package/dist/admin/components/forms/field-types/Email/index.js +2 -2
  11. package/dist/admin/components/forms/field-types/Group/index.js +1 -1
  12. package/dist/admin/components/forms/field-types/HiddenInput/index.js +1 -1
  13. package/dist/admin/components/forms/field-types/Number/index.js +2 -2
  14. package/dist/admin/components/forms/field-types/Password/index.js +2 -2
  15. package/dist/admin/components/forms/field-types/Point/index.js +4 -4
  16. package/dist/admin/components/forms/field-types/RadioGroup/Input.js +1 -1
  17. package/dist/admin/components/forms/field-types/Relationship/index.js +1 -1
  18. package/dist/admin/components/forms/field-types/RichText/RichText.js +2 -2
  19. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/index.scss +12 -1
  20. package/dist/admin/components/forms/field-types/RichText/index.scss +7 -0
  21. package/dist/admin/components/forms/field-types/Select/Input.js +2 -2
  22. package/dist/admin/components/forms/field-types/Text/Input.js +2 -2
  23. package/dist/admin/components/forms/field-types/Textarea/Input.js +2 -2
  24. package/dist/admin/components/forms/field-types/Upload/Input.js +1 -1
  25. package/dist/admin/components/views/Global/Default.js +1 -1
  26. package/dist/admin/scss/type.scss +1 -1
  27. package/docs/admin/overview.mdx +4 -0
  28. package/docs/authentication/config.mdx +49 -18
  29. package/package.json +7 -12
  30. package/dist/collections/graphql/resolvers/resolvers.spec.d.ts +0 -1
  31. package/dist/collections/graphql/resolvers/resolvers.spec.js +0 -360
  32. package/dist/collections/operations/local/local.spec.d.ts +0 -1
  33. package/dist/collections/operations/local/local.spec.js +0 -196
  34. package/dist/collections/tests/collections.spec.d.ts +0 -1
  35. package/dist/collections/tests/collections.spec.js +0 -736
  36. package/dist/collections/tests/defaultValue.spec.d.ts +0 -1
  37. package/dist/collections/tests/defaultValue.spec.js +0 -95
  38. package/dist/collections/tests/endpoints.spec.d.ts +0 -1
  39. package/dist/collections/tests/endpoints.spec.js +0 -71
  40. package/dist/collections/tests/hooks.spec.d.ts +0 -1
  41. package/dist/collections/tests/hooks.spec.js +0 -156
  42. package/dist/collections/tests/pointField.spec.d.ts +0 -1
  43. package/dist/collections/tests/pointField.spec.js +0 -219
  44. package/dist/collections/tests/relationships.spec.d.ts +0 -1
  45. package/dist/collections/tests/relationships.spec.js +0 -194
  46. package/dist/express/middleware/errorHandler.spec.d.ts +0 -1
  47. package/dist/express/middleware/errorHandler.spec.js +0 -91
  48. package/dist/globals/requestHandlers/globals.spec.d.ts +0 -4
  49. package/dist/globals/requestHandlers/globals.spec.js +0 -174
  50. package/dist/preferences/graphql/resolvers.spec.d.ts +0 -1
  51. package/dist/preferences/graphql/resolvers.spec.js +0 -115
@@ -1,736 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const uuid_1 = require("uuid");
7
- const load_1 = __importDefault(require("../../config/load"));
8
- const testCredentials_1 = require("../../mongoose/testCredentials");
9
- require('isomorphic-fetch');
10
- const { serverURL: url } = (0, load_1.default)();
11
- let token = null;
12
- let headers = {};
13
- let localizedPost;
14
- let relationshipBID;
15
- const localizedPostTitle = 'title';
16
- const englishPostDesc = 'english description';
17
- const spanishPostDesc = 'spanish description';
18
- describe('Collections - REST', () => {
19
- beforeAll(async (done) => {
20
- const response = await fetch(`${url}/api/admins/login`, {
21
- body: JSON.stringify({
22
- email: testCredentials_1.email,
23
- password: testCredentials_1.password,
24
- }),
25
- headers: {
26
- 'Content-Type': 'application/json',
27
- },
28
- method: 'post',
29
- });
30
- const data = await response.json();
31
- ({ token } = data);
32
- headers = {
33
- Authorization: `JWT ${token}`,
34
- 'Content-Type': 'application/json',
35
- };
36
- done();
37
- });
38
- describe('Create', () => {
39
- let response;
40
- let data;
41
- beforeAll(async () => {
42
- response = await fetch(`${url}/api/localized-posts`, {
43
- body: JSON.stringify({
44
- title: localizedPostTitle,
45
- description: englishPostDesc,
46
- priority: 1,
47
- nonLocalizedGroup: {
48
- text: 'english',
49
- },
50
- localizedGroup: {
51
- text: 'english',
52
- },
53
- nonLocalizedArray: [
54
- {
55
- localizedEmbeddedText: 'english',
56
- },
57
- ],
58
- richTextBlocks: [
59
- {
60
- blockType: 'richTextBlock',
61
- blockName: 'Test Block Name',
62
- content: [
63
- {
64
- children: [{ text: 'english' }],
65
- },
66
- ],
67
- },
68
- ],
69
- }),
70
- headers,
71
- method: 'post',
72
- });
73
- data = await response.json();
74
- });
75
- it('should allow a localized post to be created', async () => {
76
- expect(response.status).toBe(201);
77
- expect(data.doc.title).toBeDefined();
78
- expect(data.doc.id).toBeDefined();
79
- expect(data.doc.nonLocalizedGroup.text).toStrictEqual('english');
80
- expect(data.doc.localizedGroup.text).toStrictEqual('english');
81
- expect(data.doc.nonLocalizedArray[0].localizedEmbeddedText).toStrictEqual('english');
82
- expect(data.doc.richTextBlocks[0].content[0].children[0].text).toStrictEqual('english');
83
- const timestampRegex = /^(\d{4})(?:-?W(\d+)(?:-?(\d+)D?)?|(?:-(\d+))?-(\d+))(?:[T ](\d+):(\d+)(?::(\d+)(?:\.(\d+))?)?)?(?:Z(-?\d*))?$/;
84
- expect(data.doc.createdAt).toStrictEqual(expect.stringMatching(timestampRegex));
85
- expect(data.doc.updatedAt).toStrictEqual(expect.stringMatching(timestampRegex));
86
- localizedPost = data.doc;
87
- });
88
- it('should add id to array items', async () => {
89
- expect(data.doc.nonLocalizedArray[0].id).toBeDefined();
90
- });
91
- it('should add id to block items', async () => {
92
- expect(data.doc.richTextBlocks[0].id).toBeDefined();
93
- });
94
- });
95
- describe('Update', () => {
96
- it('should allow updating an existing post', async () => {
97
- const createResponse = await fetch(`${url}/api/localized-posts`, {
98
- body: JSON.stringify({
99
- title: 'newTitle',
100
- description: 'original description',
101
- richText: [
102
- {
103
- children: [{ text: 'english' }],
104
- },
105
- ],
106
- priority: 1,
107
- }),
108
- headers,
109
- method: 'post',
110
- });
111
- expect(createResponse.status).toBe(201);
112
- const createData = await createResponse.json();
113
- const { id } = createData.doc;
114
- const updatedDesc = 'updated description';
115
- const updatedRichText = [
116
- {
117
- children: [{ text: 'english update' }],
118
- },
119
- ];
120
- const updatedNonLocalizedArray = [
121
- {
122
- localizedEmbeddedText: 'english',
123
- },
124
- {
125
- localizedEmbeddedText: 'english update',
126
- },
127
- ];
128
- const response = await fetch(`${url}/api/localized-posts/${id}`, {
129
- body: JSON.stringify({
130
- title: 'newTitle',
131
- description: updatedDesc,
132
- richText: updatedRichText,
133
- nonLocalizedArray: updatedNonLocalizedArray,
134
- priority: '',
135
- }),
136
- headers,
137
- method: 'put',
138
- });
139
- const data = await response.json();
140
- expect(response.status).toBe(200);
141
- expect(data.doc.description).toBe(updatedDesc);
142
- expect(data.doc.priority).not.toStrictEqual(1);
143
- expect(data.doc.nonLocalizedArray).toHaveLength(2);
144
- expect(data.doc.richText[0].children[0].text).toBe('english update');
145
- // make certain the stored object is exactly the same as the returned object
146
- const stored = await (await fetch(`${url}/api/localized-posts/${id}`, {
147
- method: 'get',
148
- headers,
149
- })).json();
150
- expect(data.doc).toMatchObject(stored);
151
- });
152
- it('should allow a Spanish locale to be added to an existing post', async () => {
153
- const response = await fetch(`${url}/api/localized-posts/${localizedPost.id}?locale=es`, {
154
- body: JSON.stringify({
155
- title: 'title in spanish',
156
- description: spanishPostDesc,
157
- priority: 1,
158
- nonLocalizedGroup: {
159
- text: 'spanish',
160
- },
161
- localizedGroup: {
162
- text: 'spanish',
163
- },
164
- nonLocalizedArray: [
165
- {
166
- id: localizedPost.nonLocalizedArray[0].id,
167
- localizedEmbeddedText: 'spanish',
168
- },
169
- ],
170
- richTextBlocks: [
171
- {
172
- id: localizedPost.richTextBlocks[0].id,
173
- blockType: 'richTextBlock',
174
- blockName: 'Test Block Name',
175
- content: [
176
- {
177
- children: [{ text: 'spanish' }],
178
- },
179
- ],
180
- },
181
- ],
182
- }),
183
- headers,
184
- method: 'put',
185
- });
186
- const data = await response.json();
187
- expect(response.status).toBe(200);
188
- expect(data.doc.description).toBe(spanishPostDesc);
189
- expect(data.doc.nonLocalizedGroup.text).toStrictEqual('spanish');
190
- expect(data.doc.localizedGroup.text).toStrictEqual('spanish');
191
- expect(data.doc.nonLocalizedArray[0].localizedEmbeddedText).toStrictEqual('spanish');
192
- expect(data.doc.richTextBlocks[0].content[0].children[0].text).toStrictEqual('spanish');
193
- });
194
- });
195
- describe('Read', () => {
196
- describe('Localized', () => {
197
- it('should allow a localized post to be retrieved in unspecified locale, defaulting to English', async () => {
198
- const response = await fetch(`${url}/api/localized-posts/${localizedPost.id}`);
199
- const data = await response.json();
200
- expect(response.status).toBe(200);
201
- expect(data.description).toBe(englishPostDesc);
202
- expect(data.nonLocalizedGroup.text).toStrictEqual('english');
203
- expect(data.localizedGroup.text).toStrictEqual('english');
204
- expect(data.nonLocalizedArray[0].localizedEmbeddedText).toStrictEqual('english');
205
- expect(data.richTextBlocks[0].content[0].children[0].text).toStrictEqual('english');
206
- });
207
- it('should allow a localized post to be retrieved in specified English locale', async () => {
208
- const response = await fetch(`${url}/api/localized-posts/${localizedPost.id}?locale=en`);
209
- const data = await response.json();
210
- expect(response.status).toBe(200);
211
- expect(data.description).toBe(englishPostDesc);
212
- expect(data.nonLocalizedGroup.text).toStrictEqual('english');
213
- expect(data.localizedGroup.text).toStrictEqual('english');
214
- expect(data.nonLocalizedArray[0].localizedEmbeddedText).toStrictEqual('english');
215
- expect(data.richTextBlocks[0].content[0].children[0].text).toStrictEqual('english');
216
- });
217
- it('should allow a localized post to be retrieved in Spanish', async () => {
218
- const response = await fetch(`${url}/api/localized-posts/${localizedPost.id}?locale=es`);
219
- const data = await response.json();
220
- expect(response.status).toBe(200);
221
- expect(data.description).toBe(spanishPostDesc);
222
- expect(data.nonLocalizedGroup.text).toStrictEqual('spanish');
223
- expect(data.localizedGroup.text).toStrictEqual('spanish');
224
- expect(data.nonLocalizedArray[0].localizedEmbeddedText).toStrictEqual('spanish');
225
- expect(data.richTextBlocks[0].content[0].children[0].text).toStrictEqual('spanish');
226
- });
227
- it('should allow a localized post to be retrieved in all locales', async () => {
228
- const response = await fetch(`${url}/api/localized-posts/${localizedPost.id}?locale=all`);
229
- const data = await response.json();
230
- expect(response.status).toBe(200);
231
- expect(data.description.es).toBe(spanishPostDesc);
232
- expect(data.description.en).toBe(englishPostDesc);
233
- });
234
- });
235
- it('should allow querying by id', async () => {
236
- const response = await fetch(`${url}/api/localized-posts`, {
237
- body: JSON.stringify({
238
- title: 'another title',
239
- description: 'description',
240
- priority: 1,
241
- }),
242
- headers,
243
- method: 'post',
244
- });
245
- expect(response.status).toBe(201);
246
- const data = await response.json();
247
- const getResponse = await fetch(`${url}/api/localized-posts/${data.doc.id}`);
248
- expect(getResponse.status).toBe(200);
249
- const getData = await getResponse.json();
250
- expect(getData.id).toBeDefined();
251
- });
252
- it('should allow querying on a field', async () => {
253
- const desc = 'query test';
254
- const response = await fetch(`${url}/api/localized-posts`, {
255
- body: JSON.stringify({
256
- title: 'unique title here',
257
- description: desc,
258
- priority: 1,
259
- nonLocalizedGroup: {
260
- text: 'sample content',
261
- },
262
- }),
263
- headers,
264
- method: 'post',
265
- });
266
- expect(response.status).toBe(201);
267
- const getResponse = await fetch(`${url}/api/localized-posts?where[description][equals]=${desc}`);
268
- const data = await getResponse.json();
269
- expect(getResponse.status).toBe(200);
270
- expect(data.docs[0].description).toBe(desc);
271
- expect(data.docs).toHaveLength(1);
272
- const getResponse2 = await fetch(`${url}/api/localized-posts?where[nonLocalizedGroup.text][equals]=sample content`);
273
- const data2 = await getResponse2.json();
274
- expect(getResponse2.status).toBe(200);
275
- expect(data2.docs[0].description).toBe(desc);
276
- expect(data2.docs).toHaveLength(1);
277
- });
278
- it('should allow querying with OR', async () => {
279
- const title1 = 'Or1';
280
- const title2 = 'Or2';
281
- const response = await fetch(`${url}/api/localized-posts`, {
282
- body: JSON.stringify({
283
- title: title1,
284
- description: 'desc',
285
- priority: 1,
286
- }),
287
- headers,
288
- method: 'post',
289
- });
290
- const response2 = await fetch(`${url}/api/localized-posts`, {
291
- body: JSON.stringify({
292
- title: title2,
293
- description: 'desc',
294
- priority: 1,
295
- }),
296
- headers,
297
- method: 'post',
298
- });
299
- expect(response.status).toBe(201);
300
- expect(response2.status).toBe(201);
301
- const queryResponse = await fetch(`${url}/api/localized-posts?where[or][0][title][equals]=${title1}&where[or][1][title][equals]=${title2}`);
302
- const data = await queryResponse.json();
303
- expect(queryResponse.status).toBe(200);
304
- expect(data.docs).toHaveLength(2);
305
- expect(data.docs).toContainEqual(expect.objectContaining({ title: title1 }));
306
- expect(data.docs).toContainEqual(expect.objectContaining({ title: title2 }));
307
- });
308
- it('should allow querying with OR, 1 result', async () => {
309
- const title1 = 'OrNegative1';
310
- const title2 = 'OrNegative2';
311
- const response = await fetch(`${url}/api/localized-posts`, {
312
- body: JSON.stringify({
313
- title: title1,
314
- description: 'desc',
315
- priority: 1,
316
- }),
317
- headers,
318
- method: 'post',
319
- });
320
- const response2 = await fetch(`${url}/api/localized-posts`, {
321
- body: JSON.stringify({
322
- title: title2,
323
- description: 'desc',
324
- priority: 1,
325
- }),
326
- headers,
327
- method: 'post',
328
- });
329
- expect(response.status).toBe(201);
330
- expect(response2.status).toBe(201);
331
- const queryResponse = await fetch(`${url}/api/localized-posts?where[or][0][title][equals]=${title1}&where[or][1][title][equals]=nonexistent`);
332
- const data = await queryResponse.json();
333
- expect(queryResponse.status).toBe(200);
334
- expect(data.docs).toHaveLength(1);
335
- expect(data.docs[0].title).toBe(title1);
336
- });
337
- it('should allow querying by a non-localized nested relationship property', async () => {
338
- const relationshipBTitle = 'test';
339
- const relationshipBRes = await fetch(`${url}/api/relationship-b?depth=0`, {
340
- body: JSON.stringify({
341
- title: relationshipBTitle,
342
- }),
343
- headers,
344
- method: 'post',
345
- });
346
- const relationshipBData = await relationshipBRes.json();
347
- const res = await fetch(`${url}/api/relationship-a?depth=0`, {
348
- body: JSON.stringify({
349
- post: relationshipBData.doc.id,
350
- }),
351
- headers,
352
- method: 'post',
353
- });
354
- const additionalRelationshipARes = await fetch(`${url}/api/relationship-a?depth=0`, {
355
- body: JSON.stringify({
356
- postLocalizedMultiple: [
357
- {
358
- relationTo: 'localized-posts',
359
- value: localizedPost.id,
360
- },
361
- ],
362
- }),
363
- headers,
364
- method: 'post',
365
- });
366
- const relationshipAData = await res.json();
367
- expect(res.status).toBe(201);
368
- expect(additionalRelationshipARes.status).toBe(201);
369
- expect(relationshipAData.doc.post).toBe(relationshipBData.doc.id);
370
- const queryRes = await fetch(`${url}/api/relationship-a?where[post.title][equals]=${relationshipBTitle}`);
371
- const data = await queryRes.json();
372
- expect(data.docs).toHaveLength(1);
373
- });
374
- it('should allow querying by a localized nested relationship property', async () => {
375
- const res = await fetch(`${url}/api/relationship-a`, {
376
- body: JSON.stringify({
377
- LocalizedPost: [localizedPost.id],
378
- }),
379
- headers,
380
- method: 'post',
381
- });
382
- expect(res.status).toBe(201);
383
- const queryRes1 = await fetch(`${url}/api/relationship-a?where[LocalizedPost.title][in]=${localizedPostTitle}`);
384
- const data1 = await queryRes1.json();
385
- expect(data1.docs).toHaveLength(1);
386
- });
387
- it('should allow querying by a localized nested relationship with many relationTos', async () => {
388
- const relationshipBTitle = 'lawleifjawelifjew';
389
- const relationshipB = await fetch(`${url}/api/relationship-b?depth=0`, {
390
- body: JSON.stringify({
391
- title: relationshipBTitle,
392
- }),
393
- headers,
394
- method: 'post',
395
- }).then((res) => res.json());
396
- expect(relationshipB.doc.id).toBeDefined();
397
- const res = await fetch(`${url}/api/relationship-a`, {
398
- body: JSON.stringify({
399
- postManyRelationships: {
400
- value: relationshipB.doc.id,
401
- relationTo: 'relationship-b',
402
- },
403
- }),
404
- headers,
405
- method: 'post',
406
- });
407
- expect(res.status).toBe(201);
408
- const queryRes = await fetch(`${url}/api/relationship-a?where[postManyRelationships.value][equals]=${relationshipB.doc.id}`);
409
- const data = await queryRes.json();
410
- expect(data.docs).toHaveLength(1);
411
- });
412
- it('should allow querying by a non-localized relationship with many relationTos', async () => {
413
- const relationshipB = await fetch(`${url}/api/relationship-b?depth=0`, {
414
- body: JSON.stringify({
415
- title: 'awefjlaiwejfalweiijfaew',
416
- nonLocalizedRelationToMany: {
417
- relationTo: 'localized-posts',
418
- value: localizedPost.id,
419
- },
420
- }),
421
- headers,
422
- method: 'post',
423
- }).then((res) => res.json());
424
- expect(relationshipB.doc.id).toBeDefined();
425
- relationshipBID = relationshipB.doc.id;
426
- const queryRes = await fetch(`${url}/api/relationship-b?where[nonLocalizedRelationToMany.value][equals]=${localizedPost.id}`);
427
- const data = await queryRes.json();
428
- expect(data.docs).toHaveLength(1);
429
- });
430
- it('should propagate locale through populated documents', async () => {
431
- const relationshipB = await fetch(`${url}/api/relationship-b/${relationshipBID}?locale=es`, {
432
- headers,
433
- });
434
- const data = await relationshipB.json();
435
- expect(data.nonLocalizedRelationToMany.value.description).toBe(spanishPostDesc);
436
- });
437
- it('should allow querying by a numeric custom ID', async () => {
438
- const customID = 1988;
439
- const customIDResult = await fetch(`${url}/api/custom-id?depth=0`, {
440
- body: JSON.stringify({
441
- id: customID,
442
- name: 'woohoo',
443
- }),
444
- headers,
445
- method: 'post',
446
- }).then((res) => res.json());
447
- expect(customIDResult.doc.id).toStrictEqual(customID);
448
- await fetch(`${url}/api/custom-id?depth=0`, {
449
- body: JSON.stringify({
450
- id: 2343452,
451
- name: 'another post',
452
- }),
453
- headers,
454
- method: 'post',
455
- }).then((res) => res.json());
456
- const queryRes1 = await fetch(`${url}/api/custom-id?where[id][equals]=${customID}`, {
457
- headers,
458
- });
459
- const data1 = await queryRes1.json();
460
- expect(data1.docs).toHaveLength(1);
461
- const queryByIDRes = await fetch(`${url}/api/custom-id/${customID}`, {
462
- headers,
463
- });
464
- const queryByIDData = await queryByIDRes.json();
465
- expect(queryByIDData.id).toStrictEqual(customID);
466
- });
467
- it('should allow querying by a field within a group', async () => {
468
- const text = 'laiwjefliajwe';
469
- await fetch(`${url}/api/localized-posts`, {
470
- body: JSON.stringify({
471
- title: 'super great title',
472
- description: 'desc',
473
- priority: 1,
474
- nonLocalizedGroup: {
475
- text,
476
- },
477
- localizedGroup: {
478
- text,
479
- },
480
- }),
481
- headers,
482
- method: 'post',
483
- });
484
- const queryRes1 = await fetch(`${url}/api/localized-posts?where[nonLocalizedGroup.text][equals]=${text}`);
485
- const data1 = await queryRes1.json();
486
- expect(data1.docs).toHaveLength(1);
487
- const queryRes2 = await fetch(`${url}/api/localized-posts?where[localizedGroup.text][equals]=${text}`);
488
- const data2 = await queryRes2.json();
489
- expect(queryRes2.status).toBe(200);
490
- expect(data2.docs).toHaveLength(1);
491
- });
492
- });
493
- describe('Delete', () => {
494
- it('should allow a post to be deleted', async () => {
495
- const response = await fetch(`${url}/api/localized-posts`, {
496
- body: JSON.stringify({
497
- title: 'title to be deleted',
498
- description: englishPostDesc,
499
- priority: 1,
500
- }),
501
- headers,
502
- method: 'post',
503
- });
504
- const data = await response.json();
505
- const docId = data.doc.id;
506
- expect(response.status).toBe(201);
507
- expect(docId).toBeDefined();
508
- const deleteResponse = await fetch(`${url}/api/localized-posts/${docId}`, {
509
- headers,
510
- method: 'delete',
511
- });
512
- const deleteData = await deleteResponse.json();
513
- expect(deleteResponse.status).toBe(200);
514
- expect(deleteData.id).toBe(docId);
515
- });
516
- });
517
- describe('Metadata', () => {
518
- async function createPost(title, description) {
519
- await fetch(`${url}/api/localized-posts`, {
520
- body: JSON.stringify({
521
- title: title || (0, uuid_1.v4)(),
522
- description,
523
- priority: 1,
524
- }),
525
- headers,
526
- method: 'post',
527
- });
528
- }
529
- it('should include metadata', async () => {
530
- const desc = 'metadataDesc';
531
- for (let i = 0; i < 12; i += 1) {
532
- // eslint-disable-next-line no-await-in-loop
533
- await createPost(null, desc);
534
- }
535
- const getResponse = await fetch(`${url}/api/localized-posts?where[description][equals]=${desc}`);
536
- const data = await getResponse.json();
537
- expect(getResponse.status).toBe(200);
538
- // TODO: Assert exact length once query bug is fixed
539
- expect(data.docs.length).toBeGreaterThan(0);
540
- expect(data.totalDocs).toBeGreaterThan(0);
541
- expect(data.limit).toBe(10);
542
- expect(data.page).toBe(1);
543
- expect(data.pagingCounter).toBe(1);
544
- expect(data.hasPrevPage).toBe(false);
545
- expect(data.hasNextPage).toBe(true);
546
- expect(data.prevPage).toBeNull();
547
- expect(data.nextPage).toBe(2);
548
- });
549
- it('should sort the results', async () => {
550
- const desc = 'sort';
551
- // Create 2 posts with different titles, same desc
552
- const req1 = await fetch(`${url}/api/localized-posts`, {
553
- body: JSON.stringify({
554
- title: 'aaa',
555
- description: desc,
556
- priority: 1,
557
- }),
558
- headers,
559
- method: 'post',
560
- });
561
- const req2 = await fetch(`${url}/api/localized-posts`, {
562
- body: JSON.stringify({
563
- title: 'zzz',
564
- description: desc,
565
- priority: 1,
566
- }),
567
- headers,
568
- method: 'post',
569
- });
570
- const req1data = await req1.json();
571
- const req2data = await req2.json();
572
- const id1 = req1data.doc.id;
573
- const id2 = req2data.doc.id;
574
- // Query on shared desc and sort ascending
575
- const getResponse = await fetch(`${url}/api/localized-posts?where[description][equals]=${desc}&sort=title`);
576
- const data = await getResponse.json();
577
- expect(getResponse.status).toBe(200);
578
- expect(data.docs).toHaveLength(2);
579
- expect(data.docs[0].id).toStrictEqual(id1);
580
- expect(data.docs[1].id).toStrictEqual(id2);
581
- // Query on shared desc and sort descending
582
- const getResponseSorted = await fetch(`${url}/api/localized-posts?where[description][equals]=${desc}&sort=-title`);
583
- const sortedData = await getResponseSorted.json();
584
- expect(getResponse.status).toBe(200);
585
- expect(sortedData.docs).toHaveLength(2);
586
- // Opposite order from first request
587
- expect(sortedData.docs[0].id).toStrictEqual(id2);
588
- expect(sortedData.docs[1].id).toStrictEqual(id1);
589
- });
590
- });
591
- describe('Field Access', () => {
592
- it('should properly prevent / allow public users from reading a restricted field', async () => {
593
- const firstArrayText1 = 'test 1';
594
- const firstArrayText2 = 'test 2';
595
- const response = await fetch(`${url}/api/localized-arrays`, {
596
- body: JSON.stringify({
597
- array: [
598
- {
599
- arrayText1: firstArrayText1,
600
- arrayText2: 'test 2',
601
- arrayText3: 'test 3',
602
- allowPublicReadability: true,
603
- },
604
- {
605
- arrayText1: firstArrayText2,
606
- arrayText2: 'test 2',
607
- arrayText3: 'test 3',
608
- allowPublicReadability: false,
609
- },
610
- ],
611
- }),
612
- headers,
613
- method: 'post',
614
- });
615
- const data = await response.json();
616
- const docId = data.doc.id;
617
- expect(response.status).toBe(201);
618
- expect(data.doc.array[1].arrayText1).toStrictEqual(firstArrayText2);
619
- const unauthenticatedResponse = await fetch(`${url}/api/localized-arrays/${docId}`, {
620
- headers: {
621
- 'Content-Type': 'application/json',
622
- },
623
- });
624
- expect(unauthenticatedResponse.status).toBe(200);
625
- const unauthenticatedData = await unauthenticatedResponse.json();
626
- // This string should be allowed to come back
627
- expect(unauthenticatedData.array[0].arrayText1).toBe(firstArrayText1);
628
- // This string should be prevented from coming back
629
- expect(unauthenticatedData.array[1].arrayText1).toBeUndefined();
630
- const authenticatedResponse = await fetch(`${url}/api/localized-arrays/${docId}`, {
631
- headers,
632
- });
633
- const authenticatedData = await authenticatedResponse.json();
634
- // If logged in, we should get this field back
635
- expect(authenticatedData.array[1].arrayText1).toStrictEqual(firstArrayText2);
636
- });
637
- });
638
- describe('Unique', () => {
639
- it('should prevent unique fields from duplicating data', async () => {
640
- const nonUniqueTitle = 'title';
641
- const response = await fetch(`${url}/api/uniques`, {
642
- body: JSON.stringify({
643
- title: nonUniqueTitle,
644
- }),
645
- headers,
646
- method: 'post',
647
- });
648
- const data = await response.json();
649
- expect(response.status).toBe(201);
650
- expect(data.doc.title).toStrictEqual(nonUniqueTitle);
651
- const failedResponse = await fetch(`${url}/api/uniques`, {
652
- body: JSON.stringify({
653
- title: nonUniqueTitle,
654
- }),
655
- headers,
656
- method: 'post',
657
- });
658
- expect(failedResponse.status).toStrictEqual(500);
659
- });
660
- });
661
- describe('Custom ID', () => {
662
- const document = {
663
- id: 1,
664
- name: 'name',
665
- };
666
- let data;
667
- beforeAll(async (done) => {
668
- // create document
669
- const create = await fetch(`${url}/api/custom-id`, {
670
- body: JSON.stringify(document),
671
- headers,
672
- method: 'post',
673
- });
674
- data = await create.json();
675
- done();
676
- });
677
- it('should create collections with custom ID', async () => {
678
- expect(data.doc.id).toBe(document.id);
679
- });
680
- it('should read collections by custom ID', async () => {
681
- const response = await fetch(`${url}/api/custom-id/${document.id}`, {
682
- headers,
683
- method: 'get',
684
- });
685
- const result = await response.json();
686
- expect(result.id).toStrictEqual(document.id);
687
- expect(result.name).toStrictEqual(document.name);
688
- });
689
- it('should update collection by custom ID', async () => {
690
- const updatedDoc = { id: 'cannot-update-id', name: 'updated' };
691
- const response = await fetch(`${url}/api/custom-id/${document.id}`, {
692
- headers,
693
- body: JSON.stringify(updatedDoc),
694
- method: 'put',
695
- });
696
- const result = await response.json();
697
- expect(result.doc.id).not.toStrictEqual(updatedDoc.id);
698
- expect(result.doc.name).not.toStrictEqual(document.name);
699
- expect(result.doc.name).toStrictEqual(updatedDoc.name);
700
- });
701
- it('should delete collection by custom ID', async () => {
702
- const doc = {
703
- id: 2,
704
- name: 'delete me',
705
- };
706
- const createResponse = await fetch(`${url}/api/custom-id`, {
707
- body: JSON.stringify(doc),
708
- headers,
709
- method: 'post',
710
- });
711
- const result = await createResponse.json();
712
- const response = await fetch(`${url}/api/custom-id/${result.doc.id}`, {
713
- headers,
714
- method: 'delete',
715
- });
716
- expect(response.status).toBe(200);
717
- const deleteData = await response.json();
718
- expect(deleteData.id).toBe(doc.id);
719
- });
720
- it('should allow querying by custom ID', async () => {
721
- const response = await fetch(`${url}/api/custom-id?where[id][equals]=${document.id}`, {
722
- headers,
723
- method: 'get',
724
- });
725
- const emptyResponse = await fetch(`${url}/api/custom-id?where[id][equals]=900`, {
726
- headers,
727
- method: 'get',
728
- });
729
- const result = await response.json();
730
- const emptyResult = await emptyResponse.json();
731
- expect(result.docs).toHaveLength(1);
732
- expect(emptyResult.docs).toHaveLength(0);
733
- });
734
- });
735
- });
736
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbnMuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb2xsZWN0aW9ucy90ZXN0cy9jb2xsZWN0aW9ucy5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0JBQWtDO0FBQ2xDLDZEQUEwQztBQUMxQyxvRUFBaUU7QUFFakUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFNUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFBLGNBQVMsR0FBRSxDQUFDO0FBRXZDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztBQUNqQixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFFakIsSUFBSSxhQUFhLENBQUM7QUFDbEIsSUFBSSxlQUFlLENBQUM7QUFDcEIsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUM7QUFDbkMsTUFBTSxlQUFlLEdBQUcscUJBQXFCLENBQUM7QUFDOUMsTUFBTSxlQUFlLEdBQUcscUJBQXFCLENBQUM7QUFFOUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtJQUNsQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3ZCLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsR0FBRyxtQkFBbUIsRUFBRTtZQUN0RCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDbkIsS0FBSyxFQUFMLHVCQUFLO2dCQUNMLFFBQVEsRUFBUiwwQkFBUTthQUNULENBQUM7WUFDRixPQUFPLEVBQUU7Z0JBQ1AsY0FBYyxFQUFFLGtCQUFrQjthQUNuQztZQUNELE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFbkMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ25CLE9BQU8s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