added-functionality-for-creating-projects
[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.items[0].data).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             items: [{
43                 active: false,
44                 open: false,
45                 id: "test123",
46                 items: [],
47                 data: project,
48                 status: 0
49             }, {
50                 active: false,
51                 open: false,
52                 id: "test123",
53                 items: [],
54                 data: project,
55                 status: 0
56             }
57             ],
58             currentItemId: ""
59         });
60     });
61
62     it('should remove activity on projects list', () => {
63         const initialState = {
64             items: [{
65                 data: {
66                     name: 'test',
67                     href: 'href',
68                     createdAt: '2018-01-01',
69                     modifiedAt: '2018-01-01',
70                     ownerUuid: 'owner-test123',
71                     uuid: 'test123',
72                     kind: ResourceKind.PROJECT
73                 },
74                 id: "1",
75                 open: true,
76                 active: true,
77                 status: 1
78             }],
79             currentItemId: "1"
80         };
81         const project = {
82             items: [{
83                 data: {
84                     name: 'test',
85                     href: 'href',
86                     createdAt: '2018-01-01',
87                     modifiedAt: '2018-01-01',
88                     ownerUuid: 'owner-test123',
89                     uuid: 'test123',
90                     kind: ResourceKind.PROJECT
91                 },
92                 id: "1",
93                 open: true,
94                 active: false,
95                 status: 1
96             }],
97             currentItemId: ""
98         };
99
100         const state = projectsReducer(initialState, actions.RESET_PROJECT_TREE_ACTIVITY(initialState.items[0].id));
101         expect(state).toEqual(project);
102     });
103
104     it('should toggle project tree item activity', () => {
105         const initialState = {
106             items: [{
107                 data: {
108                     name: 'test',
109                     href: 'href',
110                     createdAt: '2018-01-01',
111                     modifiedAt: '2018-01-01',
112                     ownerUuid: 'owner-test123',
113                     uuid: 'test123',
114                     kind: ResourceKind.PROJECT
115                 },
116                 id: "1",
117                 open: true,
118                 active: false,
119                 status: 1
120             }],
121             currentItemId: "1"
122         };
123         const project = {
124             items: [{
125                 data: {
126                     name: 'test',
127                     href: 'href',
128                     createdAt: '2018-01-01',
129                     modifiedAt: '2018-01-01',
130                     ownerUuid: 'owner-test123',
131                     uuid: 'test123',
132                     kind: ResourceKind.PROJECT,
133                 },
134                 id: "1",
135                 open: true,
136                 active: true,
137                 status: 1,
138                 toggled: true
139             }],
140             currentItemId: "1"
141         };
142
143         const state = projectsReducer(initialState, actions.TOGGLE_PROJECT_TREE_ITEM_ACTIVE(initialState.items[0].id));
144         expect(state).toEqual(project);
145     });
146
147
148     it('should close project tree item ', () => {
149         const initialState = {
150             items: [{
151                 data: {
152                     name: 'test',
153                     href: 'href',
154                     createdAt: '2018-01-01',
155                     modifiedAt: '2018-01-01',
156                     ownerUuid: 'owner-test123',
157                     uuid: 'test123',
158                     kind: ResourceKind.PROJECT
159                 },
160                 id: "1",
161                 open: true,
162                 active: false,
163                 status: 1,
164                 toggled: false,
165             }],
166             currentItemId: "1"
167         };
168         const project = {
169             items: [{
170                 data: {
171                     name: 'test',
172                     href: 'href',
173                     createdAt: '2018-01-01',
174                     modifiedAt: '2018-01-01',
175                     ownerUuid: 'owner-test123',
176                     uuid: 'test123',
177                     kind: ResourceKind.PROJECT
178                 },
179                 id: "1",
180                 open: false,
181                 active: false,
182                 status: 1,
183                 toggled: true
184             }],
185             currentItemId: "1"
186         };
187
188         const state = projectsReducer(initialState, actions.TOGGLE_PROJECT_TREE_ITEM_OPEN(initialState.items[0].id));
189         expect(state).toEqual(project);
190     });
191 });
192
193 describe("findTreeBranch", () => {
194     const createTreeItem = (id: string, items?: Array<TreeItem<string>>): TreeItem<string> => ({
195         id,
196         items,
197         active: false,
198         data: "",
199         open: false,
200         status: TreeItemStatus.Initial
201     });
202
203     it("should return an array that matches path to the given item", () => {
204         const tree: Array<TreeItem<string>> = [
205             createTreeItem("1", [
206                 createTreeItem("1.1", [
207                     createTreeItem("1.1.1"),
208                     createTreeItem("1.1.2")
209                 ])
210             ]),
211             createTreeItem("2", [
212                 createTreeItem("2.1", [
213                     createTreeItem("2.1.1"),
214                     createTreeItem("2.1.2")
215                 ])
216             ])
217         ];
218         const branch = getTreePath(tree, "2.1.1");
219         expect(branch.map(item => item.id)).toEqual(["2", "2.1", "2.1.1"]);
220     });
221
222     it("should return empty array if item is not found", () => {
223         const tree: Array<TreeItem<string>> = [
224             createTreeItem("1", [
225                 createTreeItem("1.1", [
226                     createTreeItem("1.1.1"),
227                     createTreeItem("1.1.2")
228                 ])
229             ]),
230             createTreeItem("2", [
231                 createTreeItem("2.1", [
232                     createTreeItem("2.1.1"),
233                     createTreeItem("2.1.2")
234                 ])
235             ])
236         ];
237         expect(getTreePath(tree, "3")).toHaveLength(0);
238     });
239
240 });