// @ts-ignore import { fetchMock } from 'fetch-mock'; import { cloneDeep } from 'lodash'; import RootState from '../types/RootStateModel'; import { CmsStore, storeConfig } from '../index'; import { PermissionModel, PermissionTypes } from '../types/PermissionStoreModel'; import { TypedVueRouter as VueRouter } from '../../tools/vue-router' const router = new VueRouter(); describe('Permission store', () => { afterEach(() => { fetchMock.restore(); }); function createLocalStore(): CmsStore { return new CmsStore(cloneDeep(storeConfig)); } it('should fetch permissions right away on store initialization', async () => { const store = createLocalStore(); const dispatchSpy = jest.spyOn(store, 'dispatch').mockImplementation(jest.fn()); expect(dispatchSpy).not.toHaveBeenCalled(); await store.initialize(router); expect(dispatchSpy.mock.calls).toContainEqual(['permissions/fetchUserPermissions', undefined]); }); it('should fetch the permissions from the server and put them in a store', async () => { fetchMock.get(/api\/authorization\/permissions/, { status: 200, body: samplePermissions, }); const store = createLocalStore(); const commitSpy = jest.spyOn(store, 'commit').mockImplementation(jest.fn()); expect(commitSpy).not.toHaveBeenCalled(); await store.dispatch('permissions/fetchUserPermissions'); expect(commitSpy).toHaveBeenCalledWith('permissions/userPermissions', samplePermissions, undefined); }); it('should find permissions based on item name', () => { const store = createLocalStore(); store.commit('permissions/userPermissions', samplePermissions); expect(store.getters['permissions/findPermission']('Product')).toEqual(samplePermissions[0]); }); it('should throw an error when cmsItemName does not contain expected value', () => { const store = createLocalStore(); store.commit('permissions/userPermissions', [{ cmsItemFullName: 'Product, Q42.Cms.SampleCms.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', cmsItemName: '', permission: 10, }]); try { store.getters['permissions/findPermission']('Product'); } catch (err) { expect(err.message).toEqual('Could not convert permission cmsItemName to entity name'); } }); it('should return appropriate permissions when all permissions of an item are returned', () => { const store = createLocalStore(); store.commit('permissions/userPermissions', samplePermissions); expect(store.getters['permissions/getPermissions']('Product')).toEqual({ canRead: false, canUpdate: false, canCreate: false, canDelete: false, }); expect(store.getters['permissions/getPermissions']('CmsUser')).toEqual({ canRead: true, canUpdate: true, canCreate: false, canDelete: false, }); expect(store.getters['permissions/getPermissions']('Redirect')).toEqual({ canRead: true, canUpdate: true, canCreate: true, canDelete: true, }); }); it('should return false for all permissions if a permissionEntity can not be found', () => { const store = createLocalStore(); expect(store.getters['permissions/getPermissions']('Redirect')).toEqual({ canRead: false, canUpdate: false, canCreate: false, canDelete: false, }); }); it('should resolve correct permissions based on itemName and permission names', () => { const store = createLocalStore(); store.commit('permissions/userPermissions', samplePermissions); expect(store.getters['permissions/hasPermission']('CmsUser', PermissionTypes.Read)).toEqual(true); expect(store.getters['permissions/hasPermission']('CmsUser', PermissionTypes.Update)).toEqual(true); expect(store.getters['permissions/hasPermission']('CmsUser', PermissionTypes.Create)).toEqual(false); expect(store.getters['permissions/hasPermission']('CmsUser', PermissionTypes.Delete)).toEqual(false); }); it('should deny permission by default if a permissionEntity is not present', () => { const store = createLocalStore(); expect(store.getters['permissions/hasPermission']('Redirect', PermissionTypes.Read)).toEqual(false); expect(store.getters['permissions/hasPermission']('Redirect', PermissionTypes.Update)).toEqual(false); expect(store.getters['permissions/hasPermission']('Redirect', PermissionTypes.Create)).toEqual(false); expect(store.getters['permissions/hasPermission']('Redirect', PermissionTypes.Delete)).toEqual(false); }); it('should correctly return canRead short-hand getter values', () => { const store = createLocalStore(); store.commit('permissions/userPermissions', samplePermissions); expect(store.getters['permissions/canRead']('Product')).toEqual(false); expect(store.getters['permissions/canRead']('Redirect')).toEqual(true); }); it('should correctly return canUpdate short-hand getter values', () => { const store = createLocalStore(); store.commit('permissions/userPermissions', samplePermissions); expect(store.getters['permissions/canUpdate']('Product')).toEqual(false); expect(store.getters['permissions/canUpdate']('Redirect')).toEqual(true); }); it('should correctly return canUpdate short-hand getter values', () => { const store = createLocalStore(); store.commit('permissions/userPermissions', samplePermissions); expect(store.getters['permissions/canUpdate']('Product')).toEqual(false); expect(store.getters['permissions/canUpdate']('Redirect')).toEqual(true); }); it('should correctly return canCreate short-hand getter values', () => { const store = createLocalStore(); store.commit('permissions/userPermissions', samplePermissions); expect(store.getters['permissions/canCreate']('Product')).toEqual(false); expect(store.getters['permissions/canCreate']('Redirect')).toEqual(true); }); it('should correctly return canDelete short-hand getter values', () => { const store = createLocalStore(); store.commit('permissions/userPermissions', samplePermissions); expect(store.getters['permissions/canDelete']('Product')).toEqual(false); expect(store.getters['permissions/canDelete']('Redirect')).toEqual(true); }); }); const samplePermissions: PermissionModel[] = [{ cmsItemFullName: 'Q42.Cms.SampleCms.Domain.Items.Product, Q42.Cms.SampleCms.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', cmsItemName: 'Q42.Cms.SampleCms.Domain.Items.Product', permission: 0, }, { cmsItemFullName: 'Q42.Cms.Core.Domain.CmsAsset, Q42.Cms.Core.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', cmsItemName: 'Q42.Cms.Core.Domain.CmsAsset', permission: 10, }, { cmsItemFullName: 'Q42.Cms.Core.Domain.CmsUser, Q42.Cms.Core.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', cmsItemName: 'Q42.Cms.Core.Domain.CmsUser', permission: 20, }, { cmsItemFullName: 'Q42.Cms.Core.Domain.EntityType, Q42.Cms.Core.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', cmsItemName: 'Q42.Cms.Core.Domain.EntityType', permission: 30, }, { cmsItemFullName: 'Q42.Cms.Core.Domain.Redirect, Q42.Cms.Core.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', cmsItemName: 'Q42.Cms.Core.Domain.Redirect', permission: 40, }];