diff --git a/packages/admin-test-utils/lib/fixtures/index.js b/packages/admin-test-utils/lib/fixtures/index.js index 026fd76c27..9a1e1b040f 100644 --- a/packages/admin-test-utils/lib/fixtures/index.js +++ b/packages/admin-test-utils/lib/fixtures/index.js @@ -3,6 +3,7 @@ const adminPermissions = require('./permissions/admin-permissions'); const cmPermissions = require('./permissions/content-manager-permissions'); const ctbPermissions = require('./permissions/content-type-builder-permissions'); +const store = require('./store'); const permissions = [...adminPermissions, ...cmPermissions, ...ctbPermissions]; @@ -11,4 +12,5 @@ module.exports = { cmPermissions, ctbPermissions, permissions, + store, }; diff --git a/packages/admin-test-utils/lib/fixtures/store/index.js b/packages/admin-test-utils/lib/fixtures/store/index.js new file mode 100644 index 0000000000..d93e720e6f --- /dev/null +++ b/packages/admin-test-utils/lib/fixtures/store/index.js @@ -0,0 +1,56 @@ +'use strict'; + +// eslint-disable-next-line node/no-extraneous-require +const { combineReducers, createStore } = require('redux'); + +const reducers = { + app: jest.fn(() => ({ isLoading: true, uuid: false })), + language: jest.fn(() => ({ locale: 'en' })), + menu: jest.fn(() => ({ + collectionTypesSectionLinks: [], + generalSectionLinks: [ + { + icon: 'list', + label: 'app.components.LeftMenuLinkContainer.listPlugins', + destination: '/list-plugins', + isDisplayed: false, + permissions: [ + { action: 'admin::marketplace.read', subject: null }, + { action: 'admin::marketplace.plugins.install', subject: null }, + { action: 'admin::marketplace.plugins.uninstall', subject: null }, + ], + notificationsCount: 0, + }, + { + icon: 'shopping-basket', + label: 'app.components.LeftMenuLinkContainer.installNewPlugin', + destination: '/marketplace', + isDisplayed: false, + permissions: [ + { action: 'admin::marketplace.read', subject: null }, + { action: 'admin::marketplace.plugins.install', subject: null }, + { action: 'admin::marketplace.plugins.uninstall', subject: null }, + ], + notificationsCount: 0, + }, + { + icon: 'cog', + label: 'app.components.LeftMenuLinkContainer.settings', + isDisplayed: false, + destination: '/settings', + // Permissions of this link are retrieved in the init phase + // using the settings menu + permissions: [], + notificationsCount: 0, + }, + ], + singleTypesSectionLinks: [], + pluginsSectionLinks: [], + isLoading: true, + })), + rbacProvider: jest.fn(() => ({ allPermissions: null, collectionTypesRelatedPermissions: {} })), +}; + +const store = createStore(combineReducers(reducers)).getState(); + +module.exports = store; diff --git a/packages/core/admin/admin/src/StrapiApp.js b/packages/core/admin/admin/src/StrapiApp.js index 58adac4865..8bf747fc4f 100644 --- a/packages/core/admin/admin/src/StrapiApp.js +++ b/packages/core/admin/admin/src/StrapiApp.js @@ -94,6 +94,12 @@ class StrapiApp { }); } + createStore = () => { + const store = configureStore(this.middlewares.middlewares, this.reducers.reducers); + + return store; + }; + getPlugin = pluginId => { return this.plugins[pluginId]; }; @@ -138,7 +144,8 @@ class StrapiApp { }; render() { - const store = configureStore(this.middlewares.middlewares, this.reducers.reducers); + const store = this.createStore(); + const { components: { components }, fields: { fields }, diff --git a/packages/core/admin/admin/src/components/AuthenticatedApp/index.js b/packages/core/admin/admin/src/components/AuthenticatedApp/index.js index c9c76ca48d..bf59d7556b 100644 --- a/packages/core/admin/admin/src/components/AuthenticatedApp/index.js +++ b/packages/core/admin/admin/src/components/AuthenticatedApp/index.js @@ -17,8 +17,6 @@ const AuthenticatedApp = () => { latestStrapiReleaseTag: strapiVersion, }); - // TODO: clean components that depends on this - // This part is just to prepare the refactoring of the Admin page const [ { data: appInfos, status }, { data: tag_name, status: releaseStatus, isLoading }, diff --git a/packages/core/admin/admin/src/components/RBACProvider/index.js b/packages/core/admin/admin/src/components/RBACProvider/index.js index 5d2b5ffc00..e93e52a7d2 100644 --- a/packages/core/admin/admin/src/components/RBACProvider/index.js +++ b/packages/core/admin/admin/src/components/RBACProvider/index.js @@ -4,7 +4,6 @@ import { LoadingIndicatorPage, RBACProviderContext } from '@strapi/helper-plugin import PropTypes from 'prop-types'; import { resetStore, setPermissions } from './actions'; -// TODO const RBACProvider = ({ children, permissions, refetchPermissions }) => { const { allPermissions } = useSelector(state => state.rbacProvider); diff --git a/packages/core/admin/admin/src/core/apis/Plugin.js b/packages/core/admin/admin/src/core/apis/Plugin.js index cdb212613e..813beee3a4 100644 --- a/packages/core/admin/admin/src/core/apis/Plugin.js +++ b/packages/core/admin/admin/src/core/apis/Plugin.js @@ -1,11 +1,8 @@ class Plugin { constructor(pluginConf) { this.apis = pluginConf.apis || {}; - // TODO this.description = pluginConf.description; - // TODO this.icon = pluginConf.icon; - // TODO this.initializer = pluginConf.initializer || null; this.injectionZones = pluginConf.injectionZones || {}; this.isReady = pluginConf.isReady !== undefined ? pluginConf.isReady : true; @@ -15,10 +12,8 @@ class Plugin { this.mainComponent = pluginConf.mainComponent || null; // TODO this.menu = pluginConf.menu || null; - // TODO this.name = pluginConf.name; this.pluginId = pluginConf.id; - // TODO this.pluginLogo = pluginConf.pluginLogo; // TODO this.settings = pluginConf.settings || null; diff --git a/packages/core/admin/admin/src/tests/StrapiApp.test.js b/packages/core/admin/admin/src/tests/StrapiApp.test.js index 0bc2c8870e..7d8906a59d 100644 --- a/packages/core/admin/admin/src/tests/StrapiApp.test.js +++ b/packages/core/admin/admin/src/tests/StrapiApp.test.js @@ -1,12 +1,14 @@ import { render } from '@testing-library/react'; +import { fixtures } from '../../../../../admin-test-utils'; import StrapiApp from '../StrapiApp'; import appReducers from '../reducers'; +const library = { fields: {}, components: {} }; +const middlewares = { middlewares: [] }; +const reducers = { reducers: appReducers }; + describe('ADMIN | StrapiApp', () => { it('should render the app without plugins', () => { - const library = { fields: {}, components: {} }; - const middlewares = { middlewares: [] }; - const reducers = { reducers: appReducers }; const app = StrapiApp({ middlewares, reducers, library }); expect(render(app.render())).toMatchInlineSnapshot(` @@ -144,4 +146,11 @@ describe('ADMIN | StrapiApp', () => { } `); }); + + it('should create a valid store', () => { + const app = StrapiApp({ middlewares, reducers, library }); + + const store = app.createStore(); + expect(store.getState()).toEqual(fixtures.store); + }); }); diff --git a/packages/core/content-manager/admin/src/tests/selectors.test.js b/packages/core/content-manager/admin/src/tests/selectors.test.js index f991ba7b95..02e900bd96 100644 --- a/packages/core/content-manager/admin/src/tests/selectors.test.js +++ b/packages/core/content-manager/admin/src/tests/selectors.test.js @@ -1,10 +1,11 @@ +import { fixtures } from '../../../../../admin-test-utils'; import { selectPermissions, selectCollectionTypePermissions } from '../selectors'; describe('selectors', () => { let store; beforeEach(() => { - store = {}; + store = { ...fixtures.store }; }); describe('selectPermissions', () => { @@ -25,13 +26,8 @@ describe('selectors', () => { }); describe('selectCollectionTypePermissions', () => { - // TODO add store fixture it('resolves the permissions key of the "rbacProvider" store key', () => { - store.rbacProvider = { - collectionTypesRelatedPermissions: { - some: 'permission again', - }, - }; + store.rbacProvider.collectionTypesRelatedPermissions.some = 'permission again'; const actual = selectCollectionTypePermissions(store); const expected = { diff --git a/packages/plugins/documentation/admin/src/index.js b/packages/plugins/documentation/admin/src/index.js index 56c2949e8b..370785ec77 100644 --- a/packages/plugins/documentation/admin/src/index.js +++ b/packages/plugins/documentation/admin/src/index.js @@ -21,9 +21,7 @@ export default { description: pluginDescription, icon, id: pluginId, - // TODO isReady: true, - // TODO isRequired: pluginPkg.strapi.required || false, // TODO mainComponent: App, diff --git a/packages/plugins/i18n/admin/src/middlewares/tests/addCommonFieldsToInitialDataMiddleware.test.js b/packages/plugins/i18n/admin/src/middlewares/tests/addCommonFieldsToInitialDataMiddleware.test.js index c6bde66745..1e689599d9 100644 --- a/packages/plugins/i18n/admin/src/middlewares/tests/addCommonFieldsToInitialDataMiddleware.test.js +++ b/packages/plugins/i18n/admin/src/middlewares/tests/addCommonFieldsToInitialDataMiddleware.test.js @@ -1,3 +1,4 @@ +import { fixtures } from '../../../../../../admin-test-utils'; import addCommonFieldsToInitialDataMiddleware from '../addCommonFieldsToInitialDataMiddleware'; jest.mock('@strapi/helper-plugin', () => ({ @@ -14,20 +15,20 @@ describe('i18n | middlewares | addCommonFieldsToInitialDataMiddleware', () => { const dispatch = jest.fn(); beforeEach(() => { - const store = {}; - - store['content-manager_editViewCrudReducer'] = { - contentTypeDataStructure: { name: 'test', common: 'common default value' }, - }; - - store['content-manager_editViewLayoutManager'] = { - currentLayout: { - components: {}, - contentType: { - uid: 'article', - attributes: { - name: { type: 'string' }, - common: { type: 'string' }, + const store = { + ...fixtures.store, + 'content-manager_editViewCrudReducer': { + contentTypeDataStructure: { name: 'test', common: 'common default value' }, + }, + 'content-manager_editViewLayoutManager': { + currentLayout: { + components: {}, + contentType: { + uid: 'article', + attributes: { + name: { type: 'string' }, + common: { type: 'string' }, + }, }, }, }, diff --git a/packages/plugins/i18n/admin/src/middlewares/tests/addLocaleColumnToListViewMiddleware.test.js b/packages/plugins/i18n/admin/src/middlewares/tests/addLocaleColumnToListViewMiddleware.test.js index fa9cc61b0f..034bf43542 100644 --- a/packages/plugins/i18n/admin/src/middlewares/tests/addLocaleColumnToListViewMiddleware.test.js +++ b/packages/plugins/i18n/admin/src/middlewares/tests/addLocaleColumnToListViewMiddleware.test.js @@ -1,12 +1,11 @@ +import { fixtures } from '../../../../../../admin-test-utils'; import addLocaleColumnToListViewMiddleware from '../addLocaleColumnToListViewMiddleware'; describe('addLocaleColumnToListViewMiddleware', () => { let getState; beforeEach(() => { - const store = {}; - - store.i18n_locales = { locales: [] }; + const store = { ...fixtures.store, i18n_locales: { locales: [] } }; getState = () => store; }); diff --git a/packages/plugins/i18n/admin/src/middlewares/tests/addLocaleToCollectionTypesMiddleware.test.js b/packages/plugins/i18n/admin/src/middlewares/tests/addLocaleToCollectionTypesMiddleware.test.js index e4110892b8..756820dc9c 100644 --- a/packages/plugins/i18n/admin/src/middlewares/tests/addLocaleToCollectionTypesMiddleware.test.js +++ b/packages/plugins/i18n/admin/src/middlewares/tests/addLocaleToCollectionTypesMiddleware.test.js @@ -1,23 +1,25 @@ +import { fixtures } from '../../../../../../admin-test-utils'; import addLocaleToCollectionTypesMiddleware from '../addLocaleToCollectionTypesMiddleware'; describe('i18n | middlewares | addLocaleToCollectionTypesMiddleware', () => { let getState; + let store; beforeEach(() => { - const store = { + store = { + ...fixtures.store, i18n_locales: { locales: [] }, - rbacProvider: { - allPermissions: [], - collectionTypesRelatedPermissions: { - test: { - 'plugins::content-manager.explorer.read': [], - 'plugins::content-manager.explorer.create': [], - }, - }, + }; + store.rbacProvider.allPermissions = []; + + store.rbacProvider.collectionTypesRelatedPermissions = { + test: { + 'plugins::content-manager.explorer.read': [], + 'plugins::content-manager.explorer.create': [], }, }; - getState = () => store; + getState = jest.fn(() => store); }); it('should forward the action when the type is undefined', () => { @@ -76,18 +78,10 @@ describe('i18n | middlewares | addLocaleToCollectionTypesMiddleware', () => { }); it('should add a search key with the default locale when the user has the right to read it', () => { - const tempStore = { - i18n_locales: { locales: [{ code: 'en', isDefault: true }] }, - rbacProvider: { - allPermissions: [], - collectionTypesRelatedPermissions: { - test: { - 'plugins::content-manager.explorer.read': [{ properties: { locales: ['en'] } }], - 'plugins::content-manager.explorer.create': [], - }, - }, - }, - }; + store.i18n_locales = { locales: [{ code: 'en', isDefault: true }] }; + store.rbacProvider.collectionTypesRelatedPermissions.test[ + 'plugins::content-manager.explorer.read' + ] = [{ properties: { locales: ['en'] } }]; const action = { type: 'StrapiAdmin/LeftMenu/SET_CT_OR_ST_LINKS', @@ -96,7 +90,7 @@ describe('i18n | middlewares | addLocaleToCollectionTypesMiddleware', () => { contentTypeSchemas: [{ uid: 'test', pluginOptions: { i18n: { localized: true } } }], }, }; - const middleware = addLocaleToCollectionTypesMiddleware()({ getState: () => tempStore }); + const middleware = addLocaleToCollectionTypesMiddleware()({ getState }); const next = jest.fn(); @@ -116,17 +110,10 @@ describe('i18n | middlewares | addLocaleToCollectionTypesMiddleware', () => { }); it('should set the isDisplayed key to false when the user does not have the right to read any locale', () => { - const tempStore = { - i18n_locales: { locales: [{ code: 'en', isDefault: true }] }, - rbacProvider: { - allPermissions: [], - collectionTypesRelatedPermissions: { - test: { - 'plugins::content-manager.explorer.read': [{ properties: { locales: [] } }], - }, - }, - }, - }; + store.i18n_locales.locales = [{ code: 'en', isDefault: true }]; + store.rbacProvider.collectionTypesRelatedPermissions.test[ + 'plugins::content-manager.explorer.read' + ] = [{ properties: { locales: [] } }]; const action = { type: 'StrapiAdmin/LeftMenu/SET_CT_OR_ST_LINKS', @@ -137,7 +124,7 @@ describe('i18n | middlewares | addLocaleToCollectionTypesMiddleware', () => { contentTypeSchemas: [{ uid: 'test', pluginOptions: { i18n: { localized: true } } }], }, }; - const middleware = addLocaleToCollectionTypesMiddleware()({ getState: () => tempStore }); + const middleware = addLocaleToCollectionTypesMiddleware()({ getState }); const next = jest.fn(); @@ -161,18 +148,10 @@ describe('i18n | middlewares | addLocaleToCollectionTypesMiddleware', () => { }); it('should keep the previous search', () => { - const tempStore = { - i18n_locales: { locales: [{ code: 'en', isDefault: true }] }, - rbacProvider: { - allPermissions: [], - collectionTypesRelatedPermissions: { - test: { - 'plugins::content-manager.explorer.read': [{ properties: { locales: ['en'] } }], - 'plugins::content-manager.explorer.create': [], - }, - }, - }, - }; + store.i18n_locales.locales = [{ code: 'en', isDefault: true }]; + store.rbacProvider.collectionTypesRelatedPermissions.test[ + 'plugins::content-manager.explorer.read' + ] = [{ properties: { locales: ['en'] } }]; const action = { type: 'StrapiAdmin/LeftMenu/SET_CT_OR_ST_LINKS', @@ -183,7 +162,7 @@ describe('i18n | middlewares | addLocaleToCollectionTypesMiddleware', () => { contentTypeSchemas: [{ uid: 'test', pluginOptions: { i18n: { localized: true } } }], }, }; - const middleware = addLocaleToCollectionTypesMiddleware()({ getState: () => tempStore }); + const middleware = addLocaleToCollectionTypesMiddleware()({ getState }); const next = jest.fn(); diff --git a/packages/plugins/i18n/admin/src/middlewares/tests/addLocaleToSingleTypesMiddleware.test.js b/packages/plugins/i18n/admin/src/middlewares/tests/addLocaleToSingleTypesMiddleware.test.js index 9948bcdc85..cc698d0268 100644 --- a/packages/plugins/i18n/admin/src/middlewares/tests/addLocaleToSingleTypesMiddleware.test.js +++ b/packages/plugins/i18n/admin/src/middlewares/tests/addLocaleToSingleTypesMiddleware.test.js @@ -1,23 +1,25 @@ +import { fixtures } from '../../../../../../admin-test-utils'; import addLocaleToSingleTypesMiddleware from '../addLocaleToSingleTypesMiddleware'; describe('i18n | middlewares | addLocaleToSingleTypesMiddleware', () => { let getState; + let store; beforeEach(() => { - const store = { + store = { + ...fixtures.store, i18n_locales: { locales: [] }, - rbacProvider: { - allPermissions: [], - collectionTypesRelatedPermissions: { - test: { - 'plugins::content-manager.explorer.read': [], - 'plugins::content-manager.explorer.create': [], - }, - }, + }; + store.rbacProvider.allPermissions = []; + + store.rbacProvider.collectionTypesRelatedPermissions = { + test: { + 'plugins::content-manager.explorer.read': [], + 'plugins::content-manager.explorer.create': [], }, }; - getState = () => store; + getState = jest.fn(() => store); }); it('should forward the action when the type is undefined', () => { @@ -76,18 +78,10 @@ describe('i18n | middlewares | addLocaleToSingleTypesMiddleware', () => { }); it('should add a search key with the default locale when the user has the right to read it', () => { - const tempStore = { - i18n_locales: { locales: [{ code: 'en', isDefault: true }] }, - rbacProvider: { - allPermissions: [], - collectionTypesRelatedPermissions: { - test: { - 'plugins::content-manager.explorer.read': [{ properties: { locales: ['en'] } }], - 'plugins::content-manager.explorer.create': [], - }, - }, - }, - }; + store.i18n_locales.locales = [{ code: 'en', isDefault: true }]; + store.rbacProvider.collectionTypesRelatedPermissions.test[ + 'plugins::content-manager.explorer.read' + ] = [{ properties: { locales: ['en'] } }]; const action = { type: 'StrapiAdmin/LeftMenu/SET_CT_OR_ST_LINKS', @@ -96,7 +90,7 @@ describe('i18n | middlewares | addLocaleToSingleTypesMiddleware', () => { contentTypeSchemas: [{ uid: 'test', pluginOptions: { i18n: { localized: true } } }], }, }; - const middleware = addLocaleToSingleTypesMiddleware()({ getState: () => tempStore }); + const middleware = addLocaleToSingleTypesMiddleware()({ getState }); const next = jest.fn(); @@ -116,28 +110,11 @@ describe('i18n | middlewares | addLocaleToSingleTypesMiddleware', () => { }); it('should set the isDisplayed key to false when the user does not have the right to read any locale', () => { - const tempStore = { - i18n_locales: { locales: [{ code: 'en', isDefault: true }] }, - rbacProvider: { - allPermissions: [], - collectionTypesRelatedPermissions: { - test: { - 'plugins::content-manager.explorer.read': [{ properties: { locales: [] } }], - 'plugins::content-manager.explorer.create': [], - }, - }, - }, - }; - // tempStore.set('i18n_locales', { locales: [{ code: 'en', isDefault: true }] }); - // tempStore.set('rbacProvider', { allPermissions: [] }); - // tempStore.set('rbacProvider', { - // collectionTypesRelatedPermissions: { - // test: { - // 'plugins::content-manager.explorer.read': [{ properties: { locales: [] } }], - // 'plugins::content-manager.explorer.create': [], - // }, - // }, - // }); + store.i18n_locales.locales = [{ code: 'en', isDefault: true }]; + store.rbacProvider.collectionTypesRelatedPermissions.test[ + 'plugins::content-manager.explorer.read' + ] = [{ properties: { locales: [] } }]; + const action = { type: 'StrapiAdmin/LeftMenu/SET_CT_OR_ST_LINKS', data: { @@ -145,7 +122,7 @@ describe('i18n | middlewares | addLocaleToSingleTypesMiddleware', () => { contentTypeSchemas: [{ uid: 'test', pluginOptions: { i18n: { localized: true } } }], }, }; - const middleware = addLocaleToSingleTypesMiddleware()({ getState: () => tempStore }); + const middleware = addLocaleToSingleTypesMiddleware()({ getState }); const next = jest.fn(); @@ -163,28 +140,11 @@ describe('i18n | middlewares | addLocaleToSingleTypesMiddleware', () => { }); it('should keep the previous search', () => { - const tempStore = { - i18n_locales: { locales: [{ code: 'en', isDefault: true }] }, - rbacProvider: { - allPermissions: [], - collectionTypesRelatedPermissions: { - test: { - 'plugins::content-manager.explorer.read': [{ properties: { locales: ['en'] } }], - 'plugins::content-manager.explorer.create': [], - }, - }, - }, - }; - // tempStore.set('i18n_locales', { locales: [{ code: 'en', isDefault: true }] }); - // tempStore.set('rbacProvider', { allPermissions: [] }); - // tempStore.set('rbacProvider', { - // collectionTypesRelatedPermissions: { - // test: { - // 'plugins::content-manager.explorer.read': [{ properties: { locales: ['en'] } }], - // 'plugins::content-manager.explorer.create': [], - // }, - // }, - // }); + store.i18n_locales.locales = [{ code: 'en', isDefault: true }]; + store.rbacProvider.collectionTypesRelatedPermissions.test[ + 'plugins::content-manager.explorer.read' + ] = [{ properties: { locales: ['en'] } }]; + const action = { type: 'StrapiAdmin/LeftMenu/SET_CT_OR_ST_LINKS', data: { @@ -194,7 +154,7 @@ describe('i18n | middlewares | addLocaleToSingleTypesMiddleware', () => { contentTypeSchemas: [{ uid: 'test', pluginOptions: { i18n: { localized: true } } }], }, }; - const middleware = addLocaleToSingleTypesMiddleware()({ getState: () => tempStore }); + const middleware = addLocaleToSingleTypesMiddleware()({ getState }); const next = jest.fn(); diff --git a/packages/plugins/i18n/admin/src/selectors/tests/selectors.test.js b/packages/plugins/i18n/admin/src/selectors/tests/selectors.test.js new file mode 100644 index 0000000000..4018b8ea05 --- /dev/null +++ b/packages/plugins/i18n/admin/src/selectors/tests/selectors.test.js @@ -0,0 +1,31 @@ +import { fixtures } from '../../../../../../admin-test-utils'; +import selectCollectionTypePermissions from '../selectCollectionTypesRelatedPermissions'; +import selectI18NLocales from '../selectI18NLocales'; + +describe('i18n | selectors | selectCollectionTypePermissions', () => { + let store; + + beforeEach(() => { + store = { ...fixtures.store }; + }); + + it('resolves the permissions key of the "rbacProvider.collectionTypesRelatedPermissions" store key', () => { + const actual = selectCollectionTypePermissions(store); + + expect(actual).toBeDefined(); + }); +}); + +describe('i18n | selectors | selectI18NLocales', () => { + let store; + + beforeEach(() => { + store = { ...fixtures.store, i18n_locales: { isLoading: true, locales: [] } }; + }); + + it('resolves the permissions key of the "i18n_locales" store key', () => { + const actual = selectI18NLocales(store); + + expect(actual).toBeDefined(); + }); +});