mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-25 18:55:31 -06:00
Extract the tests and refactor some of the methods.
Extract some of the ACI Tree functionalities, and decouple it from the main source. Also - create some abstractions from the repeated code around the enable/disable the schema children object create/edit/delete functionalities, and also created the dialog wrappers for backup and restore dialogs. Reviewed by: Khushboo and Ashesh Refactored by: Ashesh
This commit is contained in:
committed by
Ashesh Vashi
parent
920934759f
commit
7dd6372eeb
353
web/regression/javascript/tree/pgadmin_tree_node_spec.js
Normal file
353
web/regression/javascript/tree/pgadmin_tree_node_spec.js
Normal file
@@ -0,0 +1,353 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// pgAdmin 4 - PostgreSQL Tools
|
||||
//
|
||||
// Copyright (C) 2013 - 2018, The pgAdmin Development Team
|
||||
// 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',
|
||||
'priority': -1,
|
||||
},
|
||||
'table': {
|
||||
'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',
|
||||
'priority': -1,
|
||||
},
|
||||
'table': {
|
||||
'some key': 'expected value',
|
||||
'some other key': 'some other value',
|
||||
'_type': 'partition',
|
||||
'priority': 0,
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -10,6 +10,32 @@
|
||||
import {Tree} from '../../../pgadmin/static/js/tree/tree';
|
||||
|
||||
export class TreeFake extends Tree {
|
||||
static build(structure) {
|
||||
let tree = new TreeFake();
|
||||
let rootNode = tree.rootNode;
|
||||
|
||||
if (structure.children !== undefined) {
|
||||
structure.children.forEach((child) => {
|
||||
TreeFake.recursivelyAddNodes(tree, child, rootNode);
|
||||
});
|
||||
}
|
||||
|
||||
return tree;
|
||||
}
|
||||
|
||||
static recursivelyAddNodes(tree, newNode, parent) {
|
||||
let id = newNode.id;
|
||||
let data = newNode.data ? newNode.data : {};
|
||||
let domNode = newNode.domNode ? newNode.domNode : [{id: id}];
|
||||
tree.addNewNode(id, data, domNode, tree.translateTreeNodeIdFromACITree([parent]));
|
||||
|
||||
if (newNode.children !== undefined) {
|
||||
newNode.children.forEach((child) => {
|
||||
TreeFake.recursivelyAddNodes(tree, child, newNode);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this.aciTreeToOurTreeTranslator = {};
|
||||
@@ -45,7 +71,7 @@ export class TreeFake extends Tree {
|
||||
}
|
||||
|
||||
translateTreeNodeIdFromACITree(aciTreeNode) {
|
||||
if(aciTreeNode === undefined || aciTreeNode[0] === undefined) {
|
||||
if (aciTreeNode === undefined || aciTreeNode[0] === undefined) {
|
||||
return null;
|
||||
}
|
||||
return this.aciTreeToOurTreeTranslator[aciTreeNode[0].id];
|
||||
|
||||
Reference in New Issue
Block a user