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 linkUuid = 'zzzzz-o0j2j-0123456789abcde';
22 const containerRequestUuid = 'zzzzz-xvhdp-0123456789abcde';
24 it('should return the correct menu kind', () => {
26 // resourceUuid, isAdminUser, isEditable, isTrashed, expected
27 [headCollectionUuid, false, true, true, ContextMenuKind.TRASHED_COLLECTION],
28 [headCollectionUuid, false, true, false, ContextMenuKind.COLLECTION],
29 [headCollectionUuid, false, false, true, ContextMenuKind.READONLY_COLLECTION],
30 [headCollectionUuid, false, false, false, ContextMenuKind.READONLY_COLLECTION],
31 [headCollectionUuid, true, true, true, ContextMenuKind.TRASHED_COLLECTION],
32 [headCollectionUuid, true, true, false, ContextMenuKind.COLLECTION_ADMIN],
33 [headCollectionUuid, true, false, true, ContextMenuKind.TRASHED_COLLECTION],
34 [headCollectionUuid, true, false, false, ContextMenuKind.COLLECTION_ADMIN],
36 [oldCollectionUuid, false, true, true, ContextMenuKind.OLD_VERSION_COLLECTION],
37 [oldCollectionUuid, false, true, false, ContextMenuKind.OLD_VERSION_COLLECTION],
38 [oldCollectionUuid, false, false, true, ContextMenuKind.OLD_VERSION_COLLECTION],
39 [oldCollectionUuid, false, false, false, ContextMenuKind.OLD_VERSION_COLLECTION],
40 [oldCollectionUuid, true, true, true, ContextMenuKind.OLD_VERSION_COLLECTION],
41 [oldCollectionUuid, true, true, false, ContextMenuKind.OLD_VERSION_COLLECTION],
42 [oldCollectionUuid, true, false, true, ContextMenuKind.OLD_VERSION_COLLECTION],
43 [oldCollectionUuid, true, false, false, ContextMenuKind.OLD_VERSION_COLLECTION],
45 // FIXME: WB2 doesn't currently have context menu for trashed projects
46 // [projectUuid, false, true, true, ContextMenuKind.TRASHED_PROJECT],
47 [projectUuid, false, true, false, ContextMenuKind.PROJECT],
48 [projectUuid, false, false, true, ContextMenuKind.READONLY_PROJECT],
49 [projectUuid, false, false, false, ContextMenuKind.READONLY_PROJECT],
50 // [projectUuid, true, true, true, ContextMenuKind.TRASHED_PROJECT],
51 [projectUuid, true, true, false, ContextMenuKind.PROJECT_ADMIN],
52 // [projectUuid, true, false, true, ContextMenuKind.TRASHED_PROJECT],
53 [projectUuid, true, false, false, ContextMenuKind.PROJECT_ADMIN],
55 [linkUuid, false, true, true, ContextMenuKind.LINK],
56 [linkUuid, false, true, false, ContextMenuKind.LINK],
57 [linkUuid, false, false, true, ContextMenuKind.LINK],
58 [linkUuid, false, false, false, ContextMenuKind.LINK],
59 [linkUuid, true, true, true, ContextMenuKind.LINK],
60 [linkUuid, true, true, false, ContextMenuKind.LINK],
61 [linkUuid, true, false, true, ContextMenuKind.LINK],
62 [linkUuid, true, false, false, ContextMenuKind.LINK],
64 [userUuid, false, true, true, ContextMenuKind.ROOT_PROJECT],
65 [userUuid, false, true, false, ContextMenuKind.ROOT_PROJECT],
66 [userUuid, false, false, true, ContextMenuKind.ROOT_PROJECT],
67 [userUuid, false, false, false, ContextMenuKind.ROOT_PROJECT],
68 [userUuid, true, true, true, ContextMenuKind.ROOT_PROJECT],
69 [userUuid, true, true, false, ContextMenuKind.ROOT_PROJECT],
70 [userUuid, true, false, true, ContextMenuKind.ROOT_PROJECT],
71 [userUuid, true, false, false, ContextMenuKind.ROOT_PROJECT],
73 [containerRequestUuid, false, true, true, ContextMenuKind.PROCESS_RESOURCE],
74 [containerRequestUuid, false, true, false, ContextMenuKind.PROCESS_RESOURCE],
75 [containerRequestUuid, false, false, true, ContextMenuKind.PROCESS_RESOURCE],
76 [containerRequestUuid, false, false, false, ContextMenuKind.PROCESS_RESOURCE],
77 [containerRequestUuid, true, true, true, ContextMenuKind.PROCESS_ADMIN],
78 [containerRequestUuid, true, true, false, ContextMenuKind.PROCESS_ADMIN],
79 [containerRequestUuid, true, false, true, ContextMenuKind.PROCESS_ADMIN],
80 [containerRequestUuid, true, false, false, ContextMenuKind.PROCESS_ADMIN],
83 cases.forEach(([resourceUuid, isAdminUser, isEditable, isTrashed, expected]) => {
84 const initialState = {
86 [PROJECT_PANEL_CURRENT_UUID]: projectUuid,
89 [headCollectionUuid]: {
90 uuid: headCollectionUuid,
91 ownerUuid: projectUuid,
92 currentVersionUuid: headCollectionUuid,
95 [oldCollectionUuid]: {
96 uuid: oldCollectionUuid,
97 currentVersionUuid: headCollectionUuid,
102 ownerUuid: isEditable ? userUuid : otherUserUuid,
103 writableBy: isEditable ? [userUuid] : [otherUserUuid],
104 groupClass: GroupClass.PROJECT,
112 [containerRequestUuid]: {
113 uuid: containerRequestUuid,
114 ownerUuid: projectUuid,
120 isAdmin: isAdminUser,
124 const store = mockStore(initialState);
128 menuKind = store.dispatch<any>(resourceUuidToContextMenuKind(resourceUuid as string))
129 expect(menuKind).toBe(expected);
131 throw new Error(`menuKind for resource ${JSON.stringify(initialState.resources[resourceUuid as string])} expected to be ${expected} but got ${menuKind}.`);