| 
									
										
										
										
											2020-10-27 11:27:17 +01:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  | // Test a simple default API with no relations
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-05 10:32:20 +02:00
										 |  |  | const { createTestBuilder } = require('api-tests/builder'); | 
					
						
							|  |  |  | const { createStrapiInstance } = require('api-tests/strapi'); | 
					
						
							|  |  |  | const { createAuthRequest } = require('api-tests/request'); | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  | const builder = createTestBuilder(); | 
					
						
							|  |  |  | let strapi; | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  | let rq; | 
					
						
							| 
									
										
										
										
											2022-08-08 15:50:34 +02:00
										 |  |  | const data = { | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |   productsWithDzAndDP: [], | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const compo = { | 
					
						
							| 
									
										
										
										
											2021-11-02 18:27:49 +01:00
										 |  |  |   displayName: 'compo', | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |   attributes: { | 
					
						
							|  |  |  |     name: { | 
					
						
							|  |  |  |       type: 'string', | 
					
						
							|  |  |  |       required: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     description: { | 
					
						
							|  |  |  |       type: 'text', | 
					
						
							|  |  |  |       minLength: 4, | 
					
						
							|  |  |  |       maxLength: 30, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const productWithCompoAndDP = { | 
					
						
							|  |  |  |   attributes: { | 
					
						
							|  |  |  |     name: { | 
					
						
							|  |  |  |       type: 'string', | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     description: { | 
					
						
							|  |  |  |       type: 'text', | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     dz: { | 
					
						
							|  |  |  |       components: ['default.compo'], | 
					
						
							|  |  |  |       type: 'dynamiczone', | 
					
						
							|  |  |  |       required: true, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   draftAndPublish: true, | 
					
						
							| 
									
										
										
										
											2021-09-13 16:57:04 +02:00
										 |  |  |   displayName: 'product with dz and DP', | 
					
						
							|  |  |  |   singularName: 'product-with-dz-and-dp', | 
					
						
							|  |  |  |   pluralName: 'product-with-dz-and-dps', | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |   description: '', | 
					
						
							|  |  |  |   collectionName: '', | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('CM API - Basic + dz + draftAndPublish', () => { | 
					
						
							|  |  |  |   beforeAll(async () => { | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |     await builder.addComponent(compo).addContentType(productWithCompoAndDP).build(); | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-30 20:20:36 +01:00
										 |  |  |     strapi = await createStrapiInstance(); | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |     rq = await createAuthRequest({ strapi }); | 
					
						
							| 
									
										
										
										
											2021-03-26 20:15:38 +01:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   afterAll(async () => { | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |     await strapi.destroy(); | 
					
						
							|  |  |  |     await builder.cleanup(); | 
					
						
							| 
									
										
										
										
											2021-03-26 20:15:38 +01:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   test('Create product with compo', async () => { | 
					
						
							|  |  |  |     const product = { | 
					
						
							|  |  |  |       name: 'Product 1', | 
					
						
							|  |  |  |       description: 'Product description', | 
					
						
							|  |  |  |       dz: [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           __component: 'default.compo', | 
					
						
							|  |  |  |           name: 'compo name', | 
					
						
							|  |  |  |           description: 'short', | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     const res = await rq({ | 
					
						
							|  |  |  |       method: 'POST', | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |       url: '/content-manager/collection-types/api::product-with-dz-and-dp.product-with-dz-and-dp', | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |       body: product, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(res.statusCode).toBe(200); | 
					
						
							|  |  |  |     expect(res.body).toMatchObject(product); | 
					
						
							| 
									
										
										
										
											2021-09-22 12:14:41 +02:00
										 |  |  |     expect(res.body.publishedAt).toBeNull(); | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |     data.productsWithDzAndDP.push(res.body); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   test('Read product with compo', async () => { | 
					
						
							|  |  |  |     const res = await rq({ | 
					
						
							|  |  |  |       method: 'GET', | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |       url: `/content-manager/collection-types/api::product-with-dz-and-dp.product-with-dz-and-dp/${data.productsWithDzAndDP[0].id}`, | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(res.statusCode).toBe(200); | 
					
						
							| 
									
										
										
										
											2021-07-30 21:15:58 +02:00
										 |  |  |     expect(res.body).toMatchObject(data.productsWithDzAndDP[0]); | 
					
						
							| 
									
										
										
										
											2021-09-22 12:14:41 +02:00
										 |  |  |     expect(res.body.publishedAt).toBeNull(); | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   test('Update product with compo', async () => { | 
					
						
							|  |  |  |     const product = { | 
					
						
							|  |  |  |       name: 'Product 1 updated', | 
					
						
							|  |  |  |       description: 'Updated Product description', | 
					
						
							|  |  |  |       dz: [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           __component: 'default.compo', | 
					
						
							|  |  |  |           name: 'compo name updated', | 
					
						
							|  |  |  |           description: 'update', | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     const res = await rq({ | 
					
						
							|  |  |  |       method: 'PUT', | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |       url: `/content-manager/collection-types/api::product-with-dz-and-dp.product-with-dz-and-dp/${data.productsWithDzAndDP[0].id}`, | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |       body: product, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(res.statusCode).toBe(200); | 
					
						
							|  |  |  |     expect(res.body).toMatchObject(product); | 
					
						
							|  |  |  |     expect(res.body.id).toEqual(data.productsWithDzAndDP[0].id); | 
					
						
							| 
									
										
										
										
											2021-09-22 12:14:41 +02:00
										 |  |  |     expect(res.body.publishedAt).toBeNull(); | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |     data.productsWithDzAndDP[0] = res.body; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   test('Delete product with compo', async () => { | 
					
						
							|  |  |  |     const res = await rq({ | 
					
						
							|  |  |  |       method: 'DELETE', | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |       url: `/content-manager/collection-types/api::product-with-dz-and-dp.product-with-dz-and-dp/${data.productsWithDzAndDP[0].id}`, | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(res.statusCode).toBe(200); | 
					
						
							|  |  |  |     expect(res.body).toMatchObject(data.productsWithDzAndDP[0]); | 
					
						
							|  |  |  |     expect(res.body.id).toEqual(data.productsWithDzAndDP[0].id); | 
					
						
							| 
									
										
										
										
											2021-09-22 12:14:41 +02:00
										 |  |  |     expect(res.body.publishedAt).toBeNull(); | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |     data.productsWithDzAndDP.shift(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('validation', () => { | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |     describe.each(['create', 'update'])('%p', (method) => { | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |       test(`Can ${method} product with compo - compo required - []`, async () => { | 
					
						
							|  |  |  |         const product = { | 
					
						
							|  |  |  |           name: 'Product 1', | 
					
						
							|  |  |  |           description: 'Product description', | 
					
						
							|  |  |  |           dz: [], | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         const res = await rq({ | 
					
						
							|  |  |  |           method: method === 'create' ? 'POST' : 'PUT', | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |           url: `/content-manager/collection-types/api::product-with-dz-and-dp.product-with-dz-and-dp/${ | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |             method === 'update' ? data.productsWithDzAndDP[0].id : '' | 
					
						
							|  |  |  |           }`,
 | 
					
						
							|  |  |  |           body: product, | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(res.statusCode).toBe(200); | 
					
						
							|  |  |  |         expect(res.body).toMatchObject(product); | 
					
						
							|  |  |  |         data.productsWithDzAndDP.push(res.body); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test(`Can ${method} product with compo - minLength`, async () => { | 
					
						
							|  |  |  |         const product = { | 
					
						
							|  |  |  |           name: 'Product 1', | 
					
						
							|  |  |  |           description: 'Product description', | 
					
						
							|  |  |  |           dz: [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |               __component: 'default.compo', | 
					
						
							|  |  |  |               name: 'compo name', | 
					
						
							|  |  |  |               description: 'k', | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           ], | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         const res = await rq({ | 
					
						
							|  |  |  |           method: method === 'create' ? 'POST' : 'PUT', | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |           url: `/content-manager/collection-types/api::product-with-dz-and-dp.product-with-dz-and-dp/${ | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |             method === 'update' ? data.productsWithDzAndDP[0].id : '' | 
					
						
							|  |  |  |           }`,
 | 
					
						
							|  |  |  |           body: product, | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(res.statusCode).toBe(200); | 
					
						
							|  |  |  |         expect(res.body).toMatchObject(product); | 
					
						
							|  |  |  |         data.productsWithDzAndDP.push(res.body); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test(`Cannot ${method} product with compo - maxLength`, async () => { | 
					
						
							|  |  |  |         const product = { | 
					
						
							|  |  |  |           name: 'Product 1', | 
					
						
							|  |  |  |           description: 'Product description', | 
					
						
							|  |  |  |           dz: [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |               __component: 'default.compo', | 
					
						
							|  |  |  |               name: 'compo name', | 
					
						
							|  |  |  |               description: 'A very long description that exceed the min length.', | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           ], | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         const res = await rq({ | 
					
						
							|  |  |  |           method: method === 'create' ? 'POST' : 'PUT', | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |           url: `/content-manager/collection-types/api::product-with-dz-and-dp.product-with-dz-and-dp/${ | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |             method === 'update' ? data.productsWithDzAndDP[0].id : '' | 
					
						
							|  |  |  |           }`,
 | 
					
						
							|  |  |  |           body: product, | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(res.statusCode).toBe(400); | 
					
						
							| 
									
										
										
										
											2021-10-20 17:30:05 +02:00
										 |  |  |         expect(res.body).toMatchObject({ | 
					
						
							|  |  |  |           data: null, | 
					
						
							|  |  |  |           error: { | 
					
						
							|  |  |  |             status: 400, | 
					
						
							|  |  |  |             name: 'ValidationError', | 
					
						
							|  |  |  |             message: 'dz[0].description must be at most 30 characters', | 
					
						
							|  |  |  |             details: { | 
					
						
							|  |  |  |               errors: [ | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                   path: ['dz', '0', 'description'], | 
					
						
							|  |  |  |                   message: 'dz[0].description must be at most 30 characters', | 
					
						
							|  |  |  |                   name: 'ValidationError', | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |               ], | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test(`Can ${method} product with compo - required`, async () => { | 
					
						
							|  |  |  |         const product = { | 
					
						
							|  |  |  |           name: 'Product 1', | 
					
						
							|  |  |  |           description: 'Product description', | 
					
						
							|  |  |  |           dz: [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |               __component: 'default.compo', | 
					
						
							|  |  |  |               description: 'short', | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           ], | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         const res = await rq({ | 
					
						
							|  |  |  |           method: method === 'create' ? 'POST' : 'PUT', | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |           url: `/content-manager/collection-types/api::product-with-dz-and-dp.product-with-dz-and-dp/${ | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |             method === 'update' ? data.productsWithDzAndDP[0].id : '' | 
					
						
							|  |  |  |           }`,
 | 
					
						
							|  |  |  |           body: product, | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(res.statusCode).toBe(200); | 
					
						
							|  |  |  |         expect(res.body).toMatchObject(product); | 
					
						
							|  |  |  |         data.productsWithDzAndDP.push(res.body); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test(`Cannot ${method} product with compo - missing __component`, async () => { | 
					
						
							|  |  |  |         const product = { | 
					
						
							|  |  |  |           name: 'Product 1', | 
					
						
							|  |  |  |           description: 'Product description', | 
					
						
							|  |  |  |           dz: [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |               name: 'Product 1', | 
					
						
							|  |  |  |               description: 'short', | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           ], | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         const res = await rq({ | 
					
						
							|  |  |  |           method: method === 'create' ? 'POST' : 'PUT', | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |           url: `/content-manager/collection-types/api::product-with-dz-and-dp.product-with-dz-and-dp/${ | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |             method === 'update' ? data.productsWithDzAndDP[0].id : '' | 
					
						
							|  |  |  |           }`,
 | 
					
						
							|  |  |  |           body: product, | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(res.statusCode).toBe(400); | 
					
						
							| 
									
										
										
										
											2021-10-20 17:30:05 +02:00
										 |  |  |         expect(res.body).toMatchObject({ | 
					
						
							|  |  |  |           data: null, | 
					
						
							|  |  |  |           error: { | 
					
						
							|  |  |  |             status: 400, | 
					
						
							|  |  |  |             name: 'ValidationError', | 
					
						
							| 
									
										
										
										
											2022-11-09 15:08:06 +00:00
										 |  |  |             message: '2 errors occurred', | 
					
						
							| 
									
										
										
										
											2021-10-20 17:30:05 +02:00
										 |  |  |             details: { | 
					
						
							|  |  |  |               errors: [ | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                   path: ['dz', '0', '__component'], | 
					
						
							|  |  |  |                   message: 'dz[0].__component is a required field', | 
					
						
							|  |  |  |                   name: 'ValidationError', | 
					
						
							|  |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2022-11-09 15:08:06 +00:00
										 |  |  |                 { | 
					
						
							| 
									
										
										
										
											2022-11-23 14:32:26 +00:00
										 |  |  |                   message: | 
					
						
							|  |  |  |                     'Cannot build relations store from dynamiczone, component identifier is undefined', | 
					
						
							| 
									
										
										
										
											2022-11-09 15:08:06 +00:00
										 |  |  |                   name: 'ValidationError', | 
					
						
							|  |  |  |                   path: [], | 
					
						
							|  |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2021-10-20 17:30:05 +02:00
										 |  |  |               ], | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2020-09-22 12:31:26 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |