Merge branch '21764-project-picker-crash' into main. Closes #21764
[arvados.git] / services / workbench2 / src / views-components / tree-picker / tree-picker.test.tsx
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import React from "react";
6 import Axios from "axios";
7 import Adapter from "enzyme-adapter-react-16";
8 import { configure, mount } from "enzyme";
9 import { mockConfig } from "common/config";
10 import { ServiceRepository, createServices } from "services/services";
11 import { createBrowserHistory } from "history";
12 import { ApiActions } from "services/api/api-actions";
13 import { Provider } from "react-redux";
14 import { configureStore } from "store/store";
15 import { TreePicker } from "./tree-picker";
16 import { initUserProject, receiveTreePickerData, extractGroupContentsNodeData } from "store/tree-picker/tree-picker-actions";
17 import { authActions } from "store/auth/auth-action";
18 import { ResourceKind } from "models/resource";
19 import { updateResources } from "store/resources/resources-actions";
20
21 configure({ adapter: new Adapter() });
22
23 describe('<TreePicker />', () => {
24     let store;
25     let services: ServiceRepository;
26     const axiosInst = Axios.create({ headers: {} });
27     const config: any = {};
28     const actions: ApiActions = {
29         progressFn: (id: string, working: boolean) => { },
30         errorFn: (id: string, message: string) => { }
31     };
32     const TEST_PICKER_ID = 'testPickerId';
33     const fakeUser = {
34         email: "test@test.com",
35         firstName: "John",
36         lastName: "Doe",
37         uuid: "zzzzz-tpzed-xurymjxw79nv3jz",
38         ownerUuid: "ownerUuid",
39         username: "username",
40         prefs: {},
41         isAdmin: false,
42         isActive: true,
43         canWrite: false,
44         canManage: false,
45     };
46     const renderItem = (item) => (
47         <li data-id={item.id}>{item.data.name}</li>
48     );
49
50     beforeEach(() => {
51         services = createServices(mockConfig({}), actions, axiosInst);
52         store = configureStore(createBrowserHistory(), services, config);
53         store.dispatch(authActions.USER_DETAILS_SUCCESS(fakeUser));
54         store.dispatch(initUserProject(TEST_PICKER_ID));
55     });
56
57     it("renders tree picker with initial home project state", () => {
58         let treePicker = mount(
59             <Provider store={store}>
60                 <TreePicker
61                     pickerId={TEST_PICKER_ID}
62                     render={renderItem}
63                     onContextMenu={() => {}}
64                     toggleItemOpen={() => {}}
65                     toggleItemActive={() => {}}
66                     toggleItemSelection={() => {}}
67                 />
68             </Provider>);
69
70         expect(treePicker.find(`li[data-id="${fakeUser.uuid}"]`).text()).toBe('Home Projects');
71     });
72
73     it("displays item loaded into treePicker store", () => {
74         const fakeProject = {
75             uuid: "zzzzz-j7d0g-111111111111111",
76             name: "FakeProject",
77             kind: ResourceKind.PROJECT,
78         };
79
80         store.dispatch(receiveTreePickerData({
81             id: fakeUser.uuid,
82             pickerId: TEST_PICKER_ID,
83             data: [fakeProject],
84             extractNodeData: extractGroupContentsNodeData(false)
85         }));
86
87         let treePicker = mount(
88             <Provider store={store}>
89                 <TreePicker
90                     pickerId={TEST_PICKER_ID}
91                     render={renderItem}
92                     onContextMenu={() => {}}
93                     toggleItemOpen={() => {}}
94                     toggleItemActive={() => {}}
95                     toggleItemSelection={() => {}}
96                 />
97             </Provider>);
98
99         expect(treePicker.find(`[data-id="${fakeUser.uuid}"]`).text()).toBe('Home Projects');
100         expect(treePicker.find(`[data-id="${fakeProject.uuid}"]`).text()).toBe('FakeProject');
101     });
102
103     it("preserves treenode name when exists in resources", () => {
104         const treeProjectResource = {
105             uuid: "zzzzz-j7d0g-111111111111111",
106             name: "FakeProject",
107             kind: ResourceKind.PROJECT,
108         };
109         const treeProjectResource2 = {
110             uuid: "zzzzz-j7d0g-222222222222222",
111             name: "",
112             kind: ResourceKind.PROJECT,
113         };
114
115         const storeProjectResource = {
116             ...treeProjectResource,
117             name: "StoreProjectName",
118             description: "Test description",
119         };
120         const storeProjectResource2 = {
121             ...treeProjectResource2,
122             name: "StoreProjectName2",
123             description: "Test description",
124         };
125
126         store.dispatch(updateResources([storeProjectResource, storeProjectResource2]));
127         store.dispatch(receiveTreePickerData({
128             id: fakeUser.uuid,
129             pickerId: TEST_PICKER_ID,
130             data: [treeProjectResource, treeProjectResource2],
131             extractNodeData: extractGroupContentsNodeData(false)
132         }));
133
134         let treePicker = mount(
135             <Provider store={store}>
136                 <TreePicker
137                     pickerId={TEST_PICKER_ID}
138                     render={renderItem}
139                     onContextMenu={() => {}}
140                     toggleItemOpen={() => {}}
141                     toggleItemActive={() => {}}
142                     toggleItemSelection={() => {}}
143                 />
144             </Provider>);
145
146         expect(treePicker.find(`[data-id="${fakeUser.uuid}"]`).text()).toBe('Home Projects');
147         expect(treePicker.find(`[data-id="${treeProjectResource.uuid}"]`).text()).toBe('FakeProject');
148         expect(treePicker.find(`[data-id="${treeProjectResource2.uuid}"]`).text()).toBe('');
149     });
150
151 });