////////////////////////////////////////////////////////////////////////// // // pgAdmin 4 - PostgreSQL Tools // // Copyright (C) 2013 - 2018, The pgAdmin Development Team // This software is released under the PostgreSQL Licence // ////////////////////////////////////////////////////////////////////////// import {Tree, TreeNode} from '../../../pgadmin/static/js/tree/tree'; import {TreeFake} from './tree_fake'; const context = describe; const treeTests = (treeClass, setDefaultCallBack) => { let tree; beforeEach(() => { tree = new treeClass(); }); describe('#addNewNode', () => { describe('when add a new root element', () => { context('using [] as the parent', () => { beforeEach(() => { tree.addNewNode('some new node', {data: 'interesting'}, undefined, []); }); it('can be retrieved', () => { const node = tree.findNode(['some new node']); expect(node.data).toEqual({data: 'interesting'}); }); it('return false for #hasParent()', () => { const node = tree.findNode(['some new node']); expect(node.hasParent()).toBe(false); }); it('return null for #parent()', () => { const node = tree.findNode(['some new node']); expect(node.parent()).toBeNull(); }); }); context('using null as the parent', () => { beforeEach(() => { tree.addNewNode('some new node', {data: 'interesting'}, undefined, null); }); it('can be retrieved', () => { const node = tree.findNode(['some new node']); expect(node.data).toEqual({data: 'interesting'}); }); it('return false for #hasParent()', () => { const node = tree.findNode(['some new node']); expect(node.hasParent()).toBe(false); }); it('return null for #parent()', () => { const node = tree.findNode(['some new node']); expect(node.parent()).toBeNull(); }); }); context('using undefined as the parent', () => { beforeEach(() => { tree.addNewNode('some new node', {data: 'interesting'}); }); it('can be retrieved', () => { const node = tree.findNode(['some new node']); expect(node.data).toEqual({data: 'interesting'}); }); it('return false for #hasParent()', () => { const node = tree.findNode(['some new node']); expect(node.hasParent()).toBe(false); }); it('return null for #parent()', () => { const node = tree.findNode(['some new node']); expect(node.parent()).toBeNull(); }); }); }); describe('when add a new element as a child', () => { let parentNode; beforeEach(() => { parentNode = tree.addNewNode('parent node', {data: 'parent data'}, undefined, []); tree.addNewNode('some new node', {data: 'interesting'}, undefined, ['parent' + ' node']); }); it('can be retrieved', () => { const node = tree.findNode(['parent node', 'some new node']); expect(node.data).toEqual({data: 'interesting'}); }); it('return true for #hasParent()', () => { const node = tree.findNode(['parent node', 'some new node']); expect(node.hasParent()).toBe(true); }); it('return "parent node" object for #parent()', () => { const node = tree.findNode(['parent node', 'some new node']); expect(node.parent()).toEqual(parentNode); }); }); describe('when add an element that already exists under a parent', () => { beforeEach(() => { tree.addNewNode('parent node', {data: 'parent data'}, undefined, []); tree.addNewNode('some new node', {data: 'interesting'}, undefined, ['parent' + ' node']); }); it('does not add a new child', () => { tree.addNewNode('some new node', {data: 'interesting 1'}, undefined, ['parent' + ' node']); const parentNode = tree.findNode(['parent node']); expect(parentNode.children.length).toBe(1); }); it('updates the existing node data', () => { tree.addNewNode('some new node', {data: 'interesting 1'}, undefined, ['parent' + ' node']); const node = tree.findNode(['parent node', 'some new node']); expect(node.data).toEqual({data: 'interesting 1'}); }); }); }); describe('#translateTreeNodeIdFromACITree', () => { let aciTreeApi; beforeEach(() => { aciTreeApi = jasmine.createSpyObj('ACITreeApi', [ 'hasParent', 'parent', 'getId', ]); aciTreeApi.getId.and.callFake((node) => { return node[0].id; }); tree.aciTreeApi = aciTreeApi; }); describe('When tree as a single level', () => { beforeEach(() => { aciTreeApi.hasParent.and.returnValue(false); }); it('returns an array with the ID of the first level', () => { let node = [{ id: 'some id', }]; tree.addNewNode('some id', {}, undefined, []); expect(tree.translateTreeNodeIdFromACITree(node)).toEqual(['some id']); }); }); describe('When tree as a 2 levels', () => { describe('When we try to retrieve the node in the second level', () => { it('returns an array with the ID of the first level and second level', () => { aciTreeApi.hasParent.and.returnValues(true, false); aciTreeApi.parent.and.returnValue([{ id: 'parent id', }]); let node = [{ id: 'some id', }]; tree.addNewNode('parent id', {}, undefined, []); tree.addNewNode('some id', {}, undefined, ['parent id']); expect(tree.translateTreeNodeIdFromACITree(node)) .toEqual(['parent id', 'some id']); }); }); }); }); describe('#selected', () => { context('a node in the tree is selected', () => { it('returns that node object', () => { let selectedNode = new TreeNode('bamm', {}, []); setDefaultCallBack(tree, selectedNode); expect(tree.selected()).toEqual(selectedNode); }); }); }); describe('#findNodeByTreeElement', () => { context('retrieve data from node not found', () => { it('return undefined', () => { let aciTreeApi = jasmine.createSpyObj('ACITreeApi', [ 'hasParent', 'parent', 'getId', ]); aciTreeApi.getId.and.callFake((node) => { return node[0].id; }); tree.aciTreeApi = aciTreeApi; expect(tree.findNodeByDomElement(['