1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { ContextMenuKind } from 'views-components/context-menu/context-menu';
6 import { resourceUuidToContextMenuKind } from './context-menu-actions';
7 import configureStore from 'redux-mock-store';
8 import thunk from 'redux-thunk';
9 import { PROJECT_PANEL_CURRENT_UUID } from '../project-panel/project-panel-action';
10 import { GroupClass } from 'models/group';
12 describe('context-menu-actions', () => {
13 describe('resourceUuidToContextMenuKind', () => {
14 const middlewares = [thunk];
15 const mockStore = configureStore(middlewares);
16 const userUuid = 'zzzzz-tpzed-bbbbbbbbbbbbbbb';
17 const otherUserUuid = 'zzzzz-tpzed-bbbbbbbbbbbbbbc';
18 const headCollectionUuid = 'zzzzz-4zz18-aaaaaaaaaaaaaaa';
19 const oldCollectionUuid = 'zzzzz-4zz18-aaaaaaaaaaaaaab';
20 const projectUuid = 'zzzzz-j7d0g-ccccccccccccccc';
21 const filterGroupUuid = 'zzzzz-j7d0g-ccccccccccccccd';
22 const linkUuid = 'zzzzz-o0j2j-0123456789abcde';
23 const containerRequestUuid = 'zzzzz-xvhdp-0123456789abcde';
25 it('should return the correct menu kind', () => {
27 // resourceUuid, isAdminUser, isEditable, isTrashed, forceReadonly, expected
28 [headCollectionUuid, false, true, true, false, ContextMenuKind.TRASHED_COLLECTION],
29 [headCollectionUuid, false, true, false, false, ContextMenuKind.COLLECTION],
30 [headCollectionUuid, false, true, false, true, ContextMenuKind.READONLY_COLLECTION],
31 [headCollectionUuid, false, false, true, false, ContextMenuKind.READONLY_COLLECTION],
32 [headCollectionUuid, false, false, false, false, ContextMenuKind.READONLY_COLLECTION],
33 [headCollectionUuid, true, true, true, false, ContextMenuKind.TRASHED_COLLECTION],
34 [headCollectionUuid, true, true, false, false, ContextMenuKind.COLLECTION_ADMIN],
35 [headCollectionUuid, true, false, true, false, ContextMenuKind.TRASHED_COLLECTION],
36 [headCollectionUuid, true, false, false, false, ContextMenuKind.COLLECTION_ADMIN],
37 [headCollectionUuid, true, false, false, true, ContextMenuKind.READONLY_COLLECTION],
39 [oldCollectionUuid, false, true, true, false, ContextMenuKind.OLD_VERSION_COLLECTION],
40 [oldCollectionUuid, false, true, false, false, ContextMenuKind.OLD_VERSION_COLLECTION],
41 [oldCollectionUuid, false, false, true, false, ContextMenuKind.OLD_VERSION_COLLECTION],
42 [oldCollectionUuid, false, false, false, false, ContextMenuKind.OLD_VERSION_COLLECTION],
43 [oldCollectionUuid, true, true, true, false, ContextMenuKind.OLD_VERSION_COLLECTION],
44 [oldCollectionUuid, true, true, false, false, ContextMenuKind.OLD_VERSION_COLLECTION],
45 [oldCollectionUuid, true, false, true, false, ContextMenuKind.OLD_VERSION_COLLECTION],
46 [oldCollectionUuid, true, false, false, false, ContextMenuKind.OLD_VERSION_COLLECTION],
48 // FIXME: WB2 doesn't currently have context menu for trashed projects
49 // [projectUuid, false, true, true, false, ContextMenuKind.TRASHED_PROJECT],
50 [projectUuid, false, true, false, false, ContextMenuKind.PROJECT],
51 [projectUuid, false, true, false, true, ContextMenuKind.READONLY_PROJECT],
52 [projectUuid, false, false, true, false, ContextMenuKind.READONLY_PROJECT],
53 [projectUuid, false, false, false, false, ContextMenuKind.READONLY_PROJECT],
54 // [projectUuid, true, true, true, false, ContextMenuKind.TRASHED_PROJECT],
55 [projectUuid, true, true, false, false, ContextMenuKind.PROJECT_ADMIN],
56 // [projectUuid, true, false, true, false, ContextMenuKind.TRASHED_PROJECT],
57 [projectUuid, true, false, false, false, ContextMenuKind.PROJECT_ADMIN],
58 [projectUuid, true, false, false, true, ContextMenuKind.READONLY_PROJECT],
60 [linkUuid, false, true, true, false, ContextMenuKind.LINK],
61 [linkUuid, false, true, false, false, ContextMenuKind.LINK],
62 [linkUuid, false, false, true, false, ContextMenuKind.LINK],
63 [linkUuid, false, false, false, false, ContextMenuKind.LINK],
64 [linkUuid, true, true, true, false, ContextMenuKind.LINK],
65 [linkUuid, true, true, false, false, ContextMenuKind.LINK],
66 [linkUuid, true, false, true, false, ContextMenuKind.LINK],
67 [linkUuid, true, false, false, false, ContextMenuKind.LINK],
69 [userUuid, false, true, true, false, ContextMenuKind.ROOT_PROJECT],
70 [userUuid, false, true, false, false, ContextMenuKind.ROOT_PROJECT],
71 [userUuid, false, false, true, false, ContextMenuKind.ROOT_PROJECT],
72 [userUuid, false, false, false, false, ContextMenuKind.ROOT_PROJECT],
73 [userUuid, true, true, true, false, ContextMenuKind.ROOT_PROJECT],
74 [userUuid, true, true, false, false, ContextMenuKind.ROOT_PROJECT],
75 [userUuid, true, false, true, false, ContextMenuKind.ROOT_PROJECT],
76 [userUuid, true, false, false, false, ContextMenuKind.ROOT_PROJECT],
78 [containerRequestUuid, false, true, true, false, ContextMenuKind.PROCESS_RESOURCE],
79 [containerRequestUuid, false, true, false, false, ContextMenuKind.PROCESS_RESOURCE],
80 [containerRequestUuid, false, false, true, false, ContextMenuKind.PROCESS_RESOURCE],
81 [containerRequestUuid, false, false, false, false, ContextMenuKind.PROCESS_RESOURCE],
82 [containerRequestUuid, false, false, false, true, ContextMenuKind.READONLY_PROCESS_RESOURCE],
83 [containerRequestUuid, true, true, true, false, ContextMenuKind.PROCESS_ADMIN],
84 [containerRequestUuid, true, true, false, false, ContextMenuKind.PROCESS_ADMIN],
85 [containerRequestUuid, true, false, true, false, ContextMenuKind.PROCESS_ADMIN],
86 [containerRequestUuid, true, false, false, false, ContextMenuKind.PROCESS_ADMIN],
87 [containerRequestUuid, true, false, false, true, ContextMenuKind.READONLY_PROCESS_RESOURCE],
90 cases.forEach(([resourceUuid, isAdminUser, isEditable, isTrashed, forceReadonly, expected]) => {
91 const initialState = {
93 [PROJECT_PANEL_CURRENT_UUID]: projectUuid,
96 [headCollectionUuid]: {
97 uuid: headCollectionUuid,
98 ownerUuid: projectUuid,
99 currentVersionUuid: headCollectionUuid,
100 isTrashed: isTrashed,
102 [oldCollectionUuid]: {
103 uuid: oldCollectionUuid,
104 currentVersionUuid: headCollectionUuid,
105 isTrashed: isTrashed,
109 ownerUuid: isEditable ? userUuid : otherUserUuid,
110 writableBy: isEditable ? [userUuid] : [otherUserUuid],
111 groupClass: GroupClass.PROJECT,
114 uuid: filterGroupUuid,
115 ownerUuid: isEditable ? userUuid : otherUserUuid,
116 writableBy: isEditable ? [userUuid] : [otherUserUuid],
117 groupClass: GroupClass.FILTER,
125 [containerRequestUuid]: {
126 uuid: containerRequestUuid,
127 ownerUuid: projectUuid,
133 isAdmin: isAdminUser,
137 const store = mockStore(initialState);
141 menuKind = store.dispatch<any>(resourceUuidToContextMenuKind(resourceUuid as string, forceReadonly as boolean))
142 expect(menuKind).toBe(expected);
144 throw new Error(`menuKind for resource ${JSON.stringify(initialState.resources[resourceUuid as string])} forceReadonly: ${forceReadonly} expected to be ${expected} but got ${menuKind}.`);