2018-06-05 05:36:19 -05:00
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// pgAdmin 4 - PostgreSQL Tools
|
|
|
|
//
|
2021-01-04 04:04:45 -06:00
|
|
|
// Copyright (C) 2013 - 2021, The pgAdmin Development Team
|
2018-06-05 05:36:19 -05:00
|
|
|
// This software is released under the PostgreSQL Licence
|
|
|
|
//
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
import {
|
|
|
|
getTreeNodeHierarchyFromElement,
|
|
|
|
getTreeNodeHierarchyFromIdentifier,
|
|
|
|
} from '../../../pgadmin/static/js/tree/pgadmin_tree_node';
|
|
|
|
import {TreeNode} from '../../../pgadmin/static/js/tree/tree';
|
|
|
|
import {TreeFake} from './tree_fake';
|
|
|
|
|
|
|
|
const context = describe;
|
|
|
|
|
|
|
|
describe('tree#node#getTreeNodeHierarchy', () => {
|
|
|
|
let browser;
|
|
|
|
let newTree;
|
|
|
|
beforeEach(() => {
|
|
|
|
newTree = new TreeFake();
|
|
|
|
browser = {
|
|
|
|
Nodes: {
|
|
|
|
'special one': {hasId: true},
|
|
|
|
'child special': {hasId: true},
|
|
|
|
'other type': {hasId: true},
|
|
|
|
'table': {hasId: true},
|
|
|
|
'partition': {hasId: true},
|
|
|
|
'no id': {hasId: false},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
browser.treeMenu = newTree;
|
|
|
|
});
|
|
|
|
|
|
|
|
context('getTreeNodeHierarchy is called with aciTreeNode object', () => {
|
|
|
|
describe('When the current node is root element', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
newTree.addNewNode('root', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'special one',
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('returns a object with the element type passed data and priority == 0', () => {
|
|
|
|
const result = getTreeNodeHierarchyFromIdentifier.bind(browser)([{id: 'root'}]);
|
|
|
|
expect(result).toEqual({
|
|
|
|
'special one': {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'special one',
|
|
|
|
'priority': 0,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('When the current node is not of a known type', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
newTree.addNewNode('root', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'do not exist',
|
|
|
|
}, []);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('returns a empty object', () => {
|
|
|
|
const result = getTreeNodeHierarchyFromIdentifier.bind(browser)('root');
|
|
|
|
expect(result).toEqual({});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('When the current node type has no id', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
newTree.addNewNode('root', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'no id',
|
|
|
|
}, []);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('returns a empty object', () => {
|
|
|
|
const result = getTreeNodeHierarchyFromIdentifier.bind(browser)('root');
|
|
|
|
expect(result).toEqual({});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('When the current node is at the second level', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
const root = newTree.addNewNode('root', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'special one',
|
|
|
|
});
|
|
|
|
const firstChild = new TreeNode('first child', {
|
|
|
|
'some key': 'some other value',
|
|
|
|
'_type': 'child special',
|
|
|
|
}, ['root']);
|
|
|
|
newTree.addChild(root, firstChild);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('returns a empty object', () => {
|
|
|
|
const result = getTreeNodeHierarchyFromIdentifier.bind(browser)([{id: 'first child'}]);
|
|
|
|
expect(result).toEqual({
|
|
|
|
'child special': {
|
|
|
|
'some key': 'some other value',
|
|
|
|
'_type': 'child special',
|
|
|
|
'priority': 0,
|
|
|
|
},
|
|
|
|
'special one': {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'special one',
|
|
|
|
'priority': -1,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
context('When tree as "special type"', () => {
|
|
|
|
context('When "special type" have "other type"', () => {
|
|
|
|
context('When "other type" have "special type"', () => {
|
|
|
|
describe('When retrieving lead node', () => {
|
|
|
|
it('does not override previous node type data', () => {
|
|
|
|
const rootNode = newTree.addNewNode('root', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'special one',
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
const level1 = new TreeNode('level 1', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'other type',
|
|
|
|
});
|
|
|
|
newTree.addChild(rootNode, level1);
|
|
|
|
|
|
|
|
newTree.addChild(level1, new TreeNode('level 2', {
|
|
|
|
'some key': 'expected value',
|
|
|
|
'_type': 'special one',
|
|
|
|
'some other key': 'some other value',
|
|
|
|
}));
|
|
|
|
|
|
|
|
const result = getTreeNodeHierarchyFromIdentifier.bind(browser)([{id: 'level 2'}]);
|
|
|
|
expect(result).toEqual({
|
|
|
|
'special one': {
|
|
|
|
'some key': 'expected value',
|
|
|
|
'_type': 'special one',
|
|
|
|
'some other key': 'some other value',
|
|
|
|
'priority': 0,
|
|
|
|
},
|
|
|
|
'other type': {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'other type',
|
|
|
|
'priority': -1,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
context('When tree has table', () => {
|
|
|
|
context('when table has partition', () => {
|
|
|
|
it('returns table with partition parameters', () => {
|
|
|
|
const root = newTree.addNewNode('root', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'special one',
|
|
|
|
}, []);
|
|
|
|
const level1 = new TreeNode('level 1', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'table',
|
|
|
|
});
|
|
|
|
newTree.addChild(root, level1);
|
|
|
|
newTree.addChild(level1, new TreeNode('level 2', {
|
|
|
|
'some key': 'expected value',
|
|
|
|
'_type': 'partition',
|
|
|
|
'some other key': 'some other value',
|
|
|
|
}));
|
|
|
|
|
|
|
|
const result = getTreeNodeHierarchyFromIdentifier.bind(browser)([{id:'level 2'}]);
|
|
|
|
expect(result).toEqual({
|
|
|
|
'special one': {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'special one',
|
2018-07-23 08:33:40 -05:00
|
|
|
'priority': -2,
|
2018-06-05 05:36:19 -05:00
|
|
|
},
|
|
|
|
'table': {
|
2018-07-23 08:33:40 -05:00
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'table',
|
|
|
|
'priority': -1,
|
|
|
|
},
|
|
|
|
'partition': {
|
2018-06-05 05:36:19 -05:00
|
|
|
'some key': 'expected value',
|
|
|
|
'some other key': 'some other value',
|
|
|
|
'_type': 'partition',
|
|
|
|
'priority': 0,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
context('getTreeNodeHierarchy is called with TreeNode object', () => {
|
|
|
|
let treeNode;
|
|
|
|
describe('When the current node is root element', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
treeNode = newTree.addNewNode('root', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'special one',
|
|
|
|
}, []);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('returns a object with the element type passed data and priority == 0', () => {
|
|
|
|
const result = getTreeNodeHierarchyFromElement(browser, treeNode);
|
|
|
|
expect(result).toEqual({
|
|
|
|
'special one': {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'special one',
|
|
|
|
'priority': 0,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('When the current node is not of a known type', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
treeNode = newTree.addNewNode('root', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'do not exist',
|
|
|
|
}, []);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('returns a empty object', () => {
|
|
|
|
const result = getTreeNodeHierarchyFromElement(browser, treeNode);
|
|
|
|
expect(result).toEqual({});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('When the current node type has no id', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
treeNode = newTree.addNewNode('root', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'no id',
|
|
|
|
}, []);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('returns a empty object', () => {
|
|
|
|
const result = getTreeNodeHierarchyFromElement(browser, treeNode);
|
|
|
|
expect(result).toEqual({});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('When the current node is at the second level', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
const root = newTree.addNewNode('root', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'special one',
|
|
|
|
}, []);
|
|
|
|
treeNode = new TreeNode('first child', {
|
|
|
|
'some key': 'some other value',
|
|
|
|
'_type': 'child special',
|
|
|
|
});
|
|
|
|
newTree.addChild(root, treeNode);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('returns a empty object', () => {
|
|
|
|
const result = getTreeNodeHierarchyFromElement(browser, treeNode);
|
|
|
|
expect(result).toEqual({
|
|
|
|
'child special': {
|
|
|
|
'some key': 'some other value',
|
|
|
|
'_type': 'child special',
|
|
|
|
'priority': 0,
|
|
|
|
},
|
|
|
|
'special one': {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'special one',
|
|
|
|
'priority': -1,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
context('When tree as "special type"', () => {
|
|
|
|
context('When "special type" have "other type"', () => {
|
|
|
|
context('When "other type" have "special type"', () => {
|
|
|
|
describe('When retrieving lead node', () => {
|
|
|
|
it('does not override previous node type data', () => {
|
|
|
|
const root = newTree.addNewNode('root', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'special one',
|
|
|
|
}, []);
|
|
|
|
const level1 = new TreeNode('level 1', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'other type',
|
|
|
|
});
|
|
|
|
newTree.addChild(root, level1);
|
|
|
|
treeNode = new TreeNode('level 2', {
|
|
|
|
'some key': 'expected value',
|
|
|
|
'_type': 'special one',
|
|
|
|
'some other key': 'some other value',
|
|
|
|
});
|
|
|
|
newTree.addChild(level1, treeNode);
|
|
|
|
|
|
|
|
const result = getTreeNodeHierarchyFromElement(browser, treeNode);
|
|
|
|
expect(result).toEqual({
|
|
|
|
'special one': {
|
|
|
|
'some key': 'expected value',
|
|
|
|
'_type': 'special one',
|
|
|
|
'some other key': 'some other value',
|
|
|
|
'priority': 0,
|
|
|
|
},
|
|
|
|
'other type': {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'other type',
|
|
|
|
'priority': -1,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
context('When tree has table', () => {
|
|
|
|
context('when table has partition', () => {
|
|
|
|
it('returns table with partition parameters', () => {
|
|
|
|
const root = newTree.addNewNode('root', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'special one',
|
|
|
|
});
|
|
|
|
const level1 = newTree.addNewNode('level 1', {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'table',
|
|
|
|
});
|
|
|
|
newTree.addChild(root, level1);
|
|
|
|
treeNode = new TreeNode('level 2', {
|
|
|
|
'some key': 'expected value',
|
|
|
|
'_type': 'partition',
|
|
|
|
'some other key': 'some other value',
|
|
|
|
});
|
|
|
|
newTree.addChild(level1, treeNode);
|
|
|
|
|
|
|
|
const result = getTreeNodeHierarchyFromElement(browser, treeNode);
|
|
|
|
expect(result).toEqual({
|
|
|
|
'special one': {
|
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'special one',
|
2018-07-23 08:33:40 -05:00
|
|
|
'priority': -2,
|
2018-06-05 05:36:19 -05:00
|
|
|
},
|
|
|
|
'table': {
|
2018-07-23 08:33:40 -05:00
|
|
|
'some key': 'some value',
|
|
|
|
'_type': 'table',
|
|
|
|
'priority': -1,
|
|
|
|
},
|
|
|
|
'partition': {
|
2018-06-05 05:36:19 -05:00
|
|
|
'some key': 'expected value',
|
|
|
|
'some other key': 'some other value',
|
|
|
|
'_type': 'partition',
|
|
|
|
'priority': 0,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|