mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-25 18:55:31 -06:00
Port Backup Global, Backup Server, and Backup object dialog in React. Fixes #6984
This commit is contained in:
committed by
Akshay Joshi
parent
a701e8c766
commit
3afeb8ca46
@@ -1,303 +0,0 @@
|
||||
/////////////////////////////////////////////////////////////
|
||||
//
|
||||
// pgAdmin 4 - PostgreSQL Tools
|
||||
//
|
||||
// Copyright (C) 2013 - 2021, The pgAdmin Development Team
|
||||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import {BackupDialog} from '../../../pgadmin/tools/backup/static/js/backup_dialog';
|
||||
import {TreeFake} from '../tree/tree_fake';
|
||||
import MockAdapter from 'axios-mock-adapter';
|
||||
import axios from 'axios/index';
|
||||
|
||||
const context = describe;
|
||||
|
||||
describe('BackupDialog', () => {
|
||||
let backupDialog;
|
||||
let pgBrowser;
|
||||
let jquerySpy;
|
||||
let alertifySpy;
|
||||
let backupModelSpy;
|
||||
|
||||
beforeEach(() => {
|
||||
pgBrowser = {
|
||||
Nodes: {
|
||||
server: {
|
||||
hasId: true,
|
||||
label: 'server',
|
||||
getTreeNodeHierarchy: jasmine.createSpy('server.getTreeNodeHierarchy'),
|
||||
},
|
||||
database: {
|
||||
hasId: true,
|
||||
label: 'database',
|
||||
getTreeNodeHierarchy: jasmine.createSpy('db.getTreeNodeHierarchy'),
|
||||
},
|
||||
schema: {
|
||||
hasId: true,
|
||||
label: 'schema',
|
||||
getTreeNodeHierarchy: jasmine.createSpy('db.getTreeNodeHierarchy'),
|
||||
},
|
||||
},
|
||||
stdW: {
|
||||
sm: 500,
|
||||
md: 700,
|
||||
lg: 900,
|
||||
default: 500,
|
||||
},
|
||||
stdH: {
|
||||
sm: 200,
|
||||
md: 400,
|
||||
lg: 550,
|
||||
default: 550,
|
||||
},
|
||||
};
|
||||
pgBrowser.tree = new TreeFake(pgBrowser);
|
||||
pgBrowser.Nodes.server.hasId = true;
|
||||
pgBrowser.Nodes.database.hasId = true;
|
||||
jquerySpy = jasmine.createSpy('jquerySpy');
|
||||
backupModelSpy = jasmine.createSpy('backupModelSpy');
|
||||
|
||||
const hierarchy = {
|
||||
children: [
|
||||
{
|
||||
id: 'root',
|
||||
children: [
|
||||
{
|
||||
id: 'serverTreeNode',
|
||||
data: {
|
||||
_id: 10,
|
||||
_type: 'server',
|
||||
label: 'some-tree-label',
|
||||
server_type: 'pg',
|
||||
version: 100000,
|
||||
},
|
||||
children: [
|
||||
{
|
||||
id: 'some_database',
|
||||
data: {
|
||||
_type: 'database',
|
||||
_id: 11,
|
||||
label: 'some_database',
|
||||
_label: 'some_database_label',
|
||||
},
|
||||
}, {
|
||||
id: 'database_with_equal_in_name',
|
||||
data: {
|
||||
_type: 'database',
|
||||
label: 'some_database',
|
||||
_label: '=some_database_label',
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'serverTreeNodeWrongPath',
|
||||
data: {
|
||||
_id: 12,
|
||||
_type: 'server',
|
||||
label: 'some-tree-label',
|
||||
server_type: 'pg',
|
||||
version: 90600,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'ppasServer',
|
||||
data: {
|
||||
_id: 13,
|
||||
_type: 'server',
|
||||
label: 'some-tree-label',
|
||||
server_type: 'ppas',
|
||||
version: 130000,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'ppasServerTreeNodeWrongPath',
|
||||
data: {
|
||||
_id: 14,
|
||||
_type: 'server',
|
||||
label: 'some-tree-label',
|
||||
server_type: 'ppas',
|
||||
version: 90600,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
pgBrowser.tree = TreeFake.build(hierarchy, pgBrowser);
|
||||
});
|
||||
|
||||
describe('#draw', () => {
|
||||
let networkMock;
|
||||
beforeEach(() => {
|
||||
networkMock = new MockAdapter(axios);
|
||||
alertifySpy = jasmine.createSpyObj('alertify', ['alert', 'dialog']);
|
||||
alertifySpy['backup_objects'] = jasmine.createSpy('backup_objects');
|
||||
backupDialog = new BackupDialog(
|
||||
pgBrowser,
|
||||
jquerySpy,
|
||||
alertifySpy,
|
||||
backupModelSpy
|
||||
);
|
||||
|
||||
pgBrowser.get_preference = jasmine.createSpy('get_preferences');
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
networkMock.restore();
|
||||
});
|
||||
|
||||
context('there are no ancestors of the type server', () => {
|
||||
it('does not create a dialog', () => {
|
||||
pgBrowser.tree.selectNode([{id: 'root'}]);
|
||||
backupDialog.draw(null, null, null);
|
||||
expect(alertifySpy['backup_objects']).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('display an alert with a Backup Error', () => {
|
||||
backupDialog.draw(null, [{id: 'root'}], null);
|
||||
expect(alertifySpy.alert).toHaveBeenCalledWith(
|
||||
'Backup Error',
|
||||
'Please select server or child node from the browser tree.'
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
context('there is an ancestor of the type server', () => {
|
||||
context('no preference can be found', () => {
|
||||
beforeEach(() => {
|
||||
pgBrowser.get_preference.and.returnValue(undefined);
|
||||
});
|
||||
|
||||
context('server is a PostgreSQL server', () => {
|
||||
it('display an alert with "Preferences Error"', () => {
|
||||
backupDialog.draw(null, [{id: 'serverTreeNode'}], null);
|
||||
expect(alertifySpy.alert).toHaveBeenCalledWith(
|
||||
'Preferences Error',
|
||||
'Failed to load preference pg_bin_dir of module paths'
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
context('server is a EPAS server', () => {
|
||||
it('display an alert with "Preferences Error"', () => {
|
||||
backupDialog.draw(null, [{id: 'ppasServer'}], null);
|
||||
expect(alertifySpy.alert).toHaveBeenCalledWith(
|
||||
'Preferences Error',
|
||||
'Failed to load preference ppas_bin_dir of module paths'
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('preference can be found for PostgreSQL Server', () => {
|
||||
context('binary folder is not configured', () => {
|
||||
beforeEach(() => {
|
||||
pgBrowser.get_preference.and.returnValue({value: '[{\"serverType\":\"PostgreSQL 9.6\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"90600\",\"next_major_version\":\"100000\"},{\"serverType\":\"PostgreSQL 10\",\"binaryPath\":\"/Library/PostgreSQL/10/bin\",\"isDefault\":false,\"version\":\"100000\",\"next_major_version\":\"110000\"},{\"serverType\":\"PostgreSQL 11\",\"binaryPath\":\"/Library/PostgreSQL/11/bin\",\"isDefault\":false,\"version\":\"110000\",\"next_major_version\":\"120000\"},{\"serverType\":\"PostgreSQL 12\",\"binaryPath\":\"/Library/PostgreSQL/12/bin\",\"isDefault\":false,\"version\":\"120000\",\"next_major_version\":\"130000\"},{\"serverType\":\"PostgreSQL 13\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"130000\",\"next_major_version\":\"140000\"}]'});
|
||||
});
|
||||
|
||||
context('server is a PostgreSQL server', () => {
|
||||
it('display an alert with "Configuration required"', () => {
|
||||
backupDialog.draw(null, [{id: 'serverTreeNodeWrongPath'}], null);
|
||||
expect(alertifySpy.alert).toHaveBeenCalledWith(
|
||||
'Configuration required',
|
||||
'Please configure the PostgreSQL Binary Path in the Preferences dialog.'
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('binary folder is configured', () => {
|
||||
let backupDialogResizeToSpy;
|
||||
beforeEach(() => {
|
||||
backupDialogResizeToSpy = jasmine.createSpyObj('backupDialogResizeToSpy', ['resizeTo']);
|
||||
alertifySpy['backup_objects'].and
|
||||
.returnValue(backupDialogResizeToSpy);
|
||||
pgBrowser.get_preference.and.returnValue({value: '[{\"serverType\":\"PostgreSQL 9.6\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"90600\",\"next_major_version\":\"100000\"},{\"serverType\":\"PostgreSQL 10\",\"binaryPath\":\"/Library/PostgreSQL/10/bin\",\"isDefault\":true,\"version\":\"100000\",\"next_major_version\":\"110000\"},{\"serverType\":\"PostgreSQL 11\",\"binaryPath\":\"/Library/PostgreSQL/11/bin\",\"isDefault\":false,\"version\":\"110000\",\"next_major_version\":\"120000\"},{\"serverType\":\"PostgreSQL 12\",\"binaryPath\":\"/Library/PostgreSQL/12/bin\",\"isDefault\":false,\"version\":\"120000\",\"next_major_version\":\"130000\"},{\"serverType\":\"PostgreSQL 13\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"130000\",\"next_major_version\":\"140000\"}]'});
|
||||
spyOn(backupDialog, 'url_for_utility_exists').and.returnValue('/backup/utility_exists/10/objects');
|
||||
networkMock.onGet('/backup/utility_exists/10/objects').reply(200, {'success': 1});
|
||||
});
|
||||
|
||||
it('displays the dialog when binary path is for correct server version', (done) => {
|
||||
backupDialog.draw(null, [{id: 'serverTreeNode'}], null, pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy['backup_objects']).toHaveBeenCalledWith(true);
|
||||
expect(backupDialogResizeToSpy.resizeTo).toHaveBeenCalledWith(pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
|
||||
it('displays the dialog when default binary path is specified', (done) => {
|
||||
backupDialog.draw(null, [{id: 'serverTreeNodeWrongPath'}], null, pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy['backup_objects']).toHaveBeenCalledWith(true);
|
||||
expect(backupDialogResizeToSpy.resizeTo).toHaveBeenCalledWith(pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
|
||||
context('database label contain "="', () => {
|
||||
it('should create alert dialog with backup error', (done) => {
|
||||
backupDialog.draw(null, [{id: 'database_with_equal_in_name'}], null);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy.alert).toHaveBeenCalledWith('Backup Error',
|
||||
'Databases with = symbols in the name cannot be backed up or restored using this utility.');
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('preference can be found for EPAS server', () => {
|
||||
context('binary folder is not configured', () => {
|
||||
beforeEach(() => {
|
||||
pgBrowser.get_preference.and.returnValue({value: '[{\"serverType\":\"EDB Advanced Server 9.6\",\"binaryPath\":\"\",\"isDefault\":false,\"version\":\"90600\",\"next_major_version\":\"100000\"},{\"serverType\":\"EDB Advanced Server 10\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"100000\",\"next_major_version\":\"110000\"},{\"serverType\":\"EDB Advanced Server 11\",\"binaryPath\":\"/Library/EPAS/11/bin/\",\"isDefault\":false,\"version\":\"110000\",\"next_major_version\":\"120000\"},{\"serverType\":\"EDB Advanced Server 12\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"120000\",\"next_major_version\":\"130000\"},{\"serverType\":\"EDB Advanced Server 13\",\"binaryPath\":\"/Library/EPAS/13/bin/\",\"isDefault\":false,\"version\":\"130000\",\"next_major_version\":\"140000\"}]'});
|
||||
});
|
||||
|
||||
context('server is a EPAS server', () => {
|
||||
it('display an alert with "Configuration required"', () => {
|
||||
backupDialog.draw(null, [{id: 'ppasServerTreeNodeWrongPath'}], null);
|
||||
expect(alertifySpy.alert).toHaveBeenCalledWith(
|
||||
'Configuration required',
|
||||
'Please configure the EDB Advanced Server Binary Path in the Preferences dialog.'
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('binary folder is configured', () => {
|
||||
let backupDialogResizeToSpy;
|
||||
beforeEach(() => {
|
||||
backupDialogResizeToSpy = jasmine.createSpyObj('backupDialogResizeToSpy', ['resizeTo']);
|
||||
alertifySpy['backup_objects'].and
|
||||
.returnValue(backupDialogResizeToSpy);
|
||||
pgBrowser.get_preference.and.returnValue({value: '[{\"serverType\":\"EDB Advanced Server 9.6\",\"binaryPath\":\"\",\"isDefault\":false,\"version\":\"90600\",\"next_major_version\":\"100000\"},{\"serverType\":\"EDB Advanced Server 10\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"100000\",\"next_major_version\":\"110000\"},{\"serverType\":\"EDB Advanced Server 11\",\"binaryPath\":\"/Library/EPAS/11/bin/\",\"isDefault\":false,\"version\":\"110000\",\"next_major_version\":\"120000\"},{\"serverType\":\"EDB Advanced Server 12\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"120000\",\"next_major_version\":\"130000\"},{\"serverType\":\"EDB Advanced Server 13\",\"binaryPath\":\"/Library/EPAS/13/bin/\",\"isDefault\":true,\"version\":\"130000\",\"next_major_version\":\"140000\"}]'});
|
||||
spyOn(backupDialog, 'url_for_utility_exists').and.returnValue('/backup/utility_exists/10/objects');
|
||||
networkMock.onGet('/backup/utility_exists/10/objects').reply(200, {'success': 1});
|
||||
});
|
||||
|
||||
it('displays the dialog when binary path is for correct server version', (done) => {
|
||||
backupDialog.draw(null, [{id: 'ppasServer'}], null, pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy['backup_objects']).toHaveBeenCalledWith(true);
|
||||
expect(backupDialogResizeToSpy.resizeTo).toHaveBeenCalledWith(pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
|
||||
it('displays the dialog when default binary path is specified', (done) => {
|
||||
backupDialog.draw(null, [{id: 'ppasServerTreeNodeWrongPath'}], null, pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy['backup_objects']).toHaveBeenCalledWith(true);
|
||||
expect(backupDialogResizeToSpy.resizeTo).toHaveBeenCalledWith(pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,682 +0,0 @@
|
||||
/////////////////////////////////////////////////////////////
|
||||
//
|
||||
// pgAdmin 4 - PostgreSQL Tools
|
||||
//
|
||||
// Copyright (C) 2013 - 2021, The pgAdmin Development Team
|
||||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import {TreeFake} from '../tree/tree_fake';
|
||||
import {BackupDialogWrapper} from '../../../pgadmin/tools/backup/static/js/backup_dialog_wrapper';
|
||||
import axios from 'axios/index';
|
||||
import MockAdapter from 'axios-mock-adapter';
|
||||
import {FakeModel} from '../fake_model';
|
||||
import {TreeNode} from '../../../pgadmin/static/js/tree/tree_nodes';
|
||||
|
||||
let context = describe;
|
||||
|
||||
describe('BackupDialogWrapper', () => {
|
||||
let jquerySpy;
|
||||
let pgBrowser;
|
||||
let alertifySpy;
|
||||
let dialogModelKlassSpy;
|
||||
let backform;
|
||||
let generatedBackupModel;
|
||||
let backupDialogWrapper;
|
||||
let noDataNode;
|
||||
let serverTreeNode;
|
||||
let databaseTreeNode;
|
||||
let viewSchema;
|
||||
let backupJQueryContainerSpy;
|
||||
let backupNodeChildNodeSpy;
|
||||
let backupNode;
|
||||
|
||||
beforeEach(() => {
|
||||
pgBrowser = {
|
||||
Nodes: {
|
||||
server: {
|
||||
hasId: true,
|
||||
getTreeNodeHierarchy: jasmine.createSpy('getTreeNodeHierarchy'),
|
||||
},
|
||||
database: {
|
||||
hasId: true,
|
||||
},
|
||||
},
|
||||
keyboardNavigation: jasmine.createSpyObj('keyboardNavigation', ['getDialogTabNavigator']),
|
||||
};
|
||||
|
||||
pgBrowser.tree = new TreeFake(pgBrowser);
|
||||
|
||||
noDataNode = pgBrowser.tree.addNewNode('level1.1', undefined, [{id: 'level1'}]);
|
||||
serverTreeNode = pgBrowser.tree.addNewNode('level2.1', {
|
||||
_type: 'server',
|
||||
_id: 10,
|
||||
label: 'some-tree-label',
|
||||
}, [{id: 'level2.1'}]);
|
||||
databaseTreeNode = new TreeNode('database-tree-node', {
|
||||
_type: 'database',
|
||||
_label: 'some-database-label',
|
||||
}, [{id: 'database-tree-node'}]);
|
||||
pgBrowser.tree.addChild(serverTreeNode, databaseTreeNode);
|
||||
|
||||
jquerySpy = jasmine.createSpy('jquerySpy');
|
||||
backupNode = {
|
||||
__internal: {
|
||||
buttons: [{}, {}, {}, {
|
||||
element: {
|
||||
disabled: false,
|
||||
},
|
||||
}],
|
||||
},
|
||||
elements: {
|
||||
body: {
|
||||
childNodes: [
|
||||
{},
|
||||
],
|
||||
},
|
||||
content: jasmine.createSpyObj('content', ['appendChild', 'attr']),
|
||||
},
|
||||
};
|
||||
|
||||
backupJQueryContainerSpy = jasmine.createSpyObj('backupJQueryContainer', ['get', 'attr']);
|
||||
backupJQueryContainerSpy.get.and.returnValue(backupJQueryContainerSpy);
|
||||
|
||||
generatedBackupModel = {};
|
||||
dialogModelKlassSpy = jasmine.createSpy('dialogModelKlass');
|
||||
dialogModelKlassSpy.and.returnValue(generatedBackupModel);
|
||||
|
||||
viewSchema = {};
|
||||
backform = jasmine.createSpyObj('backform', ['generateViewSchema', 'Dialog']);
|
||||
backform.generateViewSchema.and.returnValue(viewSchema);
|
||||
|
||||
backupNodeChildNodeSpy = jasmine.createSpyObj('something', ['addClass']);
|
||||
jquerySpy.and.callFake((selector) => {
|
||||
if (selector === '<div class=\'backup_dialog\'></div>') {
|
||||
return backupJQueryContainerSpy;
|
||||
} else if (selector === backupNode.elements.body.childNodes[0]) {
|
||||
return backupNodeChildNodeSpy;
|
||||
} else {
|
||||
return jasmine.createSpyObj('obj', ['appendTo']);
|
||||
}
|
||||
});
|
||||
alertifySpy = jasmine.createSpyObj('alertify', ['alert', 'dialog']);
|
||||
|
||||
});
|
||||
|
||||
describe('#prepare', () => {
|
||||
beforeEach(() => {
|
||||
backupDialogWrapper = new BackupDialogWrapper(
|
||||
'<div class=\'backup_dialog\'></div>',
|
||||
'backupDialogTitle',
|
||||
'backup',
|
||||
jquerySpy,
|
||||
pgBrowser,
|
||||
alertifySpy,
|
||||
dialogModelKlassSpy,
|
||||
backform
|
||||
);
|
||||
backupDialogWrapper = Object.assign(backupDialogWrapper, backupNode);
|
||||
});
|
||||
|
||||
context('no tree element is selected', () => {
|
||||
it('does not create a backform dialog', () => {
|
||||
backupDialogWrapper.prepare();
|
||||
expect(backform.Dialog).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('disables the button "submit button" until a filename is selected', () => {
|
||||
backupDialogWrapper.prepare();
|
||||
expect(backupDialogWrapper.__internal.buttons[3].element.disabled).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
context('selected tree node has no data', () => {
|
||||
beforeEach(() => {
|
||||
pgBrowser.tree.selectNode(noDataNode.domNode);
|
||||
});
|
||||
|
||||
it('does not create a backform dialog', () => {
|
||||
backupDialogWrapper.prepare();
|
||||
expect(backform.Dialog).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('disables the button "submit button" until a filename is selected', () => {
|
||||
backupDialogWrapper.prepare();
|
||||
expect(backupDialogWrapper.__internal.buttons[3].element.disabled).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
context('tree element is selected', () => {
|
||||
let treeHierarchyInformation;
|
||||
let dialogSpy;
|
||||
|
||||
beforeEach(() => {
|
||||
treeHierarchyInformation = {
|
||||
server: {
|
||||
_type: 'server',
|
||||
_id: 10,
|
||||
priority: 0,
|
||||
label: 'some-tree-label',
|
||||
},
|
||||
};
|
||||
pgBrowser.tree.selectNode(serverTreeNode.domNode);
|
||||
pgBrowser.Nodes['server'].getTreeNodeHierarchy.and
|
||||
.returnValue(treeHierarchyInformation);
|
||||
dialogSpy = jasmine.createSpyObj('newView', ['render']);
|
||||
dialogSpy.$el = jasmine.createSpyObj('$el', ['find', 'attr']);
|
||||
dialogSpy.model = jasmine.createSpyObj('model', ['on']);
|
||||
dialogSpy.$el.find.and.returnValue([]);
|
||||
|
||||
backform.Dialog.and.returnValue(dialogSpy);
|
||||
});
|
||||
|
||||
it('creates a backform dialog and displays it', () => {
|
||||
backupDialogWrapper.prepare();
|
||||
expect(backform.Dialog).toHaveBeenCalledWith({
|
||||
el: backupJQueryContainerSpy,
|
||||
model: generatedBackupModel,
|
||||
schema: viewSchema,
|
||||
});
|
||||
|
||||
expect(dialogSpy.render).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
|
||||
it('add alertify classes to restore node childnode', () => {
|
||||
backupDialogWrapper.prepare();
|
||||
expect(backupNodeChildNodeSpy.addClass)
|
||||
.toHaveBeenCalledWith('alertify_tools_dialog_properties obj_properties');
|
||||
});
|
||||
|
||||
it('disables the button submit button until a filename is selected', () => {
|
||||
backupDialogWrapper.prepare();
|
||||
expect(backupNode.__internal.buttons[3].element.disabled).toBe(true);
|
||||
});
|
||||
|
||||
it('generates a new backup model', () => {
|
||||
backupDialogWrapper.prepare();
|
||||
expect(dialogModelKlassSpy).toHaveBeenCalledWith(
|
||||
{type: 'backup'},
|
||||
{node_info: treeHierarchyInformation}
|
||||
);
|
||||
});
|
||||
|
||||
it('add the new dialog to the backup node HTML', () => {
|
||||
backupDialogWrapper.prepare();
|
||||
expect(backupNode.elements.content.appendChild).toHaveBeenCalledWith(backupJQueryContainerSpy);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('onButtonClicked', () => {
|
||||
let networkMock;
|
||||
beforeEach(() => {
|
||||
networkMock = new MockAdapter(axios);
|
||||
backupDialogWrapper = new BackupDialogWrapper(
|
||||
'<div class=\'backup_dialog\'></div>',
|
||||
'backupDialogTitle',
|
||||
'backup',
|
||||
jquerySpy,
|
||||
pgBrowser,
|
||||
alertifySpy,
|
||||
dialogModelKlassSpy,
|
||||
backform
|
||||
);
|
||||
|
||||
backupDialogWrapper = Object.assign(backupDialogWrapper, backupNode);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
networkMock.restore();
|
||||
});
|
||||
|
||||
context('dialog help button was pressed', () => {
|
||||
let networkCalled;
|
||||
beforeEach(() => {
|
||||
networkCalled = false;
|
||||
networkMock.onAny(/.*/).reply(() => {
|
||||
networkCalled = true;
|
||||
return [200, {}];
|
||||
});
|
||||
pgBrowser.tree.selectNode(serverTreeNode.domNode);
|
||||
pgBrowser.showHelp = jasmine.createSpy('showHelp');
|
||||
|
||||
const event = {
|
||||
button: {
|
||||
element: {
|
||||
name: 'dialog_help',
|
||||
getAttribute: (attributeName) => {
|
||||
if (attributeName === 'url') {
|
||||
return 'http://someurl';
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
backupDialogWrapper.callback(event);
|
||||
});
|
||||
|
||||
it('displays help for dialog', () => {
|
||||
expect(pgBrowser.showHelp).toHaveBeenCalledWith(
|
||||
'dialog_help',
|
||||
'http://someurl',
|
||||
pgBrowser.Nodes['server'],
|
||||
serverTreeNode.getHtmlIdentifier()
|
||||
);
|
||||
});
|
||||
|
||||
it('does not start the backup', () => {
|
||||
expect(networkCalled).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
context('object help button was pressed', () => {
|
||||
let networkCalled;
|
||||
beforeEach(() => {
|
||||
networkCalled = false;
|
||||
networkMock.onAny(/.*/).reply(() => {
|
||||
networkCalled = true;
|
||||
return [200, {}];
|
||||
});
|
||||
pgBrowser.tree.selectNode(serverTreeNode.domNode);
|
||||
pgBrowser.showHelp = jasmine.createSpy('showHelp');
|
||||
|
||||
const event = {
|
||||
button: {
|
||||
element: {
|
||||
name: 'object_help',
|
||||
getAttribute: (attributeName) => {
|
||||
if (attributeName === 'url') {
|
||||
return 'http://someurl';
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
backupDialogWrapper.callback(event);
|
||||
});
|
||||
|
||||
it('displays help for dialog', () => {
|
||||
expect(pgBrowser.showHelp).toHaveBeenCalledWith(
|
||||
'object_help',
|
||||
'http://someurl',
|
||||
pgBrowser.Nodes['server'],
|
||||
serverTreeNode.getHtmlIdentifier()
|
||||
);
|
||||
});
|
||||
|
||||
it('does not start the backup', () => {
|
||||
expect(networkCalled).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
context('backup button was pressed', () => {
|
||||
context('no tree node is selected', () => {
|
||||
it('does not start the backup', () => {
|
||||
let networkCalled = false;
|
||||
networkMock.onAny(/.*/).reply(() => {
|
||||
networkCalled = true;
|
||||
return [200, {}];
|
||||
});
|
||||
|
||||
let event = {
|
||||
button: {
|
||||
'data-btn-name': 'backup',
|
||||
element: {
|
||||
getAttribute: () => {
|
||||
return 'http://someurl';
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
backupDialogWrapper.callback(event);
|
||||
expect(networkCalled).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
context('tree node has no data', () => {
|
||||
it('does not start the backup', () => {
|
||||
pgBrowser.tree.selectNode(noDataNode.domNode);
|
||||
|
||||
let networkCalled = false;
|
||||
networkMock.onAny(/.*/).reply(() => {
|
||||
networkCalled = true;
|
||||
return [200, {}];
|
||||
});
|
||||
|
||||
let event = {
|
||||
button: {
|
||||
'data-btn-name': 'backup',
|
||||
element: {
|
||||
getAttribute: () => {
|
||||
return 'http://someurl';
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
backupDialogWrapper.callback(event);
|
||||
expect(networkCalled).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
context('tree node has data', () => {
|
||||
context('when dialog type is global', () => {
|
||||
let event;
|
||||
beforeEach(() => {
|
||||
pgBrowser.tree.selectNode(serverTreeNode.domNode);
|
||||
|
||||
backupDialogWrapper.view = {
|
||||
model: new FakeModel(),
|
||||
};
|
||||
|
||||
event = {
|
||||
button: {
|
||||
'data-btn-name': 'backup',
|
||||
element: {
|
||||
getAttribute: () => {
|
||||
return 'http://someurl';
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
context('when the backup job is created successfully', () => {
|
||||
let dataSentToServer;
|
||||
beforeEach(() => {
|
||||
pgBrowser.Events = jasmine.createSpyObj('Events', ['trigger']);
|
||||
alertifySpy.success = jasmine.createSpy('success');
|
||||
networkMock.onPost('/backup/job/10').reply((request) => {
|
||||
dataSentToServer = request.data;
|
||||
return [200, {'success': 1}];
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
it('creates a success alert box', (done) => {
|
||||
backupDialogWrapper.callback(event);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy.success).toHaveBeenCalledWith(
|
||||
'Backup job created.',
|
||||
5
|
||||
);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
|
||||
it('trigger an event to background process', (done) => {
|
||||
backupDialogWrapper.callback(event);
|
||||
|
||||
setTimeout(() => {
|
||||
expect(pgBrowser.Events.trigger).toHaveBeenCalledWith(
|
||||
'pgadmin-bgprocess:created',
|
||||
backupDialogWrapper
|
||||
);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
|
||||
it('send the correct paramenters to the backend', (done) => {
|
||||
backupDialogWrapper.callback(event);
|
||||
setTimeout(() => {
|
||||
expect(JSON.parse(dataSentToServer)).toEqual(
|
||||
{}
|
||||
);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
});
|
||||
|
||||
context('when creating backup job fails', () => {
|
||||
it('creates an alert box', (done) => {
|
||||
alertifySpy.alert = jasmine.createSpy('alert');
|
||||
networkMock.onPost('/backup/job/10').reply(() => {
|
||||
return [400, {
|
||||
errormsg: 'some-error-message',
|
||||
}];
|
||||
});
|
||||
|
||||
backupDialogWrapper.callback(event);
|
||||
setTimeout( () => {
|
||||
expect(alertifySpy.alert).toHaveBeenCalledWith(
|
||||
'Backup job failed.',
|
||||
'some-error-message'
|
||||
);
|
||||
done();
|
||||
}, 0);
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('when dialog type is object', () => {
|
||||
let event;
|
||||
beforeEach(() => {
|
||||
backupDialogWrapper = new BackupDialogWrapper(
|
||||
'<div class=\'backup_dialog\'></div>',
|
||||
'backupDialogTitle',
|
||||
'backup_objects',
|
||||
jquerySpy,
|
||||
pgBrowser,
|
||||
alertifySpy,
|
||||
dialogModelKlassSpy,
|
||||
backform
|
||||
);
|
||||
|
||||
pgBrowser.tree.selectNode(databaseTreeNode.domNode);
|
||||
|
||||
backupDialogWrapper.view = {
|
||||
model: new FakeModel(),
|
||||
};
|
||||
|
||||
event = {
|
||||
button: {
|
||||
'data-btn-name': 'backup',
|
||||
element: {
|
||||
getAttribute: () => {
|
||||
return 'http://someurl';
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
context('when the backup job is created successfully', () => {
|
||||
let dataSentToServer;
|
||||
beforeEach(() => {
|
||||
pgBrowser.Events = jasmine.createSpyObj('Events', ['trigger']);
|
||||
alertifySpy.success = jasmine.createSpy('success');
|
||||
|
||||
networkMock.onPost('/backup/job/10/object').reply((request) => {
|
||||
dataSentToServer = request.data;
|
||||
return [200, {'success': 1}];
|
||||
});
|
||||
});
|
||||
|
||||
it('creates a success alert box', (done) => {
|
||||
backupDialogWrapper.callback(event);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy.success).toHaveBeenCalledWith(
|
||||
'Backup job created.',
|
||||
5
|
||||
);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
|
||||
it('trigger an event to background process', (done) => {
|
||||
backupDialogWrapper.callback(event);
|
||||
|
||||
setTimeout(() => {
|
||||
expect(pgBrowser.Events.trigger).toHaveBeenCalledWith(
|
||||
'pgadmin-bgprocess:created',
|
||||
backupDialogWrapper
|
||||
);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
|
||||
it('send the correct parameters to the backend', (done) => {
|
||||
backupDialogWrapper.callback(event);
|
||||
setTimeout(() => {
|
||||
expect(JSON.parse(dataSentToServer)).toEqual(
|
||||
{database: 'some-database-label'}
|
||||
);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
});
|
||||
|
||||
context('when creating backup job fails', () => {
|
||||
it('creates an alert box', (done) => {
|
||||
alertifySpy.alert = jasmine.createSpy('alert');
|
||||
networkMock.onPost('/backup/job/10/object').reply(() => {
|
||||
return [400, {
|
||||
errormsg: 'some-error-message',
|
||||
}];
|
||||
});
|
||||
|
||||
backupDialogWrapper.callback(event);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy.alert).toHaveBeenCalledWith(
|
||||
'Backup job failed.',
|
||||
'some-error-message'
|
||||
);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
xdescribe('#setExtraParameters', () => {
|
||||
let selectedTreeNode;
|
||||
let treeInfo;
|
||||
let model;
|
||||
|
||||
context('when dialog type is global', () => {
|
||||
beforeEach(() => {
|
||||
backupDialogWrapper = new BackupDialogWrapper(
|
||||
'<div class=\'backup_dialog\'></div>',
|
||||
'backupDialogTitle',
|
||||
'backup',
|
||||
jquerySpy,
|
||||
pgBrowser,
|
||||
alertifySpy,
|
||||
dialogModelKlassSpy,
|
||||
backform
|
||||
);
|
||||
|
||||
treeInfo = {};
|
||||
model = new FakeModel();
|
||||
backupDialogWrapper.view = {
|
||||
model: model,
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
it('sets nothing on the view model', () => {
|
||||
backupDialogWrapper.setExtraParameters(selectedTreeNode, treeInfo);
|
||||
expect(model.toJSON()).toEqual({});
|
||||
});
|
||||
});
|
||||
|
||||
context('when dialog type is object', () => {
|
||||
beforeEach(() => {
|
||||
backupDialogWrapper = new BackupDialogWrapper(
|
||||
'<div class=\'backup_dialog\'></div>',
|
||||
'backupDialogTitle',
|
||||
'backup_objects',
|
||||
jquerySpy,
|
||||
pgBrowser,
|
||||
alertifySpy,
|
||||
dialogModelKlassSpy,
|
||||
backform
|
||||
);
|
||||
|
||||
treeInfo = {
|
||||
database: {
|
||||
_label: 'some-database-label',
|
||||
},
|
||||
schema: {
|
||||
_label: 'some-treeinfo-label',
|
||||
},
|
||||
};
|
||||
|
||||
model = new FakeModel();
|
||||
selectedTreeNode = new TreeNode('some-selected-node',
|
||||
{_type: 'some-type', _label: 'some-selected-label'},
|
||||
[]);
|
||||
backupDialogWrapper.view = {
|
||||
model: model,
|
||||
};
|
||||
});
|
||||
|
||||
it('sets the database label on the model', () => {
|
||||
backupDialogWrapper.setExtraParameters(selectedTreeNode, treeInfo);
|
||||
expect(model.toJSON()).toEqual({
|
||||
'database': 'some-database-label',
|
||||
});
|
||||
});
|
||||
|
||||
context('when the selected is a schema type', () => {
|
||||
beforeEach(() => {
|
||||
selectedTreeNode = new TreeNode('some-selected-node',
|
||||
{_type: 'schema', _label: 'some-schema-label'},
|
||||
[]);
|
||||
});
|
||||
|
||||
it('sets the schema label on the model', () => {
|
||||
backupDialogWrapper.setExtraParameters(selectedTreeNode, treeInfo);
|
||||
expect(model.toJSON()).toEqual({
|
||||
'database': 'some-database-label',
|
||||
'schemas': ['some-schema-label'],
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('when the selected is a table type', () => {
|
||||
beforeEach(() => {
|
||||
selectedTreeNode = new TreeNode('some-selected-node',
|
||||
{_type: 'table', _label: 'some-table-label'},
|
||||
[]);
|
||||
});
|
||||
|
||||
it('sets the schema label on the model', () => {
|
||||
backupDialogWrapper.setExtraParameters(selectedTreeNode, treeInfo);
|
||||
expect(model.toJSON()).toEqual({
|
||||
'database': 'some-database-label',
|
||||
'tables': [['some-treeinfo-label', 'some-table-label']],
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('when the model has no ratio value', () => {
|
||||
beforeEach(() => {
|
||||
model.set('ratio', '');
|
||||
});
|
||||
|
||||
it('sets clears the ratio value', () => {
|
||||
backupDialogWrapper.setExtraParameters(selectedTreeNode, treeInfo);
|
||||
expect(model.get('ratio')).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
context('when the model has a valid ratio value', () => {
|
||||
beforeEach(() => {
|
||||
model.set('ratio', '0.25');
|
||||
});
|
||||
|
||||
it('sets clears the ratio value', () => {
|
||||
backupDialogWrapper.setExtraParameters(selectedTreeNode, treeInfo);
|
||||
expect(model.get('ratio')).toEqual('0.25');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,298 +0,0 @@
|
||||
/////////////////////////////////////////////////////////////
|
||||
//
|
||||
// pgAdmin 4 - PostgreSQL Tools
|
||||
//
|
||||
// Copyright (C) 2013 - 2021, The pgAdmin Development Team
|
||||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
import {BackupDialog} from '../../../pgadmin/tools/backup/static/js/backup_dialog';
|
||||
import {TreeFake} from '../tree/tree_fake';
|
||||
import MockAdapter from 'axios-mock-adapter';
|
||||
import axios from 'axios/index';
|
||||
|
||||
const context = describe;
|
||||
|
||||
describe('GlobalServerBackupDialog', () => {
|
||||
let backupDialog;
|
||||
let pgBrowser;
|
||||
let jquerySpy;
|
||||
let alertifySpy;
|
||||
let backupModelSpy;
|
||||
|
||||
let rootNode;
|
||||
let serverTreeNode, serverTreeNodeWrongPath;
|
||||
let ppasServerTreeNode, ppasServerTreeNodeWrongPath;
|
||||
|
||||
beforeEach(() => {
|
||||
pgBrowser = {
|
||||
Nodes: {
|
||||
server: jasmine.createSpyObj('Node[server]', ['getTreeNodeHierarchy']),
|
||||
},
|
||||
stdW: {
|
||||
sm: 500,
|
||||
md: 700,
|
||||
lg: 900,
|
||||
default: 500,
|
||||
},
|
||||
stdH: {
|
||||
sm: 200,
|
||||
md: 400,
|
||||
lg: 550,
|
||||
default: 550,
|
||||
},
|
||||
};
|
||||
pgBrowser.tree = new TreeFake(pgBrowser);
|
||||
pgBrowser.Nodes.server.hasId = true;
|
||||
jquerySpy = jasmine.createSpy('jquerySpy');
|
||||
backupModelSpy = jasmine.createSpy('backupModelSpy');
|
||||
|
||||
rootNode = pgBrowser.tree.addNewNode('level1', {}, undefined, []);
|
||||
serverTreeNode = pgBrowser.tree.addNewNode('level1.1', {
|
||||
_type: 'server',
|
||||
_id: 10,
|
||||
server_type: 'pg',
|
||||
version: 100000,
|
||||
}, undefined, ['level1']);
|
||||
serverTreeNodeWrongPath = pgBrowser.tree.addNewNode('level1.2', {
|
||||
_type: 'server',
|
||||
_id: 11,
|
||||
server_type: 'pg',
|
||||
version: 90600,
|
||||
}, undefined, ['level1']);
|
||||
ppasServerTreeNode = pgBrowser.tree.addNewNode('level1.3', {
|
||||
_type: 'server',
|
||||
server_type: 'ppas',
|
||||
version: 130000,
|
||||
}, undefined, ['level1']);
|
||||
ppasServerTreeNodeWrongPath = pgBrowser.tree.addNewNode('level1.4', {
|
||||
_type: 'server',
|
||||
server_type: 'ppas',
|
||||
version: 90600,
|
||||
}, undefined, ['level1']);
|
||||
pgBrowser.tree.addNewNode('level3', {}, undefined, ['level1', 'level1.2', 'level1.3', 'level1.4']);
|
||||
pgBrowser.tree.addNewNode('level3.1', undefined, undefined, ['level1', 'level1.2', 'level3']);
|
||||
});
|
||||
|
||||
describe('#draw', () => {
|
||||
let networkMock;
|
||||
beforeEach(() => {
|
||||
networkMock = new MockAdapter(axios);
|
||||
alertifySpy = jasmine.createSpyObj('alertify', ['alert', 'dialog']);
|
||||
alertifySpy['BackupDialog_globals'] = jasmine.createSpy('BackupDialog_globals');
|
||||
alertifySpy['BackupDialog_server'] = jasmine.createSpy('BackupDialog_server');
|
||||
backupDialog = new BackupDialog(
|
||||
pgBrowser,
|
||||
jquerySpy,
|
||||
alertifySpy,
|
||||
backupModelSpy
|
||||
);
|
||||
|
||||
pgBrowser.get_preference = jasmine.createSpy('get_preferences');
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
networkMock.restore();
|
||||
});
|
||||
|
||||
context('there are no ancestors of the type server', () => {
|
||||
it('does not create a dialog', () => {
|
||||
pgBrowser.tree.selectNode([{id: 'level1'}]);
|
||||
backupDialog.draw(null, null, null);
|
||||
expect(alertifySpy['BackupDialog_globals']).not.toHaveBeenCalled();
|
||||
expect(alertifySpy['BackupDialog_server']).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('display an alert with a Backup Error', () => {
|
||||
backupDialog.draw(null, [rootNode], null);
|
||||
expect(alertifySpy.alert).toHaveBeenCalledWith(
|
||||
'Backup Error',
|
||||
'Please select server or child node from the browser tree.'
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
context('there is an ancestor of the type server', () => {
|
||||
context('no preference can be found', () => {
|
||||
beforeEach(() => {
|
||||
pgBrowser.get_preference.and.returnValue(undefined);
|
||||
});
|
||||
|
||||
context('server is a PostgreSQL server', () => {
|
||||
it('display an alert with "Preferences Error"', () => {
|
||||
backupDialog.draw(null, [serverTreeNode], null);
|
||||
expect(alertifySpy.alert).toHaveBeenCalledWith(
|
||||
'Preferences Error',
|
||||
'Failed to load preference pg_bin_dir of module paths'
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
context('server is a EPAS server', () => {
|
||||
it('display an alert with "Preferences Error"', () => {
|
||||
backupDialog.draw(null, [ppasServerTreeNode], null);
|
||||
expect(alertifySpy.alert).toHaveBeenCalledWith(
|
||||
'Preferences Error',
|
||||
'Failed to load preference ppas_bin_dir of module paths'
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('preference can be found for PostgreSQL Server', () => {
|
||||
context('binary folder is not configured', () => {
|
||||
beforeEach(() => {
|
||||
pgBrowser.get_preference.and.returnValue({value: '[{\"serverType\":\"PostgreSQL 9.6\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"90600\",\"next_major_version\":\"100000\"},{\"serverType\":\"PostgreSQL 10\",\"binaryPath\":\"/Library/PostgreSQL/10/bin\",\"isDefault\":false,\"version\":\"100000\",\"next_major_version\":\"110000\"},{\"serverType\":\"PostgreSQL 11\",\"binaryPath\":\"/Library/PostgreSQL/11/bin\",\"isDefault\":false,\"version\":\"110000\",\"next_major_version\":\"120000\"},{\"serverType\":\"PostgreSQL 12\",\"binaryPath\":\"/Library/PostgreSQL/12/bin\",\"isDefault\":false,\"version\":\"120000\",\"next_major_version\":\"130000\"},{\"serverType\":\"PostgreSQL 13\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"130000\",\"next_major_version\":\"140000\"}]'});
|
||||
});
|
||||
|
||||
context('server is a PostgreSQL server', () => {
|
||||
it('display an alert with "Configuration required"', () => {
|
||||
backupDialog.draw(null, [serverTreeNodeWrongPath], null);
|
||||
expect(alertifySpy.alert).toHaveBeenCalledWith(
|
||||
'Configuration required',
|
||||
'Please configure the PostgreSQL Binary Path in the Preferences dialog.'
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('binary folder is configured', () => {
|
||||
let globalResizeToSpy;
|
||||
let serverResizeToSpy;
|
||||
beforeEach(() => {
|
||||
globalResizeToSpy = jasmine.createSpyObj('globals', ['resizeTo']);
|
||||
alertifySpy['BackupDialog_globals'].and
|
||||
.returnValue(globalResizeToSpy);
|
||||
serverResizeToSpy = jasmine.createSpyObj('server', ['resizeTo']);
|
||||
alertifySpy['BackupDialog_server'].and
|
||||
.returnValue(serverResizeToSpy);
|
||||
pgBrowser.get_preference.and.returnValue({value: '[{\"serverType\":\"PostgreSQL 9.6\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"90600\",\"next_major_version\":\"100000\"},{\"serverType\":\"PostgreSQL 10\",\"binaryPath\":\"/Library/PostgreSQL/10/bin\",\"isDefault\":true,\"version\":\"100000\",\"next_major_version\":\"110000\"},{\"serverType\":\"PostgreSQL 11\",\"binaryPath\":\"/Library/PostgreSQL/11/bin\",\"isDefault\":false,\"version\":\"110000\",\"next_major_version\":\"120000\"},{\"serverType\":\"PostgreSQL 12\",\"binaryPath\":\"/Library/PostgreSQL/12/bin\",\"isDefault\":false,\"version\":\"120000\",\"next_major_version\":\"130000\"},{\"serverType\":\"PostgreSQL 13\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"130000\",\"next_major_version\":\"140000\"}]'});
|
||||
spyOn(backupDialog, 'url_for_utility_exists').and.returnValue('/backup/utility_exists/10/servers');
|
||||
networkMock.onGet('/backup/utility_exists/10/servers').reply(200, {'success': 1});
|
||||
});
|
||||
|
||||
context('dialog for global backup ', () => {
|
||||
it('displays the dialog when binary path is for correct server version', (done) => {
|
||||
backupDialog.draw(null, [serverTreeNode], {globals: true}, pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy['BackupDialog_globals']).toHaveBeenCalledWith(true);
|
||||
expect(globalResizeToSpy.resizeTo).toHaveBeenCalledWith(pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
});
|
||||
|
||||
context('dialog for server backup', () => {
|
||||
it('displays the dialog when binary path is for correct server version', (done) => {
|
||||
backupDialog.draw(null, [serverTreeNode], {server: true}, pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy['BackupDialog_server']).toHaveBeenCalledWith(true);
|
||||
expect(serverResizeToSpy.resizeTo).toHaveBeenCalledWith(pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
});
|
||||
|
||||
context('dialog for global backup ', () => {
|
||||
it('displays the dialog when default binary path is specified', (done) => {
|
||||
backupDialog.draw(null, [serverTreeNodeWrongPath], {globals: true}, pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy['BackupDialog_globals']).toHaveBeenCalledWith(true);
|
||||
expect(globalResizeToSpy.resizeTo).toHaveBeenCalledWith(pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
});
|
||||
|
||||
context('dialog for server backup', () => {
|
||||
it('displays the dialog when default binary path is specified', (done) => {
|
||||
backupDialog.draw(null, [serverTreeNodeWrongPath], {server: true}, pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy['BackupDialog_server']).toHaveBeenCalledWith(true);
|
||||
expect(serverResizeToSpy.resizeTo).toHaveBeenCalledWith(pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
context('preference can be found for EPAS Server', () => {
|
||||
context('binary folder is not configured', () => {
|
||||
beforeEach(() => {
|
||||
pgBrowser.get_preference.and.returnValue({value: '[{\"serverType\":\"EDB Advanced Server 9.6\",\"binaryPath\":\"\",\"isDefault\":false,\"version\":\"90600\",\"next_major_version\":\"100000\"},{\"serverType\":\"EDB Advanced Server 10\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"100000\",\"next_major_version\":\"110000\"},{\"serverType\":\"EDB Advanced Server 11\",\"binaryPath\":\"/Library/EPAS/11/bin/\",\"isDefault\":false,\"version\":\"110000\",\"next_major_version\":\"120000\"},{\"serverType\":\"EDB Advanced Server 12\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"120000\",\"next_major_version\":\"130000\"},{\"serverType\":\"EDB Advanced Server 13\",\"binaryPath\":\"/Library/EPAS/13/bin/\",\"isDefault\":false,\"version\":\"130000\",\"next_major_version\":\"140000\"}]'});
|
||||
});
|
||||
|
||||
context('server is a EPAS server', () => {
|
||||
it('display an alert with "Configuration required"', () => {
|
||||
backupDialog.draw(null, [ppasServerTreeNodeWrongPath], null);
|
||||
expect(alertifySpy.alert).toHaveBeenCalledWith(
|
||||
'Configuration required',
|
||||
'Please configure the EDB Advanced Server Binary Path in the Preferences dialog.'
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('binary folder is configured', () => {
|
||||
let globalResizeToSpy;
|
||||
let serverResizeToSpy;
|
||||
beforeEach(() => {
|
||||
globalResizeToSpy = jasmine.createSpyObj('globals', ['resizeTo']);
|
||||
alertifySpy['BackupDialog_globals'].and
|
||||
.returnValue(globalResizeToSpy);
|
||||
serverResizeToSpy = jasmine.createSpyObj('server', ['resizeTo']);
|
||||
alertifySpy['BackupDialog_server'].and
|
||||
.returnValue(serverResizeToSpy);
|
||||
pgBrowser.get_preference.and.returnValue({value: '[{\"serverType\":\"EDB Advanced Server 9.6\",\"binaryPath\":\"\",\"isDefault\":false,\"version\":\"90600\",\"next_major_version\":\"100000\"},{\"serverType\":\"EDB Advanced Server 10\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"100000\",\"next_major_version\":\"110000\"},{\"serverType\":\"EDB Advanced Server 11\",\"binaryPath\":\"/Library/EPAS/11/bin/\",\"isDefault\":false,\"version\":\"110000\",\"next_major_version\":\"120000\"},{\"serverType\":\"EDB Advanced Server 12\",\"binaryPath\":null,\"isDefault\":false,\"version\":\"120000\",\"next_major_version\":\"130000\"},{\"serverType\":\"EDB Advanced Server 13\",\"binaryPath\":\"/Library/EPAS/13/bin/\",\"isDefault\":true,\"version\":\"130000\",\"next_major_version\":\"140000\"}]'});
|
||||
spyOn(backupDialog, 'url_for_utility_exists').and.returnValue('/backup/utility_exists/10/servers');
|
||||
networkMock.onGet('/backup/utility_exists/10/servers').reply(200, {'success': 1});
|
||||
});
|
||||
|
||||
context('dialog for global backup ', () => {
|
||||
it('displays the dialog when binary path is for correct server version', (done) => {
|
||||
backupDialog.draw(null, [ppasServerTreeNode], {globals: true}, pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy['BackupDialog_globals']).toHaveBeenCalledWith(true);
|
||||
expect(globalResizeToSpy.resizeTo).toHaveBeenCalledWith(pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
});
|
||||
|
||||
context('dialog for server backup', () => {
|
||||
it('displays the dialog when binary path is for correct server version', (done) => {
|
||||
backupDialog.draw(null, [ppasServerTreeNode], {server: true}, pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy['BackupDialog_server']).toHaveBeenCalledWith(true);
|
||||
expect(serverResizeToSpy.resizeTo).toHaveBeenCalledWith(pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
});
|
||||
|
||||
context('dialog for global backup ', () => {
|
||||
it('displays the dialog when default binary path is specified', (done) => {
|
||||
backupDialog.draw(null, [ppasServerTreeNodeWrongPath], {globals: true}, pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy['BackupDialog_globals']).toHaveBeenCalledWith(true);
|
||||
expect(globalResizeToSpy.resizeTo).toHaveBeenCalledWith(pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
});
|
||||
|
||||
context('dialog for server backup', () => {
|
||||
it('displays the dialog when default binary path is specified', (done) => {
|
||||
backupDialog.draw(null, [ppasServerTreeNodeWrongPath], {server: true}, pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
setTimeout(() => {
|
||||
expect(alertifySpy['BackupDialog_server']).toHaveBeenCalledWith(true);
|
||||
expect(serverResizeToSpy.resizeTo).toHaveBeenCalledWith(pgBrowser.stdW.md, pgBrowser.stdH.md);
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
96
web/regression/javascript/schema_ui_files/backup.ui.spec.js
Normal file
96
web/regression/javascript/schema_ui_files/backup.ui.spec.js
Normal file
@@ -0,0 +1,96 @@
|
||||
/////////////////////////////////////////////////////////////
|
||||
//
|
||||
// pgAdmin 4 - PostgreSQL Tools
|
||||
//
|
||||
// Copyright (C) 2013 - 2021, The pgAdmin Development Team
|
||||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
import '../helper/enzyme.helper';
|
||||
import { createMount } from '@material-ui/core/test-utils';
|
||||
import pgAdmin from 'sources/pgadmin';
|
||||
import SchemaView from '../../../pgadmin/static/js/SchemaView';
|
||||
import BackupSchema, {getSectionSchema, getTypeObjSchema, getSaveOptSchema, getQueryOptionSchema, getDisabledOptionSchema, getMiscellaneousSchema} from '../../../pgadmin/tools/backup/static/js/backup.ui';
|
||||
|
||||
|
||||
describe('BackupSchema', ()=>{
|
||||
let mount;
|
||||
beforeAll(()=>{
|
||||
mount = createMount();
|
||||
});
|
||||
|
||||
afterAll(() => {
|
||||
mount.cleanUp();
|
||||
});
|
||||
let backupSchemaObj = new BackupSchema(
|
||||
()=> getSectionSchema(),
|
||||
()=> getTypeObjSchema(),
|
||||
()=> getSaveOptSchema({nodeInfo: {server: {version: 11000}}}),
|
||||
()=> getQueryOptionSchema({nodeInfo: {server: {version: 11000}}}),
|
||||
()=> getDisabledOptionSchema({nodeInfo: {server: {version: 11000}}}),
|
||||
()=> getMiscellaneousSchema({nodeInfo: {server: {version: 11000}}}),
|
||||
{
|
||||
role: ()=>[],
|
||||
encoding: ()=>[],
|
||||
},
|
||||
{server: {version: 11000}},
|
||||
pgAdmin.pgBrowser,
|
||||
'backup_objects'
|
||||
);
|
||||
|
||||
it('create object backup', ()=>{
|
||||
mount(<SchemaView
|
||||
formType='dialog'
|
||||
schema={backupSchemaObj}
|
||||
viewHelperProps={{
|
||||
mode: 'create',
|
||||
}}
|
||||
onSave={()=>{}}
|
||||
onClose={()=>{}}
|
||||
onHelp={()=>{}}
|
||||
onDataChange={()=>{}}
|
||||
confirmOnCloseReset={false}
|
||||
hasSQL={false}
|
||||
disableSqlHelp={false}
|
||||
disableDialogHelp={false}
|
||||
/>);
|
||||
});
|
||||
|
||||
|
||||
let backupServerSchemaObj = new BackupSchema(
|
||||
()=> getSectionSchema(),
|
||||
()=> getTypeObjSchema(),
|
||||
()=> getSaveOptSchema({nodeInfo: {server: {version: 11000}}}),
|
||||
()=> getQueryOptionSchema({nodeInfo: {server: {version: 11000}}}),
|
||||
()=> getDisabledOptionSchema({nodeInfo: {server: {version: 11000}}}),
|
||||
()=> getMiscellaneousSchema({nodeInfo: {server: {version: 11000}}}),
|
||||
{
|
||||
role: ()=>[],
|
||||
encoding: ()=>[],
|
||||
},
|
||||
{server: {version: 11000}},
|
||||
{serverInfo: {}},
|
||||
'server'
|
||||
);
|
||||
|
||||
it('create server backup', ()=>{
|
||||
mount(<SchemaView
|
||||
formType='dialog'
|
||||
schema={backupServerSchemaObj}
|
||||
viewHelperProps={{
|
||||
mode: 'create',
|
||||
}}
|
||||
onSave={()=>{}}
|
||||
onClose={()=>{}}
|
||||
onHelp={()=>{}}
|
||||
onDataChange={()=>{}}
|
||||
confirmOnCloseReset={false}
|
||||
hasSQL={false}
|
||||
disableSqlHelp={false}
|
||||
disableDialogHelp={false}
|
||||
/>);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
/////////////////////////////////////////////////////////////
|
||||
//
|
||||
// pgAdmin 4 - PostgreSQL Tools
|
||||
//
|
||||
// Copyright (C) 2013 - 2021, The pgAdmin Development Team
|
||||
// This software is released under the PostgreSQL Licence
|
||||
//
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
import React from 'react';
|
||||
import '../helper/enzyme.helper';
|
||||
import { createMount } from '@material-ui/core/test-utils';
|
||||
import SchemaView from '../../../pgadmin/static/js/SchemaView';
|
||||
import BackupGlobalSchema, {getMiscellaneousSchema} from '../../../pgadmin/tools/backup/static/js/backupGlobal.ui';
|
||||
|
||||
|
||||
describe('BackupGlobalSchema', ()=>{
|
||||
let mount;
|
||||
beforeAll(()=>{
|
||||
mount = createMount();
|
||||
});
|
||||
|
||||
afterAll(() => {
|
||||
mount.cleanUp();
|
||||
});
|
||||
let backupGlobalSchemaObj = new BackupGlobalSchema(
|
||||
()=> getMiscellaneousSchema(),
|
||||
{
|
||||
role: ()=>[],
|
||||
}
|
||||
);
|
||||
|
||||
it('create', ()=>{
|
||||
mount(<SchemaView
|
||||
formType='dialog'
|
||||
schema={backupGlobalSchemaObj}
|
||||
viewHelperProps={{
|
||||
mode: 'create',
|
||||
}}
|
||||
onSave={()=>{}}
|
||||
onClose={()=>{}}
|
||||
onHelp={()=>{}}
|
||||
onDataChange={()=>{}}
|
||||
confirmOnCloseReset={false}
|
||||
hasSQL={false}
|
||||
disableSqlHelp={false}
|
||||
disableDialogHelp={false}
|
||||
/>);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user