f4301040d5b165b709092892873245e9c6c3ca1c
[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             }],
139             currentItemId: "1"
140         };
141
142         const state = projectsReducer(initialState, actions.TOGGLE_PROJECT_TREE_ITEM_ACTIVE(initialState.items[0].id));
143         expect(state).toEqual(project);
144     });
145
146
147     it('should close project tree item ', () => {
148         const initialState = {
149             items: [{
150                 data: {
151                     name: 'test',
152                     href: 'href',
153                     createdAt: '2018-01-01',
154                     modifiedAt: '2018-01-01',
155                     ownerUuid: 'owner-test123',
156                     uuid: 'test123',
157                     kind: ResourceKind.PROJECT
158                 },
159                 id: "1",
160                 open: true,
161                 active: false,
162                 status: 1,
163                 toggled: false,
164             }],
165             currentItemId: "1"
166         };
167         const project = {
168             items: [{
169                 data: {
170                     name: 'test',
171                     href: 'href',
172                     createdAt: '2018-01-01',
173                     modifiedAt: '2018-01-01',
174                     ownerUuid: 'owner-test123',
175                     uuid: 'test123',
176                     kind: ResourceKind.PROJECT
177                 },
178                 id: "1",
179                 open: false,
180                 active: false,
181                 status: 1,
182                 toggled: true
183             }],
184             currentItemId: "1"
185         };
186
187         const state = projectsReducer(initialState, actions.TOGGLE_PROJECT_TREE_ITEM_OPEN(initialState.items[0].id));
188         expect(state).toEqual(project);
189     });
190 });
191
192 describe("findTreeBranch", () => {
193     const createTreeItem = (id: string, items?: Array<TreeItem<string>>): TreeItem<string> => ({
194         id,
195         items,
196         active: false,
197         data: "",
198         open: false,
199         status: TreeItemStatus.Initial
200     });
201
202     it("should return an array that matches path to the given item", () => {
203         const tree: Array<TreeItem<string>> = [
204             createTreeItem("1", [
205                 createTreeItem("1.1", [
206                     createTreeItem("1.1.1"),
207                     createTreeItem("1.1.2")
208                 ])
209             ]),
210             createTreeItem("2", [
211                 createTreeItem("2.1", [
212                     createTreeItem("2.1.1"),
213                     createTreeItem("2.1.2")
214                 ])
215             ])
216         ];
217         const branch = getTreePath(tree, "2.1.1");
218         expect(branch.map(item => item.id)).toEqual(["2", "2.1", "2.1.1"]);
219     });
220
221     it("should return empty array if item is not found", () => {
222         const tree: Array<TreeItem<string>> = [
223             createTreeItem("1", [
224                 createTreeItem("1.1", [
225                     createTreeItem("1.1.1"),
226                     createTreeItem("1.1.2")
227                 ])
228             ]),
229             createTreeItem("2", [
230                 createTreeItem("2.1", [
231                     createTreeItem("2.1.1"),
232                     createTreeItem("2.1.2")
233                 ])
234             ])
235         ];
236         expect(getTreePath(tree, "3")).toHaveLength(0);
237     });
238
239 });