2021-03-23 15:19:01 -04:00
|
|
|
import {
|
|
|
|
selectCanEditInfo,
|
2021-04-02 12:43:32 -04:00
|
|
|
selectCanAddProjects,
|
2021-04-08 10:36:56 -04:00
|
|
|
selectShowCommentComposer,
|
|
|
|
selectCanDeleteComment,
|
|
|
|
selectCanDeleteCommentWithoutConfirm,
|
|
|
|
selectCanReportComment,
|
2021-04-16 13:22:35 -04:00
|
|
|
selectCanRestoreComment,
|
2021-04-26 15:11:06 -04:00
|
|
|
selectCanFollowStudio,
|
|
|
|
selectCanEditCommentsAllowed,
|
2021-05-03 10:52:04 -04:00
|
|
|
selectCanEditOpenToAll,
|
|
|
|
selectShowCuratorInvite,
|
|
|
|
selectCanInviteCurators,
|
2021-05-14 12:37:05 -04:00
|
|
|
selectCanRemoveCurator,
|
2021-05-03 10:52:04 -04:00
|
|
|
selectCanRemoveManager,
|
|
|
|
selectCanPromoteCurators,
|
2021-05-03 13:26:50 -04:00
|
|
|
selectCanRemoveProject
|
2021-04-16 13:22:35 -04:00
|
|
|
} from '../../../src/redux/studio-permissions';
|
2021-03-23 15:19:01 -04:00
|
|
|
|
2021-04-16 13:22:35 -04:00
|
|
|
import {getInitialState as getInitialStudioState} from '../../../src/redux/studio';
|
2021-05-03 13:26:50 -04:00
|
|
|
import {getInitialState as getInitialSessionState, selectUserId, selectUsername} from '../../../src/redux/session';
|
2021-04-02 12:33:18 -04:00
|
|
|
import {sessions, studios} from '../../helpers/state-fixtures.json';
|
2021-03-23 15:19:01 -04:00
|
|
|
|
2021-04-08 10:36:56 -04:00
|
|
|
let state;
|
2021-03-23 15:19:01 -04:00
|
|
|
|
2021-04-08 10:36:56 -04:00
|
|
|
const setStateByRole = (role) => {
|
|
|
|
switch (role) {
|
|
|
|
case 'admin':
|
|
|
|
state.session = sessions.user1Admin;
|
|
|
|
break;
|
|
|
|
case 'curator':
|
|
|
|
state.studio = studios.isCurator;
|
|
|
|
state.session = sessions.user1Social;
|
|
|
|
break;
|
|
|
|
case 'manager':
|
|
|
|
state.studio = studios.isManager;
|
|
|
|
state.session = sessions.user1Social;
|
|
|
|
break;
|
|
|
|
case 'creator':
|
|
|
|
state.studio = studios.creator1;
|
|
|
|
state.session = sessions.user1Social;
|
|
|
|
break;
|
|
|
|
case 'logged in':
|
|
|
|
state.session = sessions.user1Social;
|
|
|
|
break;
|
|
|
|
case 'unconfirmed':
|
|
|
|
state.session = sessions.user1;
|
|
|
|
break;
|
|
|
|
case 'logged out': // Default state set in beforeEach
|
|
|
|
break;
|
2021-05-03 10:52:04 -04:00
|
|
|
case 'invited':
|
|
|
|
state.studio = studios.isInvited;
|
|
|
|
break;
|
2021-04-08 10:36:56 -04:00
|
|
|
default:
|
|
|
|
throw new Error('Unknown user role in test: ' + role);
|
|
|
|
}
|
|
|
|
};
|
2021-03-23 15:19:01 -04:00
|
|
|
|
2021-04-08 10:36:56 -04:00
|
|
|
beforeEach(() => {
|
|
|
|
state = {
|
|
|
|
session: getInitialSessionState(),
|
|
|
|
studio: getInitialStudioState()
|
|
|
|
};
|
|
|
|
});
|
2021-03-23 15:19:01 -04:00
|
|
|
|
2021-04-08 10:36:56 -04:00
|
|
|
describe('studio info', () => {
|
|
|
|
describe('can edit studio info', () => {
|
|
|
|
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(selectCanEditInfo(state)).toBe(expected);
|
2021-03-23 15:19:01 -04:00
|
|
|
});
|
2021-04-08 10:36:56 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('studio projects', () => {
|
|
|
|
describe('can add project, not open to all', () => {
|
|
|
|
test.each([
|
|
|
|
['admin', false],
|
|
|
|
['curator', true],
|
|
|
|
['manager', true],
|
|
|
|
['creator', true],
|
|
|
|
['logged in', false],
|
|
|
|
['unconfirmed', false],
|
|
|
|
['logged out', false]
|
|
|
|
])('%s: %s', (role, expected) => {
|
|
|
|
setStateByRole(role);
|
|
|
|
expect(selectCanAddProjects(state)).toBe(expected);
|
2021-03-23 15:19:01 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2021-04-08 10:36:56 -04:00
|
|
|
describe('can add project, open to all', () => {
|
|
|
|
test.each([
|
|
|
|
['logged in', true],
|
|
|
|
['unconfirmed', false],
|
|
|
|
['logged out', false]
|
|
|
|
])('%s: %s', (role, expected) => {
|
|
|
|
setStateByRole(role);
|
|
|
|
state.studio.openToAll = true;
|
|
|
|
expect(selectCanAddProjects(state)).toBe(expected);
|
2021-03-23 15:19:01 -04:00
|
|
|
});
|
2021-04-08 10:36:56 -04:00
|
|
|
});
|
2021-05-03 10:59:52 -04:00
|
|
|
|
2021-05-03 10:52:04 -04:00
|
|
|
describe('can remove projects', () => {
|
|
|
|
test.each([
|
|
|
|
['admin', true],
|
2021-05-03 13:26:50 -04:00
|
|
|
['curator', false], // false for projects that were not added by them, see below
|
2021-05-03 10:52:04 -04:00
|
|
|
['manager', true],
|
|
|
|
['creator', true],
|
2021-05-03 13:26:50 -04:00
|
|
|
['logged in', false], // false for projects that are not theirs, see below
|
2021-05-03 10:52:04 -04:00
|
|
|
['unconfirmed', false],
|
|
|
|
['logged out', false]
|
|
|
|
])('%s: %s', (role, expected) => {
|
|
|
|
setStateByRole(role);
|
2021-05-03 13:26:50 -04:00
|
|
|
expect(selectCanRemoveProject(state, 'not-me', 'not-me')).toBe(expected);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('curators can remove projects they added', () => {
|
|
|
|
setStateByRole('curator');
|
|
|
|
const addedBy = selectUserId(state);
|
|
|
|
expect(selectCanRemoveProject(state, 'not-me', addedBy)).toBe(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('curators can also remove projects they own that they did not add', () => {
|
|
|
|
setStateByRole('curator');
|
|
|
|
const creator = selectUsername(state);
|
|
|
|
expect(selectCanRemoveProject(state, creator, 'not-me')).toBe(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('logged in users can only remove projects they own', () => {
|
|
|
|
setStateByRole('logged in');
|
|
|
|
const creator = selectUsername(state);
|
|
|
|
expect(selectCanRemoveProject(state, creator, 'not-me')).toBe(true);
|
2021-05-03 10:52:04 -04:00
|
|
|
});
|
|
|
|
});
|
2021-04-08 10:36:56 -04:00
|
|
|
});
|
2021-03-23 15:19:01 -04:00
|
|
|
|
2021-04-08 10:36:56 -04:00
|
|
|
describe('studio comments', () => {
|
|
|
|
describe('showing comment composer', () => {
|
|
|
|
test.each([
|
|
|
|
['logged in', true],
|
|
|
|
['unconfirmed', false],
|
|
|
|
['logged out', false]
|
|
|
|
])('%s: %s', (role, expected) => {
|
|
|
|
setStateByRole(role);
|
|
|
|
expect(selectShowCommentComposer(state)).toBe(expected);
|
2021-03-23 15:19:01 -04:00
|
|
|
});
|
2021-04-08 10:36:56 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
describe('can report comment', () => {
|
|
|
|
test.each([
|
|
|
|
['logged in', true],
|
|
|
|
['unconfirmed', false],
|
|
|
|
['logged out', false]
|
|
|
|
])('%s: %s', (role, expected) => {
|
|
|
|
setStateByRole(role);
|
|
|
|
expect(selectCanReportComment(state)).toBe(expected);
|
2021-03-23 15:19:01 -04:00
|
|
|
});
|
2021-04-08 10:36:56 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
describe('can delete comment', () => {
|
|
|
|
test.each([
|
|
|
|
['admin', true],
|
|
|
|
['curator', false],
|
|
|
|
['manager', false],
|
|
|
|
['creator', false],
|
|
|
|
['logged in', false],
|
|
|
|
['unconfirmed', false],
|
|
|
|
['logged out', false]
|
|
|
|
])('%s: %s', (role, expected) => {
|
|
|
|
setStateByRole(role);
|
|
|
|
expect(selectCanDeleteComment(state)).toBe(expected);
|
2021-03-23 15:19:01 -04:00
|
|
|
});
|
2021-04-08 10:36:56 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
describe('can delete comment without confirmation', () => {
|
|
|
|
test.each([
|
|
|
|
['admin', true],
|
|
|
|
['curator', false],
|
|
|
|
['manager', false],
|
|
|
|
['creator', false],
|
|
|
|
['logged in', false],
|
|
|
|
['unconfirmed', false],
|
|
|
|
['logged out', false]
|
|
|
|
])('%s: %s', (role, expected) => {
|
|
|
|
setStateByRole(role);
|
|
|
|
expect(selectCanDeleteCommentWithoutConfirm(state)).toBe(expected);
|
2021-03-23 15:19:01 -04:00
|
|
|
});
|
|
|
|
});
|
2021-04-02 12:43:32 -04:00
|
|
|
|
2021-04-08 10:36:56 -04:00
|
|
|
describe('can restore a comment', () => {
|
|
|
|
test.each([
|
|
|
|
['admin', true],
|
|
|
|
['curator', false],
|
|
|
|
['manager', false],
|
|
|
|
['creator', false],
|
|
|
|
['logged in', false],
|
|
|
|
['unconfirmed', false],
|
|
|
|
['logged out', false]
|
|
|
|
])('%s: %s', (role, expected) => {
|
|
|
|
setStateByRole(role);
|
|
|
|
expect(selectCanRestoreComment(state)).toBe(expected);
|
2021-04-02 12:43:32 -04:00
|
|
|
});
|
|
|
|
});
|
2021-04-14 12:21:22 -04:00
|
|
|
|
|
|
|
describe('can follow a studio', () => {
|
|
|
|
test.each([
|
|
|
|
['logged in', true],
|
|
|
|
['unconfirmed', true],
|
|
|
|
['logged out', false]
|
|
|
|
])('%s: %s', (role, expected) => {
|
|
|
|
setStateByRole(role);
|
|
|
|
expect(selectCanFollowStudio(state)).toBe(expected);
|
|
|
|
});
|
|
|
|
});
|
2021-04-26 15:11:06 -04:00
|
|
|
|
|
|
|
describe('can set "comments allowed" on a studio', () => {
|
|
|
|
test.each([
|
|
|
|
['admin', true],
|
|
|
|
['curator', false],
|
|
|
|
['manager', false],
|
|
|
|
['creator', true],
|
|
|
|
['logged in', false],
|
|
|
|
['unconfirmed', false],
|
|
|
|
['logged out', false]
|
|
|
|
])('%s: %s', (role, expected) => {
|
|
|
|
setStateByRole(role);
|
|
|
|
expect(selectCanEditCommentsAllowed(state)).toBe(expected);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('can set "open to all" on a studio', () => {
|
|
|
|
test.each([
|
2021-04-27 09:06:40 -04:00
|
|
|
['admin', false],
|
2021-04-26 15:11:06 -04:00
|
|
|
['curator', false],
|
|
|
|
['manager', true],
|
|
|
|
['creator', true],
|
|
|
|
['logged in', false],
|
|
|
|
['unconfirmed', false],
|
|
|
|
['logged out', false]
|
|
|
|
])('%s: %s', (role, expected) => {
|
|
|
|
setStateByRole(role);
|
|
|
|
expect(selectCanEditOpenToAll(state)).toBe(expected);
|
|
|
|
});
|
|
|
|
});
|
2021-05-03 10:59:52 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
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);
|
2021-05-03 10:52:04 -04:00
|
|
|
});
|
2021-05-03 10:59:52 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
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);
|
2021-05-03 10:52:04 -04:00
|
|
|
});
|
2021-05-03 10:59:52 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
describe('can remove curators', () => {
|
|
|
|
test.each([
|
|
|
|
['admin', true],
|
2021-05-14 12:37:05 -04:00
|
|
|
['curator', false], // except themselves, see test below
|
2021-05-03 10:59:52 -04:00
|
|
|
['manager', true],
|
|
|
|
['creator', true],
|
|
|
|
['logged in', false],
|
|
|
|
['unconfirmed', false],
|
|
|
|
['logged out', false]
|
|
|
|
])('%s: %s', (role, expected) => {
|
|
|
|
setStateByRole(role);
|
2021-05-14 12:37:05 -04:00
|
|
|
expect(selectCanRemoveCurator(state, 'others-username')).toBe(expected);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('curators can remove themselves', () => {
|
|
|
|
setStateByRole('curator');
|
|
|
|
const loggedInUsername = selectUsername(state);
|
|
|
|
expect(selectCanRemoveCurator(state, loggedInUsername)).toBe(true);
|
2021-05-03 10:52:04 -04:00
|
|
|
});
|
2021-05-03 10:59:52 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
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);
|
2021-05-03 10:52:04 -04:00
|
|
|
});
|
2021-05-03 10:59:52 -04:00
|
|
|
|
|
|
|
describe('nobody can remove the studio creator', () => {
|
2021-05-03 10:52:04 -04:00
|
|
|
test.each([
|
|
|
|
['admin', false],
|
|
|
|
['curator', false],
|
2021-05-03 10:59:52 -04:00
|
|
|
['manager', false],
|
2021-05-03 10:52:04 -04:00
|
|
|
['creator', false],
|
|
|
|
['logged in', false],
|
|
|
|
['unconfirmed', false],
|
|
|
|
['logged out', false]
|
|
|
|
])('%s: %s', (role, expected) => {
|
|
|
|
setStateByRole(role);
|
2021-05-03 10:59:52 -04:00
|
|
|
state.studio.owner = 'the creator';
|
|
|
|
expect(selectCanRemoveManager(state, 'the creator')).toBe(expected);
|
2021-05-03 10:52:04 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2021-05-03 10:59:52 -04:00
|
|
|
|
|
|
|
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);
|
|
|
|
});
|
|
|
|
});
|
2021-03-23 15:19:01 -04:00
|
|
|
});
|