Jean-Sébastien Herbaux 1e5b1c99f6
I18n/ permissions rework (#9535)
* Add a domain layer for the permission, rework the engine handling of the permissions

Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu>

* Add permissions-fields-to-properties migration for the admin

Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu>

* Removes useless console.log

Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu>

* Remove debug logLevel from provider-login.test.e2e.js

Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu>

* Adds the new layout for the GET permissions, allow to subscribe to actionRegistered events, adds i18n handlers

Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu>

* Fix typo

Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu>

* Update permissions validators

Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu>

* Update unit tests

Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu>

* Update integrations test + fix some validation issues

Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu>

* Change plugins & settings section format for the permissions layout

* only return locales property to localized subjects for the permission's layout

* Do not send the locales property to the permission's layout when there is no locales created

* Add the 'locales' property to publish & delete routes

* Fix unwanted mutation of the sections builder states on multiple builds

* Fix units tests with (new engine)

* Fix admin-role e2e test - Add locales property to the update payload

* fix e2e testsé

* Update e2e snapshots

* Fix unit test for i18n bootstrap

* Add mocks for i18n/bootstrap test

* Fix has-locale condition & updatePermission validator

* Avoid mutation in migration, always authorize super admin for has-locales condition

* Rework rbac domain objects, add a hook module and a provider factory

* Remove old providers

* Update the admin services & tests for the new rbac domain & providers

* Fix tests, bootstrap functions & services following rbac domain rework

* Update migration runner

* PR comments

Signed-off-by: Convly <jean-sebastien.herbaux@epitech.eu>

* Remove useless console.log

* Fix sanitizeCondition bug

* Section builder rework

* Add test for the section-builder section & add jsdoc for the permission domain

* pr comments (without the migrations)

* fix fields-to-properties migration

* Add jsdoc for the sections-builder

* Moves createBoundAbstractDomain from permission domain to the engine service

* Remove debug logLevel for admin role test (e2e)

* Fix core-store

* Fix hooks & move business logic from i18n bootstrap to dedicated services

* add route get-non-localized-fields

* use write and read permission

* refacto

* add input validator

* add route doc

* handle ST

Co-authored-by: Pierre Noël <petersg83@gmail.com>
Co-authored-by: Alexandre BODIN <alexandrebodin@users.noreply.github.com>
2021-03-25 14:59:44 +01:00

211 lines
5.3 KiB
JavaScript

'use strict';
const createContext = require('../../../../test/helpers/create-context');
const roleController = require('../role');
describe('Role controller', () => {
describe('getPermissions', () => {
test('Fails if role does not exist', async () => {
const findOne = jest.fn(() => Promise.resolve());
const notFound = jest.fn();
const ctx = createContext(
{
params: { id: 1 },
},
{
notFound,
}
);
global.strapi = {
admin: {
services: {
role: {
findOne,
},
},
},
};
await roleController.getPermissions(ctx);
expect(findOne).toHaveBeenCalledWith({ id: ctx.params.id });
expect(notFound).toHaveBeenCalled();
});
test('Finds permissions correctly', async () => {
const permissions = [
{
action: 'test1',
},
{
action: 'test2',
subject: 'model1',
},
];
const findOneRole = jest.fn(() => Promise.resolve({ id: 1 }));
const findPermissions = jest.fn(() => Promise.resolve(permissions));
const sanitizePermission = jest.fn(perms => perms);
const ctx = createContext({
params: { id: 1 },
});
global.strapi = {
admin: {
services: {
role: {
findOne: findOneRole,
},
permission: {
find: findPermissions,
sanitizePermission,
},
},
},
};
await roleController.getPermissions(ctx);
expect(findOneRole).toHaveBeenCalledWith({ id: ctx.params.id });
expect(findPermissions).toHaveBeenCalledWith({ role: ctx.params.id, _limit: -1 });
expect(ctx.body).toEqual({
data: permissions,
});
});
});
describe('updatePermissions', () => {
test('Fails on missing permissions input', async () => {
const badRequest = jest.fn();
const findOne = jest.fn(() => Promise.resolve({ id: 1 }));
const ctx = createContext(
{
params: { id: 1 },
body: {},
},
{ badRequest }
);
global.strapi = {
admin: {
services: {
permission: {
sanitizePermission: jest.fn(p => p),
},
role: {
findOne,
},
},
},
};
await roleController.updatePermissions(ctx);
expect(badRequest).toHaveBeenCalledWith(
'ValidationError',
expect.objectContaining({
permissions: expect.arrayContaining([]),
})
);
});
test('Fails on missing action permission', async () => {
const badRequest = jest.fn();
const findOne = jest.fn(() => Promise.resolve({ id: 1 }));
const ctx = createContext(
{
params: { id: 1 },
body: {
permissions: [{}],
},
},
{ badRequest }
);
global.strapi = {
admin: {
services: {
role: { findOne },
permission: {
sanitizePermission: jest.fn(p => p),
actionProvider: { get: jest.fn() },
conditionProvider: { values: jest.fn(() => []) },
},
},
},
};
await roleController.updatePermissions(ctx);
expect(badRequest).toHaveBeenCalledWith(
'ValidationError',
expect.objectContaining({
'permissions[0].action': expect.arrayContaining([
'permissions[0].action is a required field',
]),
})
);
});
test('Assign permissions if input is valid', async () => {
const roleID = 1;
const findOneRole = jest.fn(() => Promise.resolve({ id: roleID }));
const assignPermissions = jest.fn((roleID, permissions) => Promise.resolve(permissions));
const inputPermissions = [
{
action: 'test',
subject: 'model1',
properties: { fields: ['title'] },
conditions: ['admin::is-creator'],
},
];
const ctx = createContext({
params: { id: roleID },
body: {
permissions: inputPermissions,
},
});
global.strapi = {
admin: {
services: {
role: {
assignPermissions,
findOne: findOneRole,
getSuperAdmin: jest.fn(() => undefined),
},
permission: {
sanitizePermission: jest.fn(permissions => permissions),
conditionProvider: {
values: jest.fn(() => [{ id: 'admin::is-creator' }]),
},
actionProvider: {
values: jest.fn(() => [{ actionId: 'test', subjects: ['model1'] }]),
get: jest.fn(() => ({
actionId: 'test',
subjects: ['model1'],
options: { applyToProperties: ['fields'] },
})),
},
},
},
},
};
await roleController.updatePermissions(ctx);
expect(findOneRole).toHaveBeenCalledWith({ id: roleID });
expect(assignPermissions).toHaveBeenCalledWith(roleID, inputPermissions);
expect(ctx.body).toEqual({
data: inputPermissions,
});
});
});
});