| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  | const { prop } = require('lodash/fp'); | 
					
						
							| 
									
										
										
										
											2023-04-05 10:32:20 +02:00
										 |  |  | const { createTestBuilder } = require('api-tests/builder'); | 
					
						
							|  |  |  | const { createStrapiInstance } = require('api-tests/strapi'); | 
					
						
							|  |  |  | const { createRequest, createAuthRequest } = require('api-tests/request'); | 
					
						
							|  |  |  | const { createUtils } = require('api-tests/utils'); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  | describe('Admin Permissions - Conditions', () => { | 
					
						
							|  |  |  |   let strapi; | 
					
						
							|  |  |  |   let utils; | 
					
						
							|  |  |  |   const builder = createTestBuilder(); | 
					
						
							|  |  |  |   const requests = { | 
					
						
							|  |  |  |     public: null, | 
					
						
							|  |  |  |     admin: null, | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const localTestData = { | 
					
						
							|  |  |  |     models: { | 
					
						
							|  |  |  |       article: { | 
					
						
							|  |  |  |         singularName: 'article', | 
					
						
							|  |  |  |         pluralName: 'articles', | 
					
						
							|  |  |  |         displayName: 'Article', | 
					
						
							|  |  |  |         attributes: { | 
					
						
							|  |  |  |           title: { | 
					
						
							|  |  |  |             type: 'string', | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           price: { | 
					
						
							|  |  |  |             type: 'integer', | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |           }, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |     }, | 
					
						
							|  |  |  |     entry: { | 
					
						
							|  |  |  |       name: 'Test Article', | 
					
						
							|  |  |  |       price: 999, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     role: { | 
					
						
							|  |  |  |       name: 'foobar', | 
					
						
							|  |  |  |       description: 'A dummy test role', | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     permissions: [ | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         action: 'plugin::content-manager.explorer.create', | 
					
						
							|  |  |  |         subject: 'api::article.article', | 
					
						
							|  |  |  |         fields: null, | 
					
						
							|  |  |  |         conditions: [], | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |       { | 
					
						
							|  |  |  |         action: 'plugin::content-manager.explorer.read', | 
					
						
							|  |  |  |         subject: 'api::article.article', | 
					
						
							|  |  |  |         fields: null, | 
					
						
							|  |  |  |         conditions: ['admin::has-same-role-as-creator'], | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |       { | 
					
						
							|  |  |  |         action: 'plugin::content-manager.explorer.delete', | 
					
						
							|  |  |  |         subject: 'api::article.article', | 
					
						
							|  |  |  |         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' }, | 
					
						
							|  |  |  |     ], | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |   const createFixtures = async () => { | 
					
						
							|  |  |  |     // Login with admin and init admin tools
 | 
					
						
							|  |  |  |     requests.admin = await createAuthRequest({ strapi }); | 
					
						
							|  |  |  |     requests.public = createRequest({ strapi }); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |     // Create the foobar role
 | 
					
						
							|  |  |  |     const role = await utils.createRole(localTestData.role); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |     // Assign permissions to the foobar role
 | 
					
						
							|  |  |  |     const permissions = await utils.assignPermissionsToRole(role.id, localTestData.permissions); | 
					
						
							|  |  |  |     Object.assign(role, { permissions }); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |     // Create users with the new role & create associated auth requests
 | 
					
						
							|  |  |  |     const users = []; | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |     for (let i = 0; i < localTestData.users.length; i += 1) { | 
					
						
							|  |  |  |       const userFixture = localTestData.users[i]; | 
					
						
							|  |  |  |       const userAttributes = { | 
					
						
							|  |  |  |         ...userFixture, | 
					
						
							|  |  |  |         password: localTestData.userPassword, | 
					
						
							|  |  |  |         roles: [role.id], | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |       const createdUser = await utils.createUser(userAttributes); | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |       requests[createdUser.id] = await createAuthRequest({ strapi, userInfo: createdUser }); | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |       users.push(createdUser); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |     // Update the local data store
 | 
					
						
							|  |  |  |     Object.assign(localTestData, { role, permissions, users }); | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |   const getUserRequest = (idx) => requests[localTestData.users[idx].id]; | 
					
						
							|  |  |  |   const getModelName = () => localTestData.models.article.singularName; | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |   const deleteFixtures = async () => { | 
					
						
							|  |  |  |     // Delete users
 | 
					
						
							|  |  |  |     const usersId = localTestData.users.map(prop('id')); | 
					
						
							|  |  |  |     await utils.deleteUsersById(usersId); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |     // Delete the foobar role
 | 
					
						
							|  |  |  |     await utils.deleteRolesById([localTestData.role.id]); | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |   beforeAll(async () => { | 
					
						
							|  |  |  |     await builder.addContentType(localTestData.models.article).build(); | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |     strapi = await createStrapiInstance(); | 
					
						
							|  |  |  |     utils = createUtils(strapi); | 
					
						
							| 
									
										
										
										
											2020-11-17 15:38:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |     await createFixtures(); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |   afterAll(async () => { | 
					
						
							|  |  |  |     await deleteFixtures(); | 
					
						
							| 
									
										
										
										
											2021-01-12 11:36:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |     await strapi.destroy(); | 
					
						
							|  |  |  |     await builder.cleanup(); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |   test('User A can create an entry', async () => { | 
					
						
							|  |  |  |     const rq = getUserRequest(0); | 
					
						
							|  |  |  |     const modelName = getModelName(); | 
					
						
							|  |  |  |     const res = await rq({ | 
					
						
							|  |  |  |       method: 'POST', | 
					
						
							|  |  |  |       url: `/content-manager/collection-types/api::${modelName}.${modelName}`, | 
					
						
							|  |  |  |       body: localTestData.entry, | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |     expect(res.statusCode).toBe(200); | 
					
						
							|  |  |  |     localTestData.entry = res.body; | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |   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', | 
					
						
							|  |  |  |       url: `/content-manager/collection-types/api::${modelName}.${modelName}/${id}`, | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |     expect(res.statusCode).toBe(200); | 
					
						
							|  |  |  |     expect(res.body).toMatchObject(localTestData.entry); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  |   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', | 
					
						
							|  |  |  |       url: `/content-manager/collection-types/api::${modelName}.${modelName}/${id}`, | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01: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', | 
					
						
							|  |  |  |       url: `/content-manager/collection-types/api::${modelName}.${modelName}/${id}`, | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     expect(res.statusCode).toBe(403); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   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', | 
					
						
							|  |  |  |       url: `/content-manager/collection-types/api::${modelName}.${modelName}/${id}`, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(res.statusCode).toBe(200); | 
					
						
							|  |  |  |     expect(res.body).toMatchObject(localTestData.entry); | 
					
						
							| 
									
										
										
										
											2020-10-08 19:50:39 +02:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2023-03-06 21:46:45 +01:00
										 |  |  | }); |