From 044c47e7329e16fb68950366ee4a0e270d2f2cff Mon Sep 17 00:00:00 2001 From: soupette Date: Mon, 15 Jun 2020 18:04:28 +0200 Subject: [PATCH] Add tests Signed-off-by: soupette --- .../admin/src/containers/LeftMenu/index.js | 1 + .../utils/findFirstAllowedEndpoint.js | 1 - .../tests/findFirstAllowedEndpoint.test.js | 188 +++++++++++++++++- .../src/hooks/useSettingsMenu/reducer.js | 11 +- .../hooks/useSettingsMenu/tests/init.test.js | 94 ++++++++- .../useSettingsMenu/tests/reducer.test.js | 117 ++++++++++- .../strapi-admin/admin/src/permissions.js | 1 + .../admin/src/utils/fakePermissionsData.js | 96 ++++----- .../lib/src/utils/hasPermissions.js | 2 +- .../components/SelectedAssets/SortableList.js | 7 +- .../src/components/SelectedAssets/index.js | 2 + .../strapi-plugin-upload/admin/src/index.js | 2 +- .../admin/src/permissions.js | 11 +- 13 files changed, 461 insertions(+), 72 deletions(-) diff --git a/packages/strapi-admin/admin/src/containers/LeftMenu/index.js b/packages/strapi-admin/admin/src/containers/LeftMenu/index.js index af4a861acd..58cb2080a1 100644 --- a/packages/strapi-admin/admin/src/containers/LeftMenu/index.js +++ b/packages/strapi-admin/admin/src/containers/LeftMenu/index.js @@ -166,6 +166,7 @@ const LeftMenu = forwardRef(({ version, plugins }, ref) => { searchable /> )} + object.map(({ links }) => links).flat(); const findFirstAllowedEndpoint = menuObject => { - console.log({ menuObject }); const arrayOfLinks = generateArrayOfLinks(menuObject); const link = arrayOfLinks.find(link => link.isDisplayed === true); diff --git a/packages/strapi-admin/admin/src/containers/SettingsPage/utils/tests/findFirstAllowedEndpoint.test.js b/packages/strapi-admin/admin/src/containers/SettingsPage/utils/tests/findFirstAllowedEndpoint.test.js index 5197ef36e0..c09b8edcc7 100644 --- a/packages/strapi-admin/admin/src/containers/SettingsPage/utils/tests/findFirstAllowedEndpoint.test.js +++ b/packages/strapi-admin/admin/src/containers/SettingsPage/utils/tests/findFirstAllowedEndpoint.test.js @@ -1,10 +1,190 @@ -// TODO -// import findFirstAllowedEndpoint, { generateArrayOfLinks } from '../findFirstAllowedEndpoint'; +import findFirstAllowedEndpoint, { generateArrayOfLinks } from '../findFirstAllowedEndpoint'; describe('ADMIN | SettingsPage | utils', () => { describe('findFirstAllowedEndpoint', () => { - it('should', () => { - expect(true).toBe(true); + it('should return null if there is no sections', () => { + expect(findFirstAllowedEndpoint([])).toBeNull(); + }); + + it('should return null if all links are hidden', () => { + const data = [ + { + id: 'global', + links: [ + { + to: 'global.test', + isDisplayed: false, + }, + { + to: 'global.test2', + isDisplayed: false, + }, + ], + }, + { + id: 'test', + links: [ + { + to: 'test.test', + isDisplayed: false, + }, + { + to: 'test.test2', + isDisplayed: false, + }, + ], + }, + ]; + + expect(findFirstAllowedEndpoint(data)).toBeNull(); + }); + + it('should return the destination of the first displayed link', () => { + const data = [ + { + id: 'global', + links: [ + { + to: 'global.test', + isDisplayed: false, + }, + { + to: 'global.test2', + isDisplayed: false, + }, + ], + }, + { + id: 'test', + links: [ + { + to: 'test.test', + isDisplayed: false, + }, + { + to: 'test.test2', + isDisplayed: true, + }, + { + to: 'test.test3', + isDisplayed: true, + }, + ], + }, + { + id: 'test1', + links: [ + { + to: 'test1.test', + isDisplayed: true, + }, + { + to: 'test1.test2', + isDisplayed: true, + }, + { + to: 'test1.test3', + isDisplayed: true, + }, + ], + }, + ]; + + expect(findFirstAllowedEndpoint(data)).toEqual('test.test2'); + }); + }); + + describe('generateArrayOfLinks', () => { + it('should return an empty array', () => { + expect(generateArrayOfLinks([])).toEqual([]); + }); + + it('should return an array containing all the links', () => { + const data = [ + { + id: 'global', + links: [ + { + to: 'global.test', + isDisplayed: false, + }, + { + to: 'global.test2', + isDisplayed: false, + }, + ], + }, + { + id: 'test', + links: [ + { + to: 'test.test', + isDisplayed: false, + }, + { + to: 'test.test2', + isDisplayed: true, + }, + { + to: 'test.test3', + isDisplayed: true, + }, + ], + }, + { + id: 'test1', + links: [ + { + to: 'test1.test', + isDisplayed: true, + }, + { + to: 'test1.test2', + isDisplayed: true, + }, + { + to: 'test1.test3', + isDisplayed: true, + }, + ], + }, + ]; + const expected = [ + { + to: 'global.test', + isDisplayed: false, + }, + { + to: 'global.test2', + isDisplayed: false, + }, + { + to: 'test.test', + isDisplayed: false, + }, + { + to: 'test.test2', + isDisplayed: true, + }, + { + to: 'test.test3', + isDisplayed: true, + }, + { + to: 'test1.test', + isDisplayed: true, + }, + { + to: 'test1.test2', + isDisplayed: true, + }, + { + to: 'test1.test3', + isDisplayed: true, + }, + ]; + + expect(generateArrayOfLinks(data)).toEqual(expected); }); }); }); diff --git a/packages/strapi-admin/admin/src/hooks/useSettingsMenu/reducer.js b/packages/strapi-admin/admin/src/hooks/useSettingsMenu/reducer.js index 855e55f0a6..0da08b55e4 100644 --- a/packages/strapi-admin/admin/src/hooks/useSettingsMenu/reducer.js +++ b/packages/strapi-admin/admin/src/hooks/useSettingsMenu/reducer.js @@ -1,5 +1,5 @@ import produce from 'immer'; -import { set, unset } from 'lodash'; +import { set } from 'lodash'; const initialState = { menu: [], @@ -18,11 +18,16 @@ const reducer = (state, action) => ['menu', ...checkedPermissions.path.split('.'), 'isDisplayed'], checkedPermissions.hasPermission ); - } else { - unset(draftState, ['menu', ...checkedPermissions.path.split('.')]); } }); + // Remove the not needed links in each section + draftState.menu.forEach((section, sectionIndex) => { + draftState.menu[sectionIndex].links = section.links.filter( + link => link.isDisplayed === true + ); + }); + draftState.isLoading = false; break; } diff --git a/packages/strapi-admin/admin/src/hooks/useSettingsMenu/tests/init.test.js b/packages/strapi-admin/admin/src/hooks/useSettingsMenu/tests/init.test.js index d048427376..5c01ba84e6 100644 --- a/packages/strapi-admin/admin/src/hooks/useSettingsMenu/tests/init.test.js +++ b/packages/strapi-admin/admin/src/hooks/useSettingsMenu/tests/init.test.js @@ -1,7 +1,91 @@ -describe('ADMIN | SettingsPage | utils', () => { - describe('findFirstAllowedEndpoint', () => { - it('should', () => { - expect(true).toBe(true); - }); +import { SETTINGS_BASE_URL } from '../../../config'; +import adminPermissions from '../../../permissions'; +import init from '../init'; + +describe('ADMIN | hooks | useSettingsMenu | init', () => { + it('should return the settings menu', () => { + const plugins = { + upload: { + settings: { + global: { + links: [ + { + name: 'media-library', + permissions: [ + { + action: 'plugins::upload.settings.read', + subject: null, + }, + ], + title: { id: 'upload.plugin.name', defaultMessage: 'Media Library' }, + to: '/settings/media-library', + }, + ], + }, + }, + }, + }; + const initialState = { + isLoading: true, + menu: [], + }; + const expected = { + isLoading: true, + menu: [ + { + id: 'global', + links: [ + { + isDisplayed: false, + name: 'media-library', + permissions: [ + { + action: 'plugins::upload.settings.read', + subject: null, + }, + ], + title: { id: 'upload.plugin.name', defaultMessage: 'Media Library' }, + to: '/settings/media-library', + }, + { + isDisplayed: false, + name: 'webhooks', + permissions: [ + { action: 'admin::webhooks.create', subject: null }, + { action: 'admin::webhooks.read', subject: null }, + { action: 'admin::webhooks.update', subject: null }, + { action: 'admin::webhooks.delete', subject: null }, + ], + title: { id: 'Settings.webhooks.title' }, + to: '/settings/webhooks', + }, + ], + title: { id: 'Settings.global' }, + }, + { + id: 'permissions', + title: 'Settings.permissions', + links: [ + { + title: { id: 'Settings.permissions.menu.link.roles.label' }, + to: `${SETTINGS_BASE_URL}/roles`, + name: 'roles', + isDisplayed: false, + permissions: adminPermissions.settings.roles.main, + }, + { + title: { id: 'Settings.permissions.menu.link.users.label' }, + // Init the search params directly + to: `${SETTINGS_BASE_URL}/users?pageSize=10&page=1&_sort=firstname%3AASC`, + name: 'users', + isDisplayed: false, + permissions: adminPermissions.settings.users.main, + }, + ], + }, + ], + }; + + expect(init(initialState, plugins)).toEqual(expected); }); }); diff --git a/packages/strapi-admin/admin/src/hooks/useSettingsMenu/tests/reducer.test.js b/packages/strapi-admin/admin/src/hooks/useSettingsMenu/tests/reducer.test.js index d048427376..5f5ca4328e 100644 --- a/packages/strapi-admin/admin/src/hooks/useSettingsMenu/tests/reducer.test.js +++ b/packages/strapi-admin/admin/src/hooks/useSettingsMenu/tests/reducer.test.js @@ -1,7 +1,116 @@ -describe('ADMIN | SettingsPage | utils', () => { - describe('findFirstAllowedEndpoint', () => { - it('should', () => { - expect(true).toBe(true); +import reducer from '../reducer'; + +describe('ADMIN | hooks | useSettingsMenu | reducer', () => { + describe('DEFAULT_ACTION', () => { + it('should return the state', () => { + const initialState = { + ok: true, + }; + const expected = { + ok: true, + }; + + expect(reducer(initialState, {})).toEqual(expected); + }); + }); + + describe('CHECK_PERMISSIONS_SUCCEEDED', () => { + it('should set the permissions correctly', () => { + const initialState = { + isLoading: true, + menu: [ + { + id: 'global', + links: [ + { + to: 'global.test', + isDisplayed: false, + }, + { + to: 'global.test2', + isDisplayed: false, + }, + ], + }, + { + id: 'test', + links: [ + { + to: 'test.test', + isDisplayed: false, + }, + { + to: 'test.test2', + isDisplayed: false, + }, + { + to: 'test.test3', + isDisplayed: false, + }, + ], + }, + { + id: 'test1', + links: [ + { + to: 'test1.test', + isDisplayed: false, + }, + { + to: 'test1.test2', + isDisplayed: false, + }, + { + to: 'test1.test3', + isDisplayed: false, + }, + ], + }, + ], + }; + const action = { + type: 'CHECK_PERMISSIONS_SUCCEEDED', + data: [ + { hasPermission: true, path: '1.links.0' }, + { hasPermission: true, path: '1.links.1' }, + { hasPermission: true, path: '0.links.1' }, + { hasPermission: undefined, path: '2.links.0' }, + ], + }; + + const expected = { + isLoading: false, + menu: [ + { + id: 'global', + links: [ + { + to: 'global.test2', + isDisplayed: true, + }, + ], + }, + { + id: 'test', + links: [ + { + to: 'test.test', + isDisplayed: true, + }, + { + to: 'test.test2', + isDisplayed: true, + }, + ], + }, + { + id: 'test1', + links: [], + }, + ], + }; + + expect(reducer(initialState, action)).toEqual(expected); }); }); }); diff --git a/packages/strapi-admin/admin/src/permissions.js b/packages/strapi-admin/admin/src/permissions.js index 9e2d7cdfd5..fe32d1e3d4 100644 --- a/packages/strapi-admin/admin/src/permissions.js +++ b/packages/strapi-admin/admin/src/permissions.js @@ -33,6 +33,7 @@ const permissions = { read: [ { action: 'admin::users.read', subject: null }, { action: 'admin::users.update', subject: null }, + { action: 'admin::users.delete', subject: null }, ], update: [{ action: 'admin::users.update', subject: null }], }, diff --git a/packages/strapi-admin/admin/src/utils/fakePermissionsData.js b/packages/strapi-admin/admin/src/utils/fakePermissionsData.js index c31ac9f658..2071af5d2c 100644 --- a/packages/strapi-admin/admin/src/utils/fakePermissionsData.js +++ b/packages/strapi-admin/admin/src/utils/fakePermissionsData.js @@ -248,24 +248,24 @@ const data = { // }, // Admin webhooks - { - action: 'admin::webhooks.create', - subject: null, - fields: null, - conditions: [], - }, - { - action: 'admin::webhooks.read', - subject: null, - fields: null, - conditions: [], - }, - { - action: 'admin::webhooks.update', - subject: null, - fields: null, - conditions: [], - }, + // { + // action: 'admin::webhooks.create', + // subject: null, + // fields: null, + // conditions: [], + // }, + // { + // action: 'admin::webhooks.read', + // subject: null, + // fields: null, + // conditions: [], + // }, + // { + // action: 'admin::webhooks.update', + // subject: null, + // fields: null, + // conditions: [], + // }, // { // action: 'admin::webhooks.delete', // subject: null, @@ -274,30 +274,30 @@ const data = { // }, // // Admin users - { - action: 'admin::users.create', - subject: null, - fields: null, - conditions: [], - }, + // { + // action: 'admin::users.create', + // subject: null, + // fields: null, + // conditions: [], + // }, // { // action: 'admin::users.read', // subject: null, // fields: null, // conditions: [], // }, - { - action: 'admin::users.update', - subject: null, - fields: null, - conditions: [], - }, - { - action: 'admin::users.delete', - subject: null, - fields: null, - conditions: [], - }, + // { + // action: 'admin::users.update', + // subject: null, + // fields: null, + // conditions: [], + // }, + // { + // action: 'admin::users.delete', + // subject: null, + // fields: null, + // conditions: [], + // }, // // Admin roles // { @@ -306,12 +306,12 @@ const data = { // fields: null, // conditions: [], // }, - { - action: 'admin::roles.read', - subject: null, - fields: null, - conditions: [], - }, + // { + // action: 'admin::roles.read', + // subject: null, + // fields: null, + // conditions: [], + // }, // { // action: 'admin::roles.update', // subject: null, @@ -416,12 +416,12 @@ const data = { // fields: null, // conditions: [], // }, - { - action: 'plugins::upload.settings.read', - subject: null, - fields: null, - conditions: null, - }, + // { + // action: 'plugins::upload.settings.read', + // subject: null, + // fields: null, + // conditions: null, + // }, // Users-permissions { diff --git a/packages/strapi-helper-plugin/lib/src/utils/hasPermissions.js b/packages/strapi-helper-plugin/lib/src/utils/hasPermissions.js index d14be9b0e2..527199c72d 100644 --- a/packages/strapi-helper-plugin/lib/src/utils/hasPermissions.js +++ b/packages/strapi-helper-plugin/lib/src/utils/hasPermissions.js @@ -20,7 +20,7 @@ const shouldCheckPermissions = permissions => !isEmpty(permissions) && permissions.every(perm => !isEmpty(perm.conditions)); const hasPermissions = async (userPermissions, permissions) => { - if (!permissions.length) { + if (!permissions || !permissions.length) { return true; } diff --git a/packages/strapi-plugin-upload/admin/src/components/SelectedAssets/SortableList.js b/packages/strapi-plugin-upload/admin/src/components/SelectedAssets/SortableList.js index c63d0239b9..515ff1d42f 100644 --- a/packages/strapi-plugin-upload/admin/src/components/SelectedAssets/SortableList.js +++ b/packages/strapi-plugin-upload/admin/src/components/SelectedAssets/SortableList.js @@ -9,6 +9,7 @@ import ListWrapper from '../ListWrapper'; import CardControl from '../CardControl'; const SortableList = ({ + allowedActions, canSelect, data, moveAsset, @@ -54,7 +55,7 @@ const SortableList = ({ /> )} - {!noNavigation && ( + {!noNavigation && allowedActions.canUpdate && ( {}, @@ -85,6 +89,7 @@ SortableList.defaultProps = { }; SortableList.propTypes = { + allowedActions: PropTypes.object, canSelect: PropTypes.bool, data: PropTypes.array, moveAsset: PropTypes.func, diff --git a/packages/strapi-plugin-upload/admin/src/components/SelectedAssets/index.js b/packages/strapi-plugin-upload/admin/src/components/SelectedAssets/index.js index b0fb349a6c..4db73b7075 100644 --- a/packages/strapi-plugin-upload/admin/src/components/SelectedAssets/index.js +++ b/packages/strapi-plugin-upload/admin/src/components/SelectedAssets/index.js @@ -13,6 +13,7 @@ import ListWrapper from './ListWrapper'; const SelectedAssets = () => { const { + allowedActions, selectedFiles, handleFileSelection, handleGoToEditFile, @@ -39,6 +40,7 @@ const SelectedAssets = () => { { defaultMessage: 'Media Library', }, name: 'media-library', - to: `${strapi.settingsBaseURL}/upload`, + to: `${strapi.settingsBaseURL}/media-library`, Component: () => ( diff --git a/packages/strapi-plugin-users-permissions/admin/src/permissions.js b/packages/strapi-plugin-users-permissions/admin/src/permissions.js index eb4386148a..0785b716a8 100644 --- a/packages/strapi-plugin-users-permissions/admin/src/permissions.js +++ b/packages/strapi-plugin-users-permissions/admin/src/permissions.js @@ -12,24 +12,27 @@ const pluginPermissions = { createRole: [{ action: 'plugins::users-permissions.roles.create', subject: null }], readAdvancedSettings: [ { action: 'plugins::users-permissions.advanced-settings.read', subject: null }, - // { action: 'plugins::users-permissions.advanced-settings.update', subject: null }, + { action: 'plugins::users-permissions.advanced-settings.update', subject: null }, ], updateAdvancedSettings: [ { action: 'plugins::users-permissions.advanced-settings.update', subject: null }, ], readEmailTemplates: [ { action: 'plugins::users-permissions.email-templates.read', subject: null }, - // { action: 'plugins::users-permissions.email-templates.update', subject: null }, + { action: 'plugins::users-permissions.email-templates.update', subject: null }, ], updateEmailTemplates: [ { action: 'plugins::users-permissions.email-templates.update', subject: null }, ], readProviders: [ { action: 'plugins::users-permissions.providers.read', subject: null }, - // { action: 'plugins::users-permissions.providers.update', subject: null }, + { action: 'plugins::users-permissions.providers.update', subject: null }, ], updateProviders: [{ action: 'plugins::users-permissions.providers.update', subject: null }], - readRoles: [{ action: 'plugins::users-permissions.roles.read', subject: null }], + readRoles: [ + { action: 'plugins::users-permissions.roles.read', subject: null }, + { action: 'plugins::users-permissions.roles.update', subject: null }, + ], updateRole: [{ action: 'plugins::users-permissions.roles.update', subject: null }], deleteRole: [{ action: 'plugins::users-permissions.roles.delete', subject: null }], };