From 89161730d7d5e7d16a8fe2f5494db6560e718fa3 Mon Sep 17 00:00:00 2001 From: Michal Klobukowski Date: Fri, 15 Jun 2018 14:40:25 +0200 Subject: [PATCH] Create function to create tree item branch and tests for it Feature #13628 Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski --- src/store/project/project-reducer.test.ts | 78 +++++++++++++++++++---- src/store/project/project-reducer.ts | 14 ++++ 2 files changed, 78 insertions(+), 14 deletions(-) diff --git a/src/store/project/project-reducer.test.ts b/src/store/project/project-reducer.test.ts index 9c1ed3b4..3e828830 100644 --- a/src/store/project/project-reducer.test.ts +++ b/src/store/project/project-reducer.test.ts @@ -2,8 +2,9 @@ // // SPDX-License-Identifier: AGPL-3.0 -import projectsReducer from "./project-reducer"; +import projectsReducer, { findTreeBranch } from "./project-reducer"; import actions from "./project-action"; +import { TreeItem } from "../../components/tree/tree"; describe('project-reducer', () => { it('should add new project to the list', () => { @@ -33,20 +34,69 @@ describe('project-reducer', () => { }; const projects = [project, project]; - const state = projectsReducer(initialState, actions.PROJECTS_SUCCESS({projects, parentItemId: undefined})); + const state = projectsReducer(initialState, actions.PROJECTS_SUCCESS({ projects, parentItemId: undefined })); expect(state).toEqual([{ - active: false, - open: false, - id: "test123", - items: [], - data: project - }, { - active: false, - open: false, - id: "test123", - items: [], - data: project - } + active: false, + open: false, + id: "test123", + items: [], + data: project + }, { + active: false, + open: false, + id: "test123", + items: [], + data: project + } ]); }); }); + +describe("findTreeBranch", () => { + + const createTreeItem = (id: string, items?: Array>): TreeItem => ({ + id, + items, + active: false, + data: "", + open: false, + }); + + it("should return an array that matches path to the given item", () => { + const tree: Array> = [ + createTreeItem("1", [ + createTreeItem("1.1", [ + createTreeItem("1.1.1"), + createTreeItem("1.1.2") + ]) + ]), + createTreeItem("2", [ + createTreeItem("2.1", [ + createTreeItem("2.1.1"), + createTreeItem("2.1.2") + ]) + ]) + ]; + const branch = findTreeBranch(tree, "2.1.1"); + expect(branch.map(item => item.id)).toEqual(["2", "2.1", "2.1.1"]); + }); + + it("should return empty array if item is not found", () => { + const tree: Array> = [ + createTreeItem("1", [ + createTreeItem("1.1", [ + createTreeItem("1.1.1"), + createTreeItem("1.1.2") + ]) + ]), + createTreeItem("2", [ + createTreeItem("2.1", [ + createTreeItem("2.1.1"), + createTreeItem("2.1.2") + ]) + ]) + ]; + expect(findTreeBranch(tree, "3")).toHaveLength(0); + }); + +}); diff --git a/src/store/project/project-reducer.ts b/src/store/project/project-reducer.ts index 887cf89b..ac6d4b73 100644 --- a/src/store/project/project-reducer.ts +++ b/src/store/project/project-reducer.ts @@ -22,6 +22,20 @@ function findTreeItem(tree: Array>, itemId: string): TreeItem return item; } +export function findTreeBranch(tree: Array>, itemId: string): Array> { + for(const item of tree){ + if(item.id === itemId){ + return [item]; + } else { + const branch = findTreeBranch(item.items || [], itemId); + if(branch.length > 0){ + return [item, ...branch]; + } + } + } + return []; +} + function resetTreeActivity(tree: Array>) { for (const t of tree) { t.active = false; -- 2.30.2