Merge branch 'origin/master' into 13666-data-explorer-mapper
[arvados-workbench2.git] / src / store / project / project-reducer.test.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import projectsReducer, { getTreePath } from "./project-reducer";
6 import actions from "./project-action";
7 import { TreeItem, TreeItemStatus } from "../../components/tree/tree";
8 import { ResourceKind } from "../../models/resource";
9
10 describe('project-reducer', () => {
11     it('should add new project to the list', () => {
12         const initialState = undefined;
13         const project = {
14             name: 'test',
15             href: 'href',
16             createdAt: '2018-01-01',
17             modifiedAt: '2018-01-01',
18             ownerUuid: 'owner-test123',
19             uuid: 'test123',
20             kind: ResourceKind.PROJECT
21         };
22
23         const state = projectsReducer(initialState, actions.CREATE_PROJECT(project));
24         expect(state).toEqual([project]);
25     });
26
27     it('should load projects', () => {
28         const initialState = undefined;
29         const project = {
30             name: 'test',
31             href: 'href',
32             createdAt: '2018-01-01',
33             modifiedAt: '2018-01-01',
34             ownerUuid: 'owner-test123',
35             uuid: 'test123',
36             kind: ResourceKind.PROJECT
37         };
38
39         const projects = [project, project];
40         const state = projectsReducer(initialState, actions.PROJECTS_SUCCESS({ projects, parentItemId: undefined }));
41         expect(state).toEqual([{
42             active: false,
43             open: false,
44             id: "test123",
45             items: [],
46             data: project,
47             status: 0
48         }, {
49             active: false,
50             open: false,
51             id: "test123",
52             items: [],
53             data: project,
54             status: 0
55         }
56         ]);
57     });
58
59     it('should remove activity on projects list', () => {
60         const initialState = {
61             items: [{
62                 data: {
63                     name: 'test',
64                     href: 'href',
65                     createdAt: '2018-01-01',
66                     modifiedAt: '2018-01-01',
67                     ownerUuid: 'owner-test123',
68                     uuid: 'test123',
69                     kind: ResourceKind.PROJECT
70                 },
71                 id: "1",
72                 open: true,
73                 active: true,
74                 status: 1
75             }],
76             currentItemId: "1"
77         };
78         const project = {
79             items: [{
80                 data: {
81                     name: 'test',
82                     href: 'href',
83                     createdAt: '2018-01-01',
84                     modifiedAt: '2018-01-01',
85                     ownerUuid: 'owner-test123',
86                     uuid: 'test123',
87                     kind: ResourceKind.PROJECT
88                 },
89                 id: "1",
90                 open: true,
91                 active: false,
92                 status: 1
93             }],
94             currentItemId: "1"
95         };
96
97         const state = projectsReducer(initialState, actions.RESET_PROJECT_TREE_ACTIVITY(initialState[0].id));
98         expect(state).toEqual(project);
99     });
100
101     it('should toggle project tree item activity', () => {
102         const initialState = {
103             items: [{
104                 data: {
105                     name: 'test',
106                     href: 'href',
107                     createdAt: '2018-01-01',
108                     modifiedAt: '2018-01-01',
109                     ownerUuid: 'owner-test123',
110                     uuid: 'test123',
111                     kind: ResourceKind.PROJECT
112                 },
113                 id: "1",
114                 open: true,
115                 active: false,
116                 status: 1
117             }],
118             currentItemId: "1"
119         };
120         const project = {
121             items: [{
122                 data: {
123                     name: 'test',
124                     href: 'href',
125                     createdAt: '2018-01-01',
126                     modifiedAt: '2018-01-01',
127                     ownerUuid: 'owner-test123',
128                     uuid: 'test123',
129                     kind: ResourceKind.PROJECT
130                 },
131                 id: "1",
132                 open: true,
133                 active: true,
134                 status: 1
135             }],
136             currentItemId: "1"
137         };
138
139         const state = projectsReducer(initialState, actions.TOGGLE_PROJECT_TREE_ITEM_ACTIVE(initialState[0].id));
140         expect(state).toEqual(project);
141     });
142
143
144     it('should close project tree item ', () => {
145         const initialState = {
146             items: [{
147                 data: {
148                     name: 'test',
149                     href: 'href',
150                     createdAt: '2018-01-01',
151                     modifiedAt: '2018-01-01',
152                     ownerUuid: 'owner-test123',
153                     uuid: 'test123',
154                     kind: ResourceKind.PROJECT
155                 },
156                 id: "1",
157                 open: true,
158                 active: false,
159                 status: 1,
160                 toggled: false,
161             }],
162             currentItemId: "1"
163         };
164         const project = {
165             items: [{
166                 data: {
167                     name: 'test',
168                     href: 'href',
169                     createdAt: '2018-01-01',
170                     modifiedAt: '2018-01-01',
171                     ownerUuid: 'owner-test123',
172                     uuid: 'test123',
173                     kind: ResourceKind.PROJECT
174                 },
175                 id: "1",
176                 open: false,
177                 active: false,
178                 status: 1,
179                 toggled: true
180             }],
181             currentItemId: "1"
182         };
183
184         const state = projectsReducer(initialState, actions.TOGGLE_PROJECT_TREE_ITEM_OPEN(initialState[0].id));
185         expect(state).toEqual(project);
186     });
187 });
188
189 describe("findTreeBranch", () => {
190     const createTreeItem = (id: string, items?: Array<TreeItem<string>>): TreeItem<string> => ({
191         id,
192         items,
193         active: false,
194         data: "",
195         open: false,
196         status: TreeItemStatus.Initial
197     });
198
199     it("should return an array that matches path to the given item", () => {
200         const tree: Array<TreeItem<string>> = [
201             createTreeItem("1", [
202                 createTreeItem("1.1", [
203                     createTreeItem("1.1.1"),
204                     createTreeItem("1.1.2")
205                 ])
206             ]),
207             createTreeItem("2", [
208                 createTreeItem("2.1", [
209                     createTreeItem("2.1.1"),
210                     createTreeItem("2.1.2")
211                 ])
212             ])
213         ];
214         const branch = getTreePath(tree, "2.1.1");
215         expect(branch.map(item => item.id)).toEqual(["2", "2.1", "2.1.1"]);
216     });
217
218     it("should return empty array if item is not found", () => {
219         const tree: Array<TreeItem<string>> = [
220             createTreeItem("1", [
221                 createTreeItem("1.1", [
222                     createTreeItem("1.1.1"),
223                     createTreeItem("1.1.2")
224                 ])
225             ]),
226             createTreeItem("2", [
227                 createTreeItem("2.1", [
228                     createTreeItem("2.1.1"),
229                     createTreeItem("2.1.2")
230                 ])
231             ])
232         ];
233         expect(getTreePath(tree, "3")).toHaveLength(0);
234     });
235
236 });