Add tests for new studio permissions

This commit is contained in:
Paul Kaplan 2021-05-03 10:52:04 -04:00
parent 29f6006b40
commit 0f8baaaa45
3 changed files with 121 additions and 5 deletions

View file

@ -29,14 +29,15 @@ const selectCanFollowStudio = state => selectIsLoggedIn(state);
const selectCanEditCommentsAllowed = state => selectIsAdmin(state) || isCreator(state); const selectCanEditCommentsAllowed = state => selectIsAdmin(state) || isCreator(state);
const selectCanEditOpenToAll = state => isManager(state); const selectCanEditOpenToAll = state => isManager(state);
const selectShowCuratorInvite = state => state.studio.invited; const selectShowCuratorInvite = state => !!state.studio.invited;
const selectCanInviteCurators = state => isManager(state); const selectCanInviteCurators = state => isManager(state);
const selectCanRemoveCurators = state => isManager(state); const selectCanRemoveCurators = state => isManager(state) || selectIsAdmin(state);
const selectCanRemoveManager = (state, managerId) => isManager(state) && managerId !== state.studio.owner; const selectCanRemoveManager = (state, managerId) =>
(selectIsAdmin(state) || isManager(state)) && managerId !== state.studio.owner;
const selectCanPromoteCurators = state => isManager(state); const selectCanPromoteCurators = state => isManager(state);
// TODO this permission needs to account for who added the project // TODO this permission needs to account for who added the project
const selectCanRemoveProjects = state => isCurator(state) || isManager(state); const selectCanRemoveProjects = state => isCurator(state) || isManager(state) || selectIsAdmin(state);
export { export {
selectCanEditInfo, selectCanEditInfo,

View file

@ -6,6 +6,9 @@
"isCurator": { "isCurator": {
"curator": true "curator": true
}, },
"isInvited": {
"invited": true
},
"creator1": { "creator1": {
"owner": 1 "owner": 1
}, },

View file

@ -8,7 +8,13 @@ import {
selectCanRestoreComment, selectCanRestoreComment,
selectCanFollowStudio, selectCanFollowStudio,
selectCanEditCommentsAllowed, selectCanEditCommentsAllowed,
selectCanEditOpenToAll selectCanEditOpenToAll,
selectShowCuratorInvite,
selectCanInviteCurators,
selectCanRemoveCurators,
selectCanRemoveManager,
selectCanPromoteCurators,
selectCanRemoveProjects
} from '../../../src/redux/studio-permissions'; } from '../../../src/redux/studio-permissions';
import {getInitialState as getInitialStudioState} from '../../../src/redux/studio'; import {getInitialState as getInitialStudioState} from '../../../src/redux/studio';
@ -42,6 +48,9 @@ const setStateByRole = (role) => {
break; break;
case 'logged out': // Default state set in beforeEach case 'logged out': // Default state set in beforeEach
break; break;
case 'invited':
state.studio = studios.isInvited;
break;
default: default:
throw new Error('Unknown user role in test: ' + role); throw new Error('Unknown user role in test: ' + role);
} }
@ -98,6 +107,21 @@ describe('studio projects', () => {
expect(selectCanAddProjects(state)).toBe(expected); expect(selectCanAddProjects(state)).toBe(expected);
}); });
}); });
describe('can remove projects', () => {
test.each([
['admin', true],
['curator', true],
['manager', true],
['creator', true],
['logged in', false],
['unconfirmed', false],
['logged out', false]
])('%s: %s', (role, expected) => {
setStateByRole(role);
// TODO this permission is wrong, curators can only remove projects they added
expect(selectCanRemoveProjects(state)).toBe(expected);
});
});
}); });
describe('studio comments', () => { describe('studio comments', () => {
@ -208,4 +232,92 @@ describe('studio comments', () => {
expect(selectCanEditOpenToAll(state)).toBe(expected); expect(selectCanEditOpenToAll(state)).toBe(expected);
}); });
}); });
describe('studio members', () => {
describe('can accept invitation', () => {
test.each([
['admin', false],
['curator', false],
['manager', false],
['creator', false],
['invited', true],
['logged in', false],
['unconfirmed', false],
['logged out', false]
])('%s: %s', (role, expected) => {
setStateByRole(role);
expect(selectShowCuratorInvite(state)).toBe(expected);
});
});
describe('can promote curators', () => {
test.each([
['admin', false],
['curator', false],
['manager', true],
['creator', true],
['logged in', false],
['unconfirmed', false],
['logged out', false]
])('%s: %s', (role, expected) => {
setStateByRole(role);
expect(selectCanPromoteCurators(state)).toBe(expected);
});
});
describe('can remove curators', () => {
test.each([
['admin', true],
['curator', false],
['manager', true],
['creator', true],
['logged in', false],
['unconfirmed', false],
['logged out', false]
])('%s: %s', (role, expected) => {
setStateByRole(role);
expect(selectCanRemoveCurators(state)).toBe(expected);
});
});
describe('can remove managers', () => {
test.each([
['admin', true],
['curator', false],
['manager', true],
['creator', true],
['logged in', false],
['unconfirmed', false],
['logged out', false]
])('%s: %s', (role, expected) => {
setStateByRole(role);
expect(selectCanRemoveManager(state, '123')).toBe(expected);
});
describe('nobody can remove the studio creator', () => {
test.each([
['admin', false],
['curator', false],
['manager', false],
['creator', false],
['logged in', false],
['unconfirmed', false],
['logged out', false]
])('%s: %s', (role, expected) => {
setStateByRole(role);
state.studio.owner = 'the creator';
expect(selectCanRemoveManager(state, 'the creator')).toBe(expected);
});
});
});
describe('can invite curators', () => {
test.each([
['admin', false],
['curator', false],
['manager', true],
['creator', false],
['logged in', false],
['unconfirmed', false],
['logged out', false]
])('%s: %s', (role, expected) => {
setStateByRole(role);
expect(selectCanInviteCurators(state)).toBe(expected);
});
});
});
}); });