| 
									
										
										
										
											2022-10-24 12:54:27 +02:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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'); | 
					
						
							|  |  |  | const modelsUtils = require('api-tests/models'); | 
					
						
							| 
									
										
										
										
											2022-10-24 12:54:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | let strapi; | 
					
						
							|  |  |  | let rq; | 
					
						
							|  |  |  | const data = { | 
					
						
							|  |  |  |   products: [], | 
					
						
							|  |  |  |   shops: [], | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | let id1; | 
					
						
							|  |  |  | let id2; | 
					
						
							|  |  |  | let id3; | 
					
						
							|  |  |  | const populateShop = [ | 
					
						
							|  |  |  |   'products_ow', | 
					
						
							|  |  |  |   'products_oo', | 
					
						
							|  |  |  |   'products_mo', | 
					
						
							|  |  |  |   'products_om', | 
					
						
							|  |  |  |   'products_mm', | 
					
						
							|  |  |  |   'products_mw', | 
					
						
							|  |  |  |   'myCompo.compo_products_ow', | 
					
						
							|  |  |  |   'myCompo.compo_products_mw', | 
					
						
							|  |  |  | ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const compo = (withRelations = false) => ({ | 
					
						
							|  |  |  |   displayName: 'compo', | 
					
						
							|  |  |  |   category: 'default', | 
					
						
							|  |  |  |   attributes: { | 
					
						
							|  |  |  |     name: { | 
					
						
							|  |  |  |       type: 'string', | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     ...(!withRelations | 
					
						
							|  |  |  |       ? {} | 
					
						
							|  |  |  |       : { | 
					
						
							|  |  |  |           compo_products_ow: { | 
					
						
							|  |  |  |             type: 'relation', | 
					
						
							|  |  |  |             relation: 'oneToOne', | 
					
						
							|  |  |  |             target: 'api::product.product', | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           compo_products_mw: { | 
					
						
							|  |  |  |             type: 'relation', | 
					
						
							|  |  |  |             relation: 'oneToMany', | 
					
						
							|  |  |  |             target: 'api::product.product', | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         }), | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const productModel = { | 
					
						
							|  |  |  |   attributes: { | 
					
						
							|  |  |  |     name: { | 
					
						
							|  |  |  |       type: 'string', | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   displayName: 'Product', | 
					
						
							|  |  |  |   singularName: 'product', | 
					
						
							|  |  |  |   pluralName: 'products', | 
					
						
							|  |  |  |   description: '', | 
					
						
							|  |  |  |   collectionName: '', | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const shopModel = { | 
					
						
							|  |  |  |   attributes: { | 
					
						
							|  |  |  |     name: { | 
					
						
							|  |  |  |       type: 'string', | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     products_ow: { | 
					
						
							|  |  |  |       type: 'relation', | 
					
						
							|  |  |  |       relation: 'oneToOne', | 
					
						
							|  |  |  |       target: 'api::product.product', | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     products_oo: { | 
					
						
							|  |  |  |       type: 'relation', | 
					
						
							|  |  |  |       relation: 'oneToOne', | 
					
						
							|  |  |  |       target: 'api::product.product', | 
					
						
							|  |  |  |       targetAttribute: 'shop', | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     products_mo: { | 
					
						
							|  |  |  |       type: 'relation', | 
					
						
							|  |  |  |       relation: 'manyToOne', | 
					
						
							|  |  |  |       target: 'api::product.product', | 
					
						
							|  |  |  |       targetAttribute: 'shops_mo', | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     products_om: { | 
					
						
							|  |  |  |       type: 'relation', | 
					
						
							|  |  |  |       relation: 'oneToMany', | 
					
						
							|  |  |  |       target: 'api::product.product', | 
					
						
							|  |  |  |       targetAttribute: 'shop_om', | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     products_mm: { | 
					
						
							|  |  |  |       type: 'relation', | 
					
						
							|  |  |  |       relation: 'manyToMany', | 
					
						
							|  |  |  |       target: 'api::product.product', | 
					
						
							|  |  |  |       targetAttribute: 'shops', | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     products_mw: { | 
					
						
							|  |  |  |       type: 'relation', | 
					
						
							|  |  |  |       relation: 'oneToMany', | 
					
						
							|  |  |  |       target: 'api::product.product', | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     myCompo: { | 
					
						
							|  |  |  |       type: 'component', | 
					
						
							|  |  |  |       repeatable: false, | 
					
						
							|  |  |  |       component: 'default.compo', | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   displayName: 'Shop', | 
					
						
							|  |  |  |   singularName: 'shop', | 
					
						
							|  |  |  |   pluralName: 'shops', | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const createEntry = async (singularName, data, populate) => { | 
					
						
							|  |  |  |   const { body } = await rq({ | 
					
						
							|  |  |  |     method: 'POST', | 
					
						
							|  |  |  |     url: `/content-manager/collection-types/api::${singularName}.${singularName}`, | 
					
						
							|  |  |  |     body: data, | 
					
						
							|  |  |  |     qs: { populate }, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   return body; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const updateEntry = async (singularName, id, data, populate) => { | 
					
						
							|  |  |  |   const { body } = await rq({ | 
					
						
							|  |  |  |     method: 'PUT', | 
					
						
							|  |  |  |     url: `/content-manager/collection-types/api::${singularName}.${singularName}/${id}`, | 
					
						
							|  |  |  |     body: data, | 
					
						
							|  |  |  |     qs: { populate }, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   return body; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  | const cloneEntry = async (singularName, id, data, populate) => { | 
					
						
							|  |  |  |   const { body } = await rq({ | 
					
						
							|  |  |  |     method: 'POST', | 
					
						
							|  |  |  |     url: `/content-manager/collection-types/api::${singularName}.${singularName}/clone/${id}`, | 
					
						
							|  |  |  |     body: data, | 
					
						
							|  |  |  |     qs: { populate }, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   return body; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-24 12:54:27 +02:00
										 |  |  | const getRelations = async (uid, field, id) => { | 
					
						
							|  |  |  |   const res = await rq({ | 
					
						
							|  |  |  |     method: 'GET', | 
					
						
							|  |  |  |     url: `/content-manager/relations/${uid}/${id}/${field}`, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return res.body; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  | describe('Relations', () => { | 
					
						
							| 
									
										
										
										
											2022-10-24 12:54:27 +02:00
										 |  |  |   const builder = createTestBuilder(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   beforeAll(async () => { | 
					
						
							|  |  |  |     await builder.addComponent(compo(false)).addContentTypes([productModel, shopModel]).build(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     await modelsUtils.modifyComponent(compo(true)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     strapi = await createStrapiInstance(); | 
					
						
							|  |  |  |     rq = await createAuthRequest({ strapi }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const createdProduct1 = await createEntry('product', { name: 'Skate' }); | 
					
						
							|  |  |  |     const createdProduct2 = await createEntry('product', { name: 'Candle' }); | 
					
						
							|  |  |  |     const createdProduct3 = await createEntry('product', { name: 'Mug' }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     data.products.push(createdProduct1); | 
					
						
							|  |  |  |     data.products.push(createdProduct2); | 
					
						
							|  |  |  |     data.products.push(createdProduct3); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     id1 = data.products[0].id; | 
					
						
							|  |  |  |     id2 = data.products[1].id; | 
					
						
							|  |  |  |     id3 = data.products[2].id; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   afterAll(async () => { | 
					
						
							|  |  |  |     await strapi.destroy(); | 
					
						
							|  |  |  |     await builder.cleanup(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe.each([['connect'], ['set']])( | 
					
						
							|  |  |  |     'Create an entity with relations using %s', | 
					
						
							|  |  |  |     (connectOrSet) => { | 
					
						
							|  |  |  |       describe.each([ | 
					
						
							|  |  |  |         ['directly in the array ([1, 2])', 'object'], | 
					
						
							|  |  |  |         ['an object in the array ([{ id: 1 }, { id: 2 }])', 'array'], | 
					
						
							|  |  |  |       ])('ids being %s', (name, mode) => { | 
					
						
							|  |  |  |         test('In one order', async () => { | 
					
						
							|  |  |  |           const oneRelation = mode === 'object' ? [{ id: id1 }] : [id1]; | 
					
						
							|  |  |  |           const manyRelations = mode === 'object' ? [{ id: id1 }, { id: id2 }] : [id1, id2]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const shop = await createEntry( | 
					
						
							|  |  |  |             'shop', | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |               name: 'Cazotte Shop', | 
					
						
							|  |  |  |               products_ow: { [connectOrSet]: oneRelation }, | 
					
						
							|  |  |  |               products_oo: { [connectOrSet]: oneRelation }, | 
					
						
							|  |  |  |               products_mo: { [connectOrSet]: oneRelation }, | 
					
						
							|  |  |  |               products_om: { [connectOrSet]: manyRelations }, | 
					
						
							|  |  |  |               products_mm: { [connectOrSet]: manyRelations }, | 
					
						
							|  |  |  |               products_mw: { [connectOrSet]: manyRelations }, | 
					
						
							|  |  |  |               myCompo: { | 
					
						
							|  |  |  |                 compo_products_ow: { [connectOrSet]: oneRelation }, | 
					
						
							|  |  |  |                 compo_products_mw: { [connectOrSet]: manyRelations }, | 
					
						
							|  |  |  |               }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             populateShop | 
					
						
							|  |  |  |           ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           let res; | 
					
						
							|  |  |  |           res = await getRelations('default.compo', 'compo_products_mw', shop.myCompo.id); | 
					
						
							|  |  |  |           expect(res.results).toMatchObject([{ id: id2 }, { id: id1 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           res = await getRelations('default.compo', 'compo_products_ow', shop.myCompo.id); | 
					
						
							|  |  |  |           expect(res.data).toMatchObject({ id: id1 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           res = await getRelations('api::shop.shop', 'products_mm', shop.id); | 
					
						
							|  |  |  |           expect(res.results).toMatchObject([{ id: id2 }, { id: id1 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           res = await getRelations('api::shop.shop', 'products_mo', shop.id); | 
					
						
							|  |  |  |           expect(res.data).toMatchObject({ id: id1 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           res = await getRelations('api::shop.shop', 'products_mw', shop.id); | 
					
						
							|  |  |  |           expect(res.results).toMatchObject([{ id: id2 }, { id: id1 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           res = await getRelations('api::shop.shop', 'products_om', shop.id); | 
					
						
							|  |  |  |           expect(res.results).toMatchObject([{ id: id2 }, { id: id1 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           res = await getRelations('api::shop.shop', 'products_oo', shop.id); | 
					
						
							|  |  |  |           expect(res.data).toMatchObject({ id: id1 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           res = await getRelations('api::shop.shop', 'products_ow', shop.id); | 
					
						
							|  |  |  |           expect(res.data).toMatchObject({ id: id1 }); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test('In reversed order', async () => { | 
					
						
							|  |  |  |           const oneRelation = mode === 'object' ? [{ id: id1 }] : [id1]; | 
					
						
							|  |  |  |           const manyRelations = mode === 'object' ? [{ id: id1 }, { id: id2 }] : [id1, id2]; | 
					
						
							|  |  |  |           manyRelations.reverse(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const shop = await createEntry( | 
					
						
							|  |  |  |             'shop', | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |               name: 'Cazotte Shop', | 
					
						
							|  |  |  |               products_ow: { [connectOrSet]: oneRelation }, | 
					
						
							|  |  |  |               products_oo: { [connectOrSet]: oneRelation }, | 
					
						
							|  |  |  |               products_mo: { [connectOrSet]: oneRelation }, | 
					
						
							|  |  |  |               products_om: { [connectOrSet]: manyRelations }, | 
					
						
							|  |  |  |               products_mm: { [connectOrSet]: manyRelations }, | 
					
						
							|  |  |  |               products_mw: { [connectOrSet]: manyRelations }, | 
					
						
							|  |  |  |               myCompo: { | 
					
						
							|  |  |  |                 compo_products_ow: { [connectOrSet]: oneRelation }, | 
					
						
							|  |  |  |                 compo_products_mw: { [connectOrSet]: manyRelations }, | 
					
						
							|  |  |  |               }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             populateShop | 
					
						
							|  |  |  |           ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           let res; | 
					
						
							|  |  |  |           res = await getRelations('default.compo', 'compo_products_mw', shop.myCompo.id); | 
					
						
							|  |  |  |           expect(res.results).toMatchObject([{ id: id1 }, { id: id2 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           res = await getRelations('default.compo', 'compo_products_ow', shop.myCompo.id); | 
					
						
							|  |  |  |           expect(res.data).toMatchObject({ id: id1 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           res = await getRelations('api::shop.shop', 'products_mm', shop.id); | 
					
						
							|  |  |  |           expect(res.results).toMatchObject([{ id: id1 }, { id: id2 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           res = await getRelations('api::shop.shop', 'products_mo', shop.id); | 
					
						
							|  |  |  |           expect(res.data).toMatchObject({ id: id1 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           res = await getRelations('api::shop.shop', 'products_mw', shop.id); | 
					
						
							|  |  |  |           expect(res.results).toMatchObject([{ id: id1 }, { id: id2 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           res = await getRelations('api::shop.shop', 'products_om', shop.id); | 
					
						
							|  |  |  |           expect(res.results).toMatchObject([{ id: id1 }, { id: id2 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           res = await getRelations('api::shop.shop', 'products_oo', shop.id); | 
					
						
							|  |  |  |           expect(res.data).toMatchObject({ id: id1 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           res = await getRelations('api::shop.shop', 'products_ow', shop.id); | 
					
						
							|  |  |  |           expect(res.data).toMatchObject({ id: id1 }); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('Update an entity relations', () => { | 
					
						
							|  |  |  |     describe.each([ | 
					
						
							|  |  |  |       ['directly in the array ([3])', 'object'], | 
					
						
							|  |  |  |       ['an object in the array ([{ id: 3 }])', 'array'], | 
					
						
							|  |  |  |     ])('ids being %s', (name, mode) => { | 
					
						
							|  |  |  |       test('Adding id3', async () => { | 
					
						
							|  |  |  |         const createdShop = await createEntry( | 
					
						
							|  |  |  |           'shop', | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |             products_oo: { connect: [id1] }, | 
					
						
							|  |  |  |             products_mo: { connect: [id1] }, | 
					
						
							|  |  |  |             products_om: { connect: [id1, id2] }, | 
					
						
							|  |  |  |             products_mm: { connect: [id1, id2] }, | 
					
						
							|  |  |  |             products_mw: { connect: [id1, id2] }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               compo_products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |               compo_products_mw: { connect: [id1, id2] }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           ['myCompo'] | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const relationToAdd = mode === 'object' ? [{ id: id3 }] : [id3]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const updatedShop = await updateEntry( | 
					
						
							|  |  |  |           'shop', | 
					
						
							|  |  |  |           createdShop.id, | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_ow: { connect: relationToAdd }, | 
					
						
							|  |  |  |             products_oo: { connect: relationToAdd }, | 
					
						
							|  |  |  |             products_mo: { connect: relationToAdd }, | 
					
						
							|  |  |  |             products_om: { connect: relationToAdd }, | 
					
						
							|  |  |  |             products_mm: { connect: relationToAdd }, | 
					
						
							|  |  |  |             products_mw: { connect: relationToAdd }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               id: createdShop.myCompo.id, | 
					
						
							|  |  |  |               compo_products_ow: { connect: relationToAdd }, | 
					
						
							|  |  |  |               compo_products_mw: { connect: relationToAdd }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           populateShop | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let res; | 
					
						
							|  |  |  |         res = await getRelations('default.compo', 'compo_products_mw', updatedShop.myCompo.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id3 }, { id: id2 }, { id: id1 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('default.compo', 'compo_products_ow', updatedShop.myCompo.id); | 
					
						
							|  |  |  |         expect(res.data).toMatchObject({ id: id3 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_mm', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id3 }, { id: id2 }, { id: id1 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_mo', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.data).toMatchObject({ id: id3 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_mw', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id3 }, { id: id2 }, { id: id1 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_om', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id3 }, { id: id2 }, { id: id1 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_oo', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.data).toMatchObject({ id: id3 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_ow', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.data).toMatchObject({ id: id3 }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test('Adding id3 & removing id1', async () => { | 
					
						
							|  |  |  |         const createdShop = await createEntry( | 
					
						
							|  |  |  |           'shop', | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |             products_oo: { connect: [id1] }, | 
					
						
							|  |  |  |             products_mo: { connect: [id1] }, | 
					
						
							|  |  |  |             products_om: { connect: [id1, id2] }, | 
					
						
							|  |  |  |             products_mm: { connect: [id1, id2] }, | 
					
						
							|  |  |  |             products_mw: { connect: [id1, id2] }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               compo_products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |               compo_products_mw: { connect: [id1, id2] }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           ['myCompo'] | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const relationToAdd = mode === 'object' ? [{ id: id3 }] : [id3]; | 
					
						
							|  |  |  |         const relationToRemove = mode === 'object' ? [{ id: id1 }] : [id1]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const updatedShop = await updateEntry( | 
					
						
							|  |  |  |           'shop', | 
					
						
							|  |  |  |           createdShop.id, | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_ow: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |             products_oo: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |             products_mo: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |             products_om: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |             products_mm: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |             products_mw: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               id: createdShop.myCompo.id, | 
					
						
							|  |  |  |               compo_products_ow: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |               compo_products_mw: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           populateShop | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let res; | 
					
						
							|  |  |  |         res = await getRelations('default.compo', 'compo_products_mw', updatedShop.myCompo.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id3 }, { id: id2 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('default.compo', 'compo_products_ow', updatedShop.myCompo.id); | 
					
						
							|  |  |  |         expect(res.data).toMatchObject({ id: id3 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_mm', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id3 }, { id: id2 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_mo', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.data).toMatchObject({ id: id3 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_mw', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id3 }, { id: id2 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_om', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id3 }, { id: id2 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_oo', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.data).toMatchObject({ id: id3 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_ow', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.data).toMatchObject({ id: id3 }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test('Adding id3 & removing id1, id3 (should still add id3)', async () => { | 
					
						
							|  |  |  |         const createdShop = await createEntry( | 
					
						
							|  |  |  |           'shop', | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |             products_oo: { connect: [id1] }, | 
					
						
							|  |  |  |             products_mo: { connect: [id1] }, | 
					
						
							|  |  |  |             products_om: { connect: [id1, id2] }, | 
					
						
							|  |  |  |             products_mm: { connect: [id1, id2] }, | 
					
						
							|  |  |  |             products_mw: { connect: [id1, id2] }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               compo_products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |               compo_products_mw: { connect: [id1, id2] }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           ['myCompo'] | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const relationToAdd = mode === 'object' ? [{ id: id3 }] : [id3]; | 
					
						
							|  |  |  |         const relationToRemove = mode === 'object' ? [{ id: id1 }, { id: id3 }] : [id1, id3]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const updatedShop = await updateEntry( | 
					
						
							|  |  |  |           'shop', | 
					
						
							|  |  |  |           createdShop.id, | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_ow: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |             products_oo: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |             products_mo: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |             products_om: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |             products_mm: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |             products_mw: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               id: createdShop.myCompo.id, | 
					
						
							|  |  |  |               compo_products_ow: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |               compo_products_mw: { connect: relationToAdd, disconnect: relationToRemove }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           populateShop | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let res; | 
					
						
							|  |  |  |         res = await getRelations('default.compo', 'compo_products_mw', updatedShop.myCompo.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id3 }, { id: id2 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('default.compo', 'compo_products_ow', updatedShop.myCompo.id); | 
					
						
							|  |  |  |         expect(res.data).toMatchObject({ id: id3 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_mm', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id3 }, { id: id2 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_mo', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.data).toMatchObject({ id: id3 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_mw', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id3 }, { id: id2 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_om', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id3 }, { id: id2 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_oo', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.data).toMatchObject({ id: id3 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_ow', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.data).toMatchObject({ id: id3 }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test('Change relation order from id1, id2, id3 to id3, id2, id1', async () => { | 
					
						
							|  |  |  |         const createdShop = await createEntry( | 
					
						
							|  |  |  |           'shop', | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_om: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             products_mm: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             products_mw: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               compo_products_mw: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           ['myCompo'] | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const relationToChange = | 
					
						
							|  |  |  |           mode === 'object' ? [{ id: id3 }, { id: id2 }, { id: id1 }] : [id3, id2, id1]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const updatedShop = await updateEntry( | 
					
						
							|  |  |  |           'shop', | 
					
						
							|  |  |  |           createdShop.id, | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_om: { connect: relationToChange }, | 
					
						
							|  |  |  |             products_mm: { connect: relationToChange }, | 
					
						
							|  |  |  |             products_mw: { connect: relationToChange }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               id: createdShop.myCompo.id, | 
					
						
							|  |  |  |               compo_products_mw: { connect: relationToChange }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           populateShop | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let res; | 
					
						
							|  |  |  |         res = await getRelations('default.compo', 'compo_products_mw', updatedShop.myCompo.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id1 }, { id: id2 }, { id: id3 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_mm', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id1 }, { id: id2 }, { id: id3 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_mw', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id1 }, { id: id2 }, { id: id3 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_om', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id1 }, { id: id2 }, { id: id3 }]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test('Change relation order by putting id2 at the end', async () => { | 
					
						
							|  |  |  |         const createdShop = await createEntry( | 
					
						
							|  |  |  |           'shop', | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_om: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             products_mm: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             products_mw: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               compo_products_mw: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           ['myCompo'] | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const relationToChange = mode === 'object' ? [{ id: id2 }] : [id2]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const updatedShop = await updateEntry( | 
					
						
							|  |  |  |           'shop', | 
					
						
							|  |  |  |           createdShop.id, | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_om: { connect: relationToChange }, | 
					
						
							|  |  |  |             products_mm: { connect: relationToChange }, | 
					
						
							|  |  |  |             products_mw: { connect: relationToChange }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               id: createdShop.myCompo.id, | 
					
						
							|  |  |  |               compo_products_mw: { connect: relationToChange }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           populateShop | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let res; | 
					
						
							|  |  |  |         res = await getRelations('default.compo', 'compo_products_mw', updatedShop.myCompo.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id2 }, { id: id3 }, { id: id1 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_mm', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id2 }, { id: id3 }, { id: id1 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_mw', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id2 }, { id: id3 }, { id: id1 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_om', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id2 }, { id: id3 }, { id: id1 }]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test('Change relation order by putting id2, id1 at the end', async () => { | 
					
						
							|  |  |  |         const createdShop = await createEntry( | 
					
						
							|  |  |  |           'shop', | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_om: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             products_mm: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             products_mw: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               compo_products_mw: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           ['myCompo'] | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const relationToChange = mode === 'object' ? [{ id: id2 }, { id: id1 }] : [id2, id1]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const updatedShop = await updateEntry( | 
					
						
							|  |  |  |           'shop', | 
					
						
							|  |  |  |           createdShop.id, | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_om: { connect: relationToChange }, | 
					
						
							|  |  |  |             products_mm: { connect: relationToChange }, | 
					
						
							|  |  |  |             products_mw: { connect: relationToChange }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               id: createdShop.myCompo.id, | 
					
						
							|  |  |  |               compo_products_mw: { connect: relationToChange }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           populateShop | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let res; | 
					
						
							|  |  |  |         res = await getRelations('default.compo', 'compo_products_mw', updatedShop.myCompo.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id1 }, { id: id2 }, { id: id3 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_mm', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id1 }, { id: id2 }, { id: id3 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_mw', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id1 }, { id: id2 }, { id: id3 }]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = await getRelations('api::shop.shop', 'products_om', updatedShop.id); | 
					
						
							|  |  |  |         expect(res.results).toMatchObject([{ id: id1 }, { id: id2 }, { id: id3 }]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-14 15:40:27 +01:00
										 |  |  |   describe('Reorder an entity relations', () => { | 
					
						
							|  |  |  |     test('Reorder single relation', async () => { | 
					
						
							|  |  |  |       const createdShop = await createEntry( | 
					
						
							|  |  |  |         'shop', | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           name: 'Cazotte Shop', | 
					
						
							|  |  |  |           products_om: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |           products_mm: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |           products_mw: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |           myCompo: { | 
					
						
							|  |  |  |             compo_products_mw: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         ['myCompo'] | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const relationToChange = [{ id: id1, position: { before: id3 } }]; | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       const { id } = await updateEntry('shop', createdShop.id, { | 
					
						
							| 
									
										
										
										
											2022-12-14 15:40:27 +01:00
										 |  |  |         name: 'Cazotte Shop', | 
					
						
							|  |  |  |         products_om: { connect: relationToChange }, | 
					
						
							|  |  |  |         products_mm: { connect: relationToChange }, | 
					
						
							|  |  |  |         products_mw: { connect: relationToChange }, | 
					
						
							|  |  |  |         myCompo: { | 
					
						
							|  |  |  |           id: createdShop.myCompo.id, | 
					
						
							|  |  |  |           compo_products_mw: { connect: relationToChange }, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       const expectedRelations = [{ id: id2 }, { id: id1 }, { id: id3 }]; | 
					
						
							| 
									
										
										
										
											2022-12-14 15:40:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       const updatedShop = await strapi.entityService.findOne('api::shop.shop', id, { | 
					
						
							|  |  |  |         populate: populateShop, | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2022-12-14 15:40:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       expect(updatedShop.myCompo.compo_products_mw).toMatchObject(expectedRelations); | 
					
						
							|  |  |  |       expect(updatedShop.products_mm).toMatchObject(expectedRelations); | 
					
						
							|  |  |  |       expect(updatedShop.products_mw).toMatchObject(expectedRelations); | 
					
						
							|  |  |  |       expect(updatedShop.products_om).toMatchObject(expectedRelations); | 
					
						
							| 
									
										
										
										
											2022-12-14 15:40:27 +01:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('Reorder multiple relations', async () => { | 
					
						
							|  |  |  |       const createdShop = await createEntry( | 
					
						
							|  |  |  |         'shop', | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           name: 'Cazotte Shop', | 
					
						
							|  |  |  |           products_om: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |           products_mm: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |           products_mw: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |           myCompo: { | 
					
						
							|  |  |  |             compo_products_mw: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         ['myCompo'] | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const relationToChange = [ | 
					
						
							|  |  |  |         { id: id1, position: { end: true } }, | 
					
						
							|  |  |  |         { id: id3, position: { start: true } }, | 
					
						
							|  |  |  |         { id: id2, position: { after: id1 } }, | 
					
						
							|  |  |  |       ]; | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       const { id } = await updateEntry('shop', createdShop.id, { | 
					
						
							| 
									
										
										
										
											2022-12-14 15:40:27 +01:00
										 |  |  |         name: 'Cazotte Shop', | 
					
						
							|  |  |  |         products_om: { connect: relationToChange }, | 
					
						
							|  |  |  |         products_mm: { connect: relationToChange }, | 
					
						
							|  |  |  |         products_mw: { connect: relationToChange }, | 
					
						
							|  |  |  |         myCompo: { | 
					
						
							|  |  |  |           id: createdShop.myCompo.id, | 
					
						
							|  |  |  |           compo_products_mw: { connect: relationToChange }, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       const updatedShop = await strapi.entityService.findOne('api::shop.shop', id, { | 
					
						
							|  |  |  |         populate: populateShop, | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2022-12-14 15:40:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       const expectedRelations = [{ id: id3 }, { id: id1 }, { id: id2 }]; | 
					
						
							| 
									
										
										
										
											2022-12-14 15:40:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       expect(updatedShop.myCompo.compo_products_mw).toMatchObject(expectedRelations); | 
					
						
							|  |  |  |       expect(updatedShop.products_mm).toMatchObject(expectedRelations); | 
					
						
							|  |  |  |       expect(updatedShop.products_mw).toMatchObject(expectedRelations); | 
					
						
							|  |  |  |       expect(updatedShop.products_om).toMatchObject(expectedRelations); | 
					
						
							| 
									
										
										
										
											2022-12-14 15:40:27 +01:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('Invalid reorder with non-strict mode should not give an error', async () => { | 
					
						
							|  |  |  |       const createdShop = await createEntry( | 
					
						
							|  |  |  |         'shop', | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           name: 'Cazotte Shop', | 
					
						
							|  |  |  |           products_om: { connect: [id1, id2] }, | 
					
						
							|  |  |  |           products_mm: { connect: [id1, id2] }, | 
					
						
							|  |  |  |           products_mw: { connect: [id1, id2] }, | 
					
						
							|  |  |  |           myCompo: { | 
					
						
							|  |  |  |             compo_products_mw: { connect: [id1, id2] }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         ['myCompo'] | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const relationToChange = [ | 
					
						
							|  |  |  |         { id: id1, position: { before: id3 } }, // id3 does not exist, should place it at the end
 | 
					
						
							|  |  |  |       ]; | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       const { id } = await updateEntry('shop', createdShop.id, { | 
					
						
							| 
									
										
										
										
											2022-12-14 15:40:27 +01:00
										 |  |  |         name: 'Cazotte Shop', | 
					
						
							| 
									
										
										
										
											2022-12-20 15:09:21 +01:00
										 |  |  |         products_om: { options: { strict: false }, connect: relationToChange }, | 
					
						
							|  |  |  |         products_mm: { options: { strict: false }, connect: relationToChange }, | 
					
						
							|  |  |  |         products_mw: { options: { strict: false }, connect: relationToChange }, | 
					
						
							| 
									
										
										
										
											2022-12-14 15:40:27 +01:00
										 |  |  |         myCompo: { | 
					
						
							|  |  |  |           id: createdShop.myCompo.id, | 
					
						
							| 
									
										
										
										
											2022-12-20 15:09:21 +01:00
										 |  |  |           compo_products_mw: { options: { strict: false }, connect: relationToChange }, | 
					
						
							| 
									
										
										
										
											2022-12-14 15:40:27 +01:00
										 |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       const expectedRelations = [{ id: id2 }, { id: id1 }]; | 
					
						
							|  |  |  |       const updatedShop = await strapi.entityService.findOne('api::shop.shop', id, { | 
					
						
							|  |  |  |         populate: populateShop, | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2022-12-14 15:40:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       expect(updatedShop.myCompo.compo_products_mw).toMatchObject(expectedRelations); | 
					
						
							|  |  |  |       expect(updatedShop.products_mm).toMatchObject(expectedRelations); | 
					
						
							|  |  |  |       expect(updatedShop.products_mw).toMatchObject(expectedRelations); | 
					
						
							|  |  |  |       expect(updatedShop.products_om).toMatchObject(expectedRelations); | 
					
						
							| 
									
										
										
										
											2022-12-14 15:40:27 +01:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-24 12:54:27 +02:00
										 |  |  |   describe('Disconnect entity relations', () => { | 
					
						
							|  |  |  |     describe.each([ | 
					
						
							|  |  |  |       ['directly in the array ([1, 2, 3])', 'object'], | 
					
						
							|  |  |  |       ['an object in the array ([{ id: 1 }, { id: 2 }, { id: 3 }])', 'array'], | 
					
						
							|  |  |  |     ])('ids being %s', (name, mode) => { | 
					
						
							|  |  |  |       test('Remove all relations id1, id2, id3', async () => { | 
					
						
							|  |  |  |         const createdShop = await createEntry( | 
					
						
							|  |  |  |           'shop', | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |             products_oo: { connect: [id1] }, | 
					
						
							|  |  |  |             products_mo: { connect: [id1] }, | 
					
						
							|  |  |  |             products_om: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             products_mm: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             products_mw: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               compo_products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |               compo_products_mw: { connect: [id1, id2, id3] }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           ['myCompo'] | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const relationsToDisconnectOne = mode === 'object' ? [{ id: id1 }] : [id1]; | 
					
						
							|  |  |  |         const relationsToDisconnectMany = | 
					
						
							|  |  |  |           mode === 'object' ? [{ id: id3 }, { id: id2 }, { id: id1 }] : [id3, id2, id1]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |         const { id } = await updateEntry( | 
					
						
							| 
									
										
										
										
											2022-10-24 12:54:27 +02:00
										 |  |  |           'shop', | 
					
						
							|  |  |  |           createdShop.id, | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_ow: { disconnect: relationsToDisconnectOne }, | 
					
						
							|  |  |  |             products_oo: { disconnect: relationsToDisconnectOne }, | 
					
						
							|  |  |  |             products_mo: { disconnect: relationsToDisconnectOne }, | 
					
						
							|  |  |  |             products_om: { disconnect: relationsToDisconnectMany }, | 
					
						
							|  |  |  |             products_mm: { disconnect: relationsToDisconnectMany }, | 
					
						
							|  |  |  |             products_mw: { disconnect: relationsToDisconnectMany }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               id: createdShop.myCompo.id, | 
					
						
							|  |  |  |               compo_products_ow: { disconnect: relationsToDisconnectOne }, | 
					
						
							|  |  |  |               compo_products_mw: { disconnect: relationsToDisconnectMany }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           populateShop | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |         const updatedShop = await strapi.entityService.findOne('api::shop.shop', id, { | 
					
						
							|  |  |  |           populate: populateShop, | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2022-10-24 12:54:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |         expect(updatedShop.myCompo.compo_products_mw).toMatchObject([]); | 
					
						
							|  |  |  |         expect(updatedShop.myCompo.compo_products_ow).toBe(null); | 
					
						
							|  |  |  |         expect(updatedShop.products_mm).toMatchObject([]); | 
					
						
							|  |  |  |         expect(updatedShop.products_mo).toBe(null); | 
					
						
							|  |  |  |         expect(updatedShop.products_mw).toMatchObject([]); | 
					
						
							|  |  |  |         expect(updatedShop.products_om).toMatchObject([]); | 
					
						
							|  |  |  |         expect(updatedShop.products_oo).toBe(null); | 
					
						
							|  |  |  |         expect(updatedShop.products_ow).toBe(null); | 
					
						
							| 
									
										
										
										
											2022-10-24 12:54:27 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test("Remove relations that doesn't exist doesn't fail", async () => { | 
					
						
							|  |  |  |         const createdShop = await createEntry( | 
					
						
							|  |  |  |           'shop', | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |             products_oo: { connect: [id1] }, | 
					
						
							|  |  |  |             products_mo: { connect: [id1] }, | 
					
						
							|  |  |  |             products_om: { connect: [id1] }, | 
					
						
							|  |  |  |             products_mm: { connect: [id1] }, | 
					
						
							|  |  |  |             products_mw: { connect: [id1] }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               compo_products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |               compo_products_mw: { connect: [id1] }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           ['myCompo'] | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const relationsToDisconnectMany = | 
					
						
							|  |  |  |           mode === 'object' ? [{ id: id3 }, { id: id2 }, { id: 9999 }] : [id3, id2, 9999]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |         const { id } = await updateEntry( | 
					
						
							| 
									
										
										
										
											2022-10-24 12:54:27 +02:00
										 |  |  |           'shop', | 
					
						
							|  |  |  |           createdShop.id, | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             name: 'Cazotte Shop', | 
					
						
							|  |  |  |             products_ow: { disconnect: relationsToDisconnectMany }, | 
					
						
							|  |  |  |             products_oo: { disconnect: relationsToDisconnectMany }, | 
					
						
							|  |  |  |             products_mo: { disconnect: relationsToDisconnectMany }, | 
					
						
							|  |  |  |             products_om: { disconnect: relationsToDisconnectMany }, | 
					
						
							|  |  |  |             products_mm: { disconnect: relationsToDisconnectMany }, | 
					
						
							|  |  |  |             products_mw: { disconnect: relationsToDisconnectMany }, | 
					
						
							|  |  |  |             myCompo: { | 
					
						
							|  |  |  |               id: createdShop.myCompo.id, | 
					
						
							|  |  |  |               compo_products_ow: { disconnect: relationsToDisconnectMany }, | 
					
						
							|  |  |  |               compo_products_mw: { disconnect: relationsToDisconnectMany }, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           populateShop | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |         const updatedShop = await strapi.entityService.findOne('api::shop.shop', id, { | 
					
						
							|  |  |  |           populate: populateShop, | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2022-10-24 12:54:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |         expect(updatedShop.myCompo.compo_products_mw).toMatchObject([{ id: id1 }]); | 
					
						
							|  |  |  |         expect(updatedShop.myCompo.compo_products_ow).toMatchObject({ id: id1 }); | 
					
						
							|  |  |  |         expect(updatedShop.products_mm).toMatchObject([{ id: id1 }]); | 
					
						
							|  |  |  |         expect(updatedShop.products_mo).toMatchObject({ id: id1 }); | 
					
						
							|  |  |  |         expect(updatedShop.products_mw).toMatchObject([{ id: id1 }]); | 
					
						
							|  |  |  |         expect(updatedShop.products_om).toMatchObject([{ id: id1 }]); | 
					
						
							|  |  |  |         expect(updatedShop.products_oo).toMatchObject({ id: id1 }); | 
					
						
							|  |  |  |         expect(updatedShop.products_ow).toMatchObject({ id: id1 }); | 
					
						
							| 
									
										
										
										
											2022-10-24 12:54:27 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |   describe('Clone entity with relations', () => { | 
					
						
							| 
									
										
										
										
											2023-06-09 11:24:03 +02:00
										 |  |  |     test('Auto cloning entity with relations should fail', async () => { | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  |       const createdShop = await createEntry( | 
					
						
							|  |  |  |         'shop', | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           name: 'Cazotte Shop', | 
					
						
							|  |  |  |           products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |           products_oo: { connect: [id1] }, | 
					
						
							|  |  |  |           products_mo: { connect: [id1] }, | 
					
						
							|  |  |  |           products_om: { connect: [id1] }, | 
					
						
							|  |  |  |           products_mm: { connect: [id1] }, | 
					
						
							|  |  |  |           products_mw: { connect: [id1] }, | 
					
						
							|  |  |  |           myCompo: { | 
					
						
							|  |  |  |             compo_products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |             compo_products_mw: { connect: [id1] }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         ['myCompo'] | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Clone with empty data
 | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'POST', | 
					
						
							| 
									
										
										
										
											2023-06-09 11:24:03 +02:00
										 |  |  |         url: `/content-manager/collection-types/api::shop.shop/auto-clone/${createdShop.id}`, | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  |         body: {}, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.statusCode).toBe(400); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('Clone entity with relations and connect data', async () => { | 
					
						
							|  |  |  |       const createdShop = await createEntry( | 
					
						
							|  |  |  |         'shop', | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           name: 'Cazotte Shop', | 
					
						
							|  |  |  |           products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |           products_oo: { connect: [id1] }, | 
					
						
							|  |  |  |           products_mo: { connect: [id1] }, | 
					
						
							|  |  |  |           products_om: { connect: [id1] }, | 
					
						
							|  |  |  |           products_mm: { connect: [id1] }, | 
					
						
							|  |  |  |           products_mw: { connect: [id1] }, | 
					
						
							|  |  |  |           myCompo: { | 
					
						
							|  |  |  |             compo_products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |             compo_products_mw: { connect: [id1] }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         ['myCompo'] | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       const { id, name } = await cloneEntry('shop', createdShop.id, { | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  |         name: 'Cazotte Shop 2', | 
					
						
							|  |  |  |         products_ow: { connect: [id2] }, | 
					
						
							|  |  |  |         products_oo: { connect: [id2] }, | 
					
						
							|  |  |  |         products_mo: { connect: [id2] }, | 
					
						
							|  |  |  |         products_om: { connect: [id2] }, | 
					
						
							|  |  |  |         products_mm: { connect: [id2] }, | 
					
						
							|  |  |  |         products_mw: { connect: [id2] }, | 
					
						
							|  |  |  |         myCompo: { | 
					
						
							|  |  |  |           id: createdShop.myCompo.id, | 
					
						
							|  |  |  |           compo_products_ow: { connect: [id2] }, | 
					
						
							|  |  |  |           compo_products_mw: { connect: [id2] }, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       expect(name).toBe('Cazotte Shop 2'); | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       const clonedShop = await strapi.entityService.findOne('api::shop.shop', id, { | 
					
						
							|  |  |  |         populate: populateShop, | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       expect(clonedShop.myCompo.compo_products_mw).toMatchObject([{ id: id1 }, { id: id2 }]); | 
					
						
							|  |  |  |       expect(clonedShop.myCompo.compo_products_ow).toMatchObject({ id: id2 }); | 
					
						
							|  |  |  |       expect(clonedShop.products_mm).toMatchObject([{ id: id1 }, { id: id2 }]); | 
					
						
							|  |  |  |       expect(clonedShop.products_mo).toMatchObject({ id: id2 }); | 
					
						
							|  |  |  |       expect(clonedShop.products_mw).toMatchObject([{ id: id1 }, { id: id2 }]); | 
					
						
							|  |  |  |       expect(clonedShop.products_om).toMatchObject([{ id: id1 }, { id: id2 }]); | 
					
						
							|  |  |  |       expect(clonedShop.products_oo).toMatchObject({ id: id2 }); | 
					
						
							|  |  |  |       expect(clonedShop.products_ow).toMatchObject({ id: id2 }); | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('Clone entity with relations and disconnect data', async () => { | 
					
						
							|  |  |  |       const createdShop = await createEntry( | 
					
						
							|  |  |  |         'shop', | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           name: 'Cazotte Shop', | 
					
						
							|  |  |  |           products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |           products_oo: { connect: [id1] }, | 
					
						
							|  |  |  |           products_mo: { connect: [id1] }, | 
					
						
							| 
									
										
										
										
											2023-03-28 12:41:38 +02:00
										 |  |  |           products_om: { connect: [id1, id2] }, | 
					
						
							|  |  |  |           products_mm: { connect: [id1, id2] }, | 
					
						
							|  |  |  |           products_mw: { connect: [id1, id2] }, | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  |           myCompo: { | 
					
						
							|  |  |  |             compo_products_ow: { connect: [id1] }, | 
					
						
							| 
									
										
										
										
											2023-03-28 12:41:38 +02:00
										 |  |  |             compo_products_mw: { connect: [id1, id2] }, | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  |           }, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         ['myCompo'] | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       const { id, name } = await cloneEntry('shop', createdShop.id, { | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  |         name: 'Cazotte Shop 2', | 
					
						
							| 
									
										
										
										
											2023-03-28 12:41:38 +02:00
										 |  |  |         products_ow: { disconnect: [id1] }, | 
					
						
							|  |  |  |         products_oo: { disconnect: [id1] }, | 
					
						
							|  |  |  |         products_mo: { disconnect: [id1] }, | 
					
						
							|  |  |  |         products_om: { disconnect: [id1] }, | 
					
						
							|  |  |  |         products_mm: { disconnect: [id1] }, | 
					
						
							|  |  |  |         products_mw: { disconnect: [id1] }, | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  |         myCompo: { | 
					
						
							|  |  |  |           id: createdShop.myCompo.id, | 
					
						
							| 
									
										
										
										
											2023-03-28 12:41:38 +02:00
										 |  |  |           compo_products_ow: { disconnect: [id1] }, | 
					
						
							|  |  |  |           compo_products_mw: { disconnect: [id1] }, | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       expect(name).toBe('Cazotte Shop 2'); | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       const clonedShop = await strapi.entityService.findOne('api::shop.shop', id, { | 
					
						
							|  |  |  |         populate: populateShop, | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       expect(clonedShop.myCompo.compo_products_mw).toMatchObject([{ id: id2 }]); | 
					
						
							|  |  |  |       expect(clonedShop.myCompo.compo_products_ow).toBe(null); | 
					
						
							|  |  |  |       expect(clonedShop.products_mm).toMatchObject([{ id: id2 }]); | 
					
						
							|  |  |  |       expect(clonedShop.products_mo).toBe(null); | 
					
						
							|  |  |  |       expect(clonedShop.products_mw).toMatchObject([{ id: id2 }]); | 
					
						
							|  |  |  |       expect(clonedShop.products_om).toMatchObject([{ id: id2 }]); | 
					
						
							|  |  |  |       expect(clonedShop.products_oo).toBe(null); | 
					
						
							|  |  |  |       expect(clonedShop.products_ow).toBe(null); | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2023-03-29 14:44:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     test('Clone entity with relations and disconnect data should not steal relations', async () => { | 
					
						
							|  |  |  |       const createdShop = await createEntry( | 
					
						
							|  |  |  |         'shop', | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           name: 'Cazotte Shop', | 
					
						
							|  |  |  |           products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |           products_oo: { connect: [id1] }, | 
					
						
							|  |  |  |           products_mo: { connect: [id1] }, | 
					
						
							|  |  |  |           products_om: { connect: [id1, id2] }, | 
					
						
							|  |  |  |           products_mm: { connect: [id1, id2] }, | 
					
						
							|  |  |  |           products_mw: { connect: [id1, id2] }, | 
					
						
							|  |  |  |           myCompo: { | 
					
						
							|  |  |  |             compo_products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |             compo_products_mw: { connect: [id1, id2] }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         ['myCompo'] | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await cloneEntry('shop', createdShop.id, { | 
					
						
							|  |  |  |         name: 'Cazotte Shop 2', | 
					
						
							|  |  |  |         products_oo: { disconnect: [id1] }, | 
					
						
							|  |  |  |         products_om: { disconnect: [id1] }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       const populatedCreatedShop = await strapi.entityService.findOne( | 
					
						
							|  |  |  |         'api::shop.shop', | 
					
						
							|  |  |  |         createdShop.id, | 
					
						
							|  |  |  |         { populate: populateShop } | 
					
						
							|  |  |  |       ); | 
					
						
							| 
									
										
										
										
											2023-03-29 14:44:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       expect(populatedCreatedShop.products_om).toMatchObject([{ id: id1 }]); | 
					
						
							|  |  |  |       expect(populatedCreatedShop.products_oo).toMatchObject({ id: id1 }); | 
					
						
							| 
									
										
										
										
											2023-03-29 14:44:00 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('Clone entity with relations and set data should not steal relations', async () => { | 
					
						
							|  |  |  |       const createdShop = await createEntry( | 
					
						
							|  |  |  |         'shop', | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           name: 'Cazotte Shop', | 
					
						
							|  |  |  |           products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |           products_oo: { connect: [id1] }, | 
					
						
							|  |  |  |           products_mo: { connect: [id1] }, | 
					
						
							|  |  |  |           products_om: { connect: [id1, id2] }, | 
					
						
							|  |  |  |           products_mm: { connect: [id1, id2] }, | 
					
						
							|  |  |  |           products_mw: { connect: [id1, id2] }, | 
					
						
							|  |  |  |           myCompo: { | 
					
						
							|  |  |  |             compo_products_ow: { connect: [id1] }, | 
					
						
							|  |  |  |             compo_products_mw: { connect: [id1, id2] }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         ['myCompo'] | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       await cloneEntry('shop', createdShop.id, { | 
					
						
							|  |  |  |         name: 'Cazotte Shop 2', | 
					
						
							|  |  |  |         products_oo: { set: [id2] }, // id 1 should not be stolen from createdShop products_oo
 | 
					
						
							|  |  |  |         products_om: { set: [id2] }, // id 1 should not be stolen from createdShop products_om
 | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       const populatedCreatedShop = await strapi.entityService.findOne( | 
					
						
							|  |  |  |         'api::shop.shop', | 
					
						
							|  |  |  |         createdShop.id, | 
					
						
							|  |  |  |         { populate: populateShop } | 
					
						
							|  |  |  |       ); | 
					
						
							| 
									
										
										
										
											2023-03-29 14:44:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-21 19:09:32 +02:00
										 |  |  |       expect(populatedCreatedShop.products_om).toMatchObject([{ id: id1 }]); | 
					
						
							|  |  |  |       expect(populatedCreatedShop.products_oo).toMatchObject({ id: id1 }); | 
					
						
							| 
									
										
										
										
											2023-03-29 14:44:00 +02:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2023-03-28 11:03:51 +02:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2022-10-24 12:54:27 +02:00
										 |  |  | }); |