17119: Fixes unit tests improving store mocking and error reporting.
[arvados-workbench2.git] / src / store / context-menu / context-menu-actions.test.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
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';
11
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';
23
24         it('should return the correct menu kind', () => {
25             const cases = [
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],
35
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],
44
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],
54
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],
63
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],
72
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],
81             ]
82
83             cases.forEach(([resourceUuid, isAdminUser, isEditable, isTrashed, expected]) => {
84                 const initialState = {
85                     properties: {
86                         [PROJECT_PANEL_CURRENT_UUID]: projectUuid,
87                     },
88                     resources: {
89                         [headCollectionUuid]: {
90                             uuid: headCollectionUuid,
91                             ownerUuid: projectUuid,
92                             currentVersionUuid: headCollectionUuid,
93                             isTrashed: isTrashed,
94                         },
95                         [oldCollectionUuid]: {
96                             uuid: oldCollectionUuid,
97                             currentVersionUuid: headCollectionUuid,
98                             isTrashed: isTrashed,
99                         },
100                         [projectUuid]: {
101                             uuid: projectUuid,
102                             ownerUuid: isEditable ? userUuid : otherUserUuid,
103                             writableBy: isEditable ? [userUuid] : [otherUserUuid],
104                             groupClass: GroupClass.PROJECT,
105                         },
106                         [linkUuid]: {
107                             uuid: linkUuid,
108                         },
109                         [userUuid]: {
110                             uuid: userUuid,
111                         },
112                         [containerRequestUuid]: {
113                             uuid: containerRequestUuid,
114                             ownerUuid: projectUuid,
115                         },
116                     },
117                     auth: {
118                         user: {
119                             uuid: userUuid,
120                             isAdmin: isAdminUser,
121                         },
122                     },
123                 };
124                 const store = mockStore(initialState);
125
126                 let menuKind: any;
127                 try {
128                     menuKind = store.dispatch<any>(resourceUuidToContextMenuKind(resourceUuid as string))
129                     expect(menuKind).toBe(expected);
130                 } catch (err) {
131                     throw new Error(`menuKind for resource ${JSON.stringify(initialState.resources[resourceUuid as string])} expected to be ${expected} but got ${menuKind}.`);
132                 }
133             });
134         });
135     });
136 });