import fetchMock from 'fetch-mock'; import { cloneDeep } from 'lodash'; import { afterEach, describe, expect, it, vi } from 'vitest'; import RootState from '../types/RootStateModel'; import { CmsStore, storeConfig } from '../index'; import { PermissionModel, PermissionTypes } from '../types/PermissionStoreModel'; describe('Permission store', () => { afterEach(() => { fetchMock.restore(); }); function createLocalStore(): CmsStore { return new CmsStore(cloneDeep(storeConfig)); } it('should fetch permissions right away on store initialization', () => { const store = createLocalStore(); store.dispatch = vi.fn(); expect(store.dispatch).not.toHaveBeenCalled(); store.initialize(); expect(store.dispatch).toHaveBeenCalledWith('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(); store.commit = vi.fn(); expect(store.commit).not.toHaveBeenCalled(); await store.dispatch('permissions/fetchUserPermissions'); expect(store.commit).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, Q.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: 'Q.Cms.SampleCms.Domain.Items.Product, Q.Cms.SampleCms.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', cmsItemName: 'Q.Cms.SampleCms.Domain.Items.Product', permission: 0 }, { cmsItemFullName: 'Q.Cms.Core.Domain.CmsAsset, Q.Cms.Core.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', cmsItemName: 'Q.Cms.Core.Domain.CmsAsset', permission: 10 }, { cmsItemFullName: 'Q.Cms.Core.Domain.CmsUser, Q.Cms.Core.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', cmsItemName: 'Q.Cms.Core.Domain.CmsUser', permission: 20 }, { cmsItemFullName: 'Q.Cms.Core.Domain.EntityType, Q.Cms.Core.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', cmsItemName: 'Q.Cms.Core.Domain.EntityType', permission: 30 }, { cmsItemFullName: 'Q.Cms.Core.Domain.Redirect, Q.Cms.Core.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', cmsItemName: 'Q.Cms.Core.Domain.Redirect', permission: 40 } ];