| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  | const { prop } = require('lodash/fp'); | 
					
						
							| 
									
										
										
										
											2021-08-02 17:54:49 +02:00
										 |  |  | const { createTestBuilder } = require('../../../../../test/helpers/builder'); | 
					
						
							|  |  |  | const { createStrapiInstance } = require('../../../../../test/helpers/strapi'); | 
					
						
							|  |  |  | const { createRequest, createAuthRequest } = require('../../../../../test/helpers/request'); | 
					
						
							|  |  |  | const { createUtils } = require('../../../../../test/helpers/utils'); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | const edition = process.env.STRAPI_DISABLE_EE === 'true' ? 'CE' : 'EE'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (edition === 'EE') { | 
					
						
							|  |  |  |   describe('Admin Permissions - Conditions', () => { | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  |     let strapi; | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |     let utils; | 
					
						
							|  |  |  |     const builder = createTestBuilder(); | 
					
						
							| 
									
										
										
										
											2022-08-08 15:50:34 +02:00
										 |  |  |     const requests = { | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  |       public: null, | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |       admin: null, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const localTestData = { | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |       models: { | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |         article: { | 
					
						
							| 
									
										
										
										
											2021-10-22 11:59:03 +02:00
										 |  |  |           singularName: 'article', | 
					
						
							|  |  |  |           pluralName: 'articles', | 
					
						
							|  |  |  |           displayName: 'Article', | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |           attributes: { | 
					
						
							|  |  |  |             title: { | 
					
						
							|  |  |  |               type: 'string', | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             price: { | 
					
						
							|  |  |  |               type: 'integer', | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       entry: { | 
					
						
							|  |  |  |         name: 'Test Article', | 
					
						
							|  |  |  |         price: 999, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       role: { | 
					
						
							|  |  |  |         name: 'foobar', | 
					
						
							|  |  |  |         description: 'A dummy test role', | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       permissions: [ | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |           action: 'plugin::content-manager.explorer.create', | 
					
						
							|  |  |  |           subject: 'api::article.article', | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |           fields: null, | 
					
						
							|  |  |  |           conditions: [], | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |           action: 'plugin::content-manager.explorer.read', | 
					
						
							|  |  |  |           subject: 'api::article.article', | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |           fields: null, | 
					
						
							|  |  |  |           conditions: ['admin::has-same-role-as-creator'], | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |           action: 'plugin::content-manager.explorer.delete', | 
					
						
							|  |  |  |           subject: 'api::article.article', | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |           fields: null, | 
					
						
							|  |  |  |           conditions: ['admin::is-creator'], | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       userPassword: 'fooBar42', | 
					
						
							|  |  |  |       users: [ | 
					
						
							|  |  |  |         { firstname: 'Alice', lastname: 'Foo', email: 'alice.foo@test.com' }, | 
					
						
							|  |  |  |         { firstname: 'Bob', lastname: 'Bar', email: 'bob.bar@test.com' }, | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const createFixtures = async () => { | 
					
						
							|  |  |  |       // Login with admin and init admin tools
 | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  |       requests.admin = await createAuthRequest({ strapi }); | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |       requests.public = createRequest({ strapi }); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // Create the foobar role
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |       const role = await utils.createRole(localTestData.role); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // Assign permissions to the foobar role
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |       const permissions = await utils.assignPermissionsToRole(role.id, localTestData.permissions); | 
					
						
							|  |  |  |       Object.assign(role, { permissions }); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |       // Create users with the new role & create associated auth requests
 | 
					
						
							|  |  |  |       const users = []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-06 09:07:01 +02:00
										 |  |  |       for (let i = 0; i < localTestData.users.length; i += 1) { | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |         const userFixture = localTestData.users[i]; | 
					
						
							|  |  |  |         const userAttributes = { | 
					
						
							|  |  |  |           ...userFixture, | 
					
						
							|  |  |  |           password: localTestData.userPassword, | 
					
						
							|  |  |  |           roles: [role.id], | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const createdUser = await utils.createUser(userAttributes); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         requests[createdUser.id] = await createAuthRequest({ strapi, userInfo: createdUser }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         users.push(createdUser); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // Update the local data store
 | 
					
						
							|  |  |  |       Object.assign(localTestData, { role, permissions, users }); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |     const getUserRequest = (idx) => requests[localTestData.users[idx].id]; | 
					
						
							| 
									
										
										
										
											2021-10-22 11:59:03 +02:00
										 |  |  |     const getModelName = () => localTestData.models.article.singularName; | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const deleteFixtures = async () => { | 
					
						
							|  |  |  |       // Delete users
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |       const usersId = localTestData.users.map(prop('id')); | 
					
						
							|  |  |  |       await utils.deleteUsersById(usersId); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // Delete the foobar role
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |       await utils.deleteRolesById([localTestData.role.id]); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     beforeAll(async () => { | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |       await builder.addContentType(localTestData.models.article).build(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-30 20:20:36 +01:00
										 |  |  |       strapi = await createStrapiInstance(); | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |       utils = createUtils(strapi); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |       await createFixtures(); | 
					
						
							| 
									
										
										
										
											2021-03-26 20:15:38 +01:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     afterAll(async () => { | 
					
						
							|  |  |  |       await deleteFixtures(); | 
					
						
							| 
									
										
										
										
											2021-01-12 11:36:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-10 14:15:31 +01:00
										 |  |  |       await strapi.destroy(); | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  |       await builder.cleanup(); | 
					
						
							| 
									
										
										
										
											2021-03-26 20:15:38 +01:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     test('User A can create an entry', async () => { | 
					
						
							|  |  |  |       const rq = getUserRequest(0); | 
					
						
							|  |  |  |       const modelName = getModelName(); | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'POST', | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |         url: `/content-manager/collection-types/api::${modelName}.${modelName}`, | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |         body: localTestData.entry, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.statusCode).toBe(200); | 
					
						
							|  |  |  |       localTestData.entry = res.body; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('User A can read its entry', async () => { | 
					
						
							|  |  |  |       const { id } = localTestData.entry; | 
					
						
							|  |  |  |       const modelName = getModelName(); | 
					
						
							|  |  |  |       const rq = getUserRequest(0); | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'GET', | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |         url: `/content-manager/collection-types/api::${modelName}.${modelName}/${id}`, | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.statusCode).toBe(200); | 
					
						
							|  |  |  |       expect(res.body).toMatchObject(localTestData.entry); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('User B can read the entry created by user A', async () => { | 
					
						
							|  |  |  |       const { id } = localTestData.entry; | 
					
						
							|  |  |  |       const modelName = getModelName(); | 
					
						
							|  |  |  |       const rq = getUserRequest(1); | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'GET', | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |         url: `/content-manager/collection-types/api::${modelName}.${modelName}/${id}`, | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.statusCode).toBe(200); | 
					
						
							|  |  |  |       expect(res.body).toMatchObject(localTestData.entry); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('User B cannot delete the entry created by user A', async () => { | 
					
						
							|  |  |  |       const { id } = localTestData.entry; | 
					
						
							|  |  |  |       const modelName = getModelName(); | 
					
						
							|  |  |  |       const rq = getUserRequest(1); | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'DELETE', | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |         url: `/content-manager/collection-types/api::${modelName}.${modelName}/${id}`, | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.statusCode).toBe(403); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('User A can delete its entry', async () => { | 
					
						
							|  |  |  |       const { id } = localTestData.entry; | 
					
						
							|  |  |  |       const modelName = getModelName(); | 
					
						
							|  |  |  |       const rq = getUserRequest(0); | 
					
						
							|  |  |  |       const res = await rq({ | 
					
						
							|  |  |  |         method: 'DELETE', | 
					
						
							| 
									
										
										
										
											2021-08-06 18:09:49 +02:00
										 |  |  |         url: `/content-manager/collection-types/api::${modelName}.${modelName}/${id}`, | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(res.statusCode).toBe(200); | 
					
						
							|  |  |  |       expect(res.body).toMatchObject(localTestData.entry); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } else { | 
					
						
							|  |  |  |   describe('Admin Permissions - Conditions ', () => { | 
					
						
							|  |  |  |     test.skip('Only in EE', () => {}); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } |