56a62534655bd791cb05c459d74047683b8c40f3
[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 { projectActions } from "./project-action";
7 import { TreeItem, TreeItemStatus } from "~/components/tree/tree";
8 import { mockProjectResource } from "~/models/test-utils";
9
10 describe('project-reducer', () => {
11
12     it('should load projects', () => {
13         const initialState = undefined;
14
15         const projects = [mockProjectResource({ uuid: "1" }), mockProjectResource({ uuid: "2" })];
16         const state = projectsReducer(initialState, projectActions.PROJECTS_SUCCESS({ projects, parentItemId: undefined }));
17         expect(state).toEqual({
18             items: [{
19                 active: false,
20                 open: false,
21                 id: "1",
22                 items: [],
23                 data: mockProjectResource({ uuid: "1" }),
24                 status: TreeItemStatus.INITIAL
25             }, {
26                 active: false,
27                 open: false,
28                 id: "2",
29                 items: [],
30                 data: mockProjectResource({ uuid: "2" }),
31                 status: TreeItemStatus.INITIAL
32             }
33             ],
34             currentItemId: ""
35         });
36     });
37
38     it('should remove activity on projects list', () => {
39         const initialState = {
40             items: [{
41                 data: mockProjectResource(),
42                 id: "1",
43                 open: true,
44                 active: true,
45                 status: TreeItemStatus.PENDING
46             }],
47             currentItemId: "1"
48         };
49         const project = {
50             items: [{
51                 data: mockProjectResource(),
52                 id: "1",
53                 open: true,
54                 active: false,
55                 status: TreeItemStatus.PENDING
56             }],
57             currentItemId: ""
58         };
59
60         const state = projectsReducer(initialState, projectActions.RESET_PROJECT_TREE_ACTIVITY(initialState.items[0].id));
61         expect(state).toEqual(project);
62     });
63
64     it('should toggle project tree item activity', () => {
65         const initialState = {
66             items: [{
67                 data: mockProjectResource(),
68                 id: "1",
69                 open: true,
70                 active: false,
71                 status: TreeItemStatus.PENDING
72             }],
73             currentItemId: "1"
74         };
75         const project = {
76             items: [{
77                 data: mockProjectResource(),
78                 id: "1",
79                 open: true,
80                 active: true,
81                 status: TreeItemStatus.PENDING,
82             }],
83             currentItemId: "1"
84         };
85
86         const state = projectsReducer(initialState, projectActions.TOGGLE_PROJECT_TREE_ITEM_ACTIVE(initialState.items[0].id));
87         expect(state).toEqual(project);
88     });
89
90
91     it('should close project tree item ', () => {
92         const initialState = {
93             items: [{
94                 data: mockProjectResource(),
95                 id: "1",
96                 open: true,
97                 active: false,
98                 status: TreeItemStatus.PENDING,
99             }],
100             currentItemId: "1"
101         };
102         const project = {
103             items: [{
104                 data: mockProjectResource(),
105                 id: "1",
106                 open: false,
107                 active: false,
108                 status: TreeItemStatus.PENDING,
109             }],
110             currentItemId: "1"
111         };
112
113         const state = projectsReducer(initialState, projectActions.TOGGLE_PROJECT_TREE_ITEM_OPEN(initialState.items[0].id));
114         expect(state).toEqual(project);
115     });
116 });
117
118 describe("findTreeBranch", () => {
119     const createTreeItem = (id: string, items?: Array<TreeItem<string>>): TreeItem<string> => ({
120         id,
121         items,
122         active: false,
123         data: "",
124         open: false,
125         status: TreeItemStatus.INITIAL
126     });
127
128     it("should return an array that matches path to the given item", () => {
129         const tree: Array<TreeItem<string>> = [
130             createTreeItem("1", [
131                 createTreeItem("1.1", [
132                     createTreeItem("1.1.1"),
133                     createTreeItem("1.1.2")
134                 ])
135             ]),
136             createTreeItem("2", [
137                 createTreeItem("2.1", [
138                     createTreeItem("2.1.1"),
139                     createTreeItem("2.1.2")
140                 ])
141             ])
142         ];
143         const branch = getTreePath(tree, "2.1.1");
144         expect(branch.map(item => item.id)).toEqual(["2", "2.1", "2.1.1"]);
145     });
146
147     it("should return empty array if item is not found", () => {
148         const tree: Array<TreeItem<string>> = [
149             createTreeItem("1", [
150                 createTreeItem("1.1", [
151                     createTreeItem("1.1.1"),
152                     createTreeItem("1.1.2")
153                 ])
154             ]),
155             createTreeItem("2", [
156                 createTreeItem("2.1", [
157                     createTreeItem("2.1.1"),
158                     createTreeItem("2.1.2")
159                 ])
160             ])
161         ];
162         expect(getTreePath(tree, "3")).toHaveLength(0);
163     });
164
165 });