blob: d05673ebc277124d1ba671895ff247a1d321c051 [file] [log] [blame]
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
const helpers = require('../../../../../test/nightwatch_tests/helpers/helpers.js');
const newDatabaseName1 = 'fauxton-selenium-tests-replication1';
const newDatabaseName2 = 'fauxton-selenium-tests-replication2';
const replicatedDBName = 'replicated-db';
const docName1 = 'doc-name1';
const docName2 = 'doc-name2';
const destroyDBsAndCreateReplicator = (client, done) => {
var nano = helpers.getNanoInstance(client.options.db_url);
nano.db.destroy(newDatabaseName1, () => {
nano.db.destroy(newDatabaseName2, () => {
nano.db.destroy(replicatedDBName, () => {
nano.db.create('_replicator', function () {
done();
});
});
});
});
};
module.exports = {
before: destroyDBsAndCreateReplicator,
'Replicates existing local db to new local db' : function (client) {
const waitTime = client.globals.maxWaitTime;
const baseUrl = client.options.launch_url;
const password = client.options.password;
client
.createDatabase(newDatabaseName1)
.checkForDatabaseCreated(newDatabaseName1, waitTime)
.createDocument(docName1, newDatabaseName1)
.loginToGUI()
.url(baseUrl + '/#/replication/_create')
.waitForElementVisible('button#replicate', waitTime, true)
.waitForElementVisible('#replication-source', waitTime, true)
// select LOCAL as the source
.clickWhenVisible('#replication-source')
.keys(['\uE015', '\uE006'])
.waitForElementVisible('.replication__input-react-select', waitTime, true)
// enter our source DB
.setValue('.replication__input-react-select .Select-input input', [newDatabaseName1, client.Keys.ENTER])
// select source USER/PASSWORD authentication
.clickWhenVisible('#select-replication-source-auth')
.keys(['\uE015', '\uE006'])
.waitForElementVisible('#replication-source-auth-username', waitTime, true)
// enter source username/password
.setValue('#replication-source-auth-password', [password, client.Keys.ENTER])
// enter a new target name
.waitForElementVisible('#replication-target', waitTime, true)
.clickWhenVisible('option[value="REPLICATION_TARGET_NEW_LOCAL_DATABASE"]')
.setValue('.replication__new-input', replicatedDBName)
// select target USER/PASSWORD authentication
.clickWhenVisible('#select-replication-target-auth')
.keys(['\uE015', '\uE006'])
.waitForElementVisible('#replication-target-auth-username', waitTime, true)
// enter target username/password
.setValue('#replication-target-auth-password', [password, client.Keys.ENTER])
.clickWhenVisible('#replicate')
.waitForElementNotPresent('.Toastify__toast-container .Toastify__toast-body', waitTime, true)
.end();
},
'Replicates existing local db to existing local db' : function (client) {
const waitTime = client.globals.maxWaitTime;
const baseUrl = client.options.launch_url;
const password = client.options.password;
client
// create two databases, each with a single (different) doc
.createDatabase(newDatabaseName1)
.checkForDatabaseCreated(newDatabaseName1, waitTime)
.createDocument(docName1, newDatabaseName1)
.createDatabase(newDatabaseName2)
.checkForDatabaseCreated(newDatabaseName2, waitTime)
.createDocument(docName2, newDatabaseName2)
// now login and fill in the replication form
.loginToGUI()
.url(baseUrl + '/#/replication/_create')
.waitForElementVisible('button#replicate', waitTime, true)
.waitForElementVisible('#replication-source', waitTime, true)
// select the LOCAL db as the source
.clickWhenVisible('#replication-source')
.keys(['\uE015', '\uE006'])
.waitForElementVisible('.replication__input-react-select', waitTime, true)
.setValue('.replication__input-react-select .Select-input input', [newDatabaseName1, client.Keys.ENTER])
// select source USER/PASSWORD authentication
.clickWhenVisible('#select-replication-source-auth')
.keys(['\uE015', '\uE006'])
.waitForElementVisible('#replication-source-auth-username', waitTime, true)
// enter source username/password
.setValue('#replication-source-auth-password', [password, client.Keys.ENTER])
// select existing local as the target
.waitForElementVisible('#replication-target', waitTime, true)
.clickWhenVisible('#replication-target option[value="REPLICATION_TARGET_EXISTING_LOCAL_DATABASE"]')
.setValue('#replication-target-local .Select-input input', [newDatabaseName2, client.Keys.ENTER])
// select target USER/PASSWORD authentication
.clickWhenVisible('#select-replication-target-auth')
.keys(['\uE015', '\uE006'])
.waitForElementVisible('#replication-target-auth-username', waitTime, true)
// enter target username/password
.setValue('#replication-target-auth-password', [password, client.Keys.ENTER])
.getAttribute('#replicate', 'disabled', function (result) {
// confirm it's not disabled
this.assert.equal(result.value, null);
})
.clickWhenVisible('#replicate')
.waitForElementNotPresent('.Toastify__toast-container .Toastify__toast-body', waitTime, true)
.end();
},
'Replicates using existing doc id' : function (client) {
const waitTime = client.globals.maxWaitTime;
const baseUrl = client.options.launch_url;
const password = client.options.password;
const replicatorDoc = {
_id: 'existing-doc-id',
source: "http://source-db.com",
target: "http://target-db.com"
};
client
// create two databases, each with a single (different) doc
.createDatabase(newDatabaseName1)
.checkForDatabaseCreated(newDatabaseName1, waitTime)
.createDocument(docName1, newDatabaseName1)
.createDatabase(newDatabaseName2)
.checkForDatabaseCreated(newDatabaseName2, waitTime)
.createDocument(docName2, newDatabaseName2)
.deleteDocument(replicatorDoc._id, '_replicator')
.createDocument(replicatorDoc._id, '_replicator', replicatorDoc)
// now login and fill in the replication form
.loginToGUI()
.url(baseUrl + '/#/replication/_create')
.waitForElementVisible('button#replicate', waitTime, true)
.waitForElementVisible('#replication-source', waitTime, true)
// select the LOCAL db as the source
.clickWhenVisible('#replication-source')
.keys(['\uE015', '\uE006'])
.waitForElementVisible('.replication__input-react-select', waitTime, true)
.setValue('.replication__input-react-select .Select-input input', [newDatabaseName1, client.Keys.ENTER])
// select source USER/PASSWORD authentication
.clickWhenVisible('#select-replication-source-auth')
.keys(['\uE015', '\uE006'])
.waitForElementVisible('#replication-source-auth-username', waitTime, true)
// enter source username/password
.setValue('#replication-source-auth-password', [password, client.Keys.ENTER])
// select existing local as the target
.waitForElementVisible('#replication-target', waitTime, true)
.clickWhenVisible('#replication-target option[value="REPLICATION_TARGET_EXISTING_LOCAL_DATABASE"]')
.setValue('#replication-target-local .Select-input input', [newDatabaseName2, client.Keys.ENTER])
.setValue('.replication__doc-name-input', [replicatorDoc._id, client.Keys.ENTER])
// select target USER/PASSWORD authentication
.clickWhenVisible('#select-replication-target-auth')
.keys(['\uE015', '\uE006'])
.waitForElementVisible('#replication-target-auth-username', waitTime, true)
// enter target username/password
.setValue('#replication-target-auth-password', [password, client.Keys.ENTER])
.getAttribute('#replicate', 'disabled', function (result) {
// confirm it's not disabled
this.assert.equal(result.value, null);
})
.clickWhenVisible('#replicate')
// confirm overwrite of existing doc
.waitForElementVisible('.replication__error-doc-modal .replication__error-continue', waitTime, true)
.clickWhenVisible('.replication__error-doc-modal .replication__error-continue')
.waitForElementNotPresent('.Toastify__toast-container .Toastify__toast-body', waitTime, true)
.end();
},
'Show error for missing credentials' : function (client) {
const waitTime = client.globals.maxWaitTime;
const baseUrl = client.options.launch_url;
client
.createDatabase(newDatabaseName1)
.checkForDatabaseCreated(newDatabaseName1, waitTime)
.createDocument(docName1, newDatabaseName1)
.loginToGUI()
.url(baseUrl + '/#/replication/_create')
.waitForElementVisible('button#replicate', waitTime, true)
.waitForElementVisible('#replication-source', waitTime, true)
// select LOCAL as the source
.clickWhenVisible('#replication-source')
.keys(['\uE015', '\uE006'])
.waitForElementVisible('.replication__input-react-select', waitTime, true)
// enter our source DB
.setValue('.replication__input-react-select .Select-input input', [newDatabaseName1, client.Keys.ENTER])
// enter a new target name
.waitForElementVisible('#replication-target', waitTime, true)
.clickWhenVisible('option[value="REPLICATION_TARGET_NEW_LOCAL_DATABASE"]')
.setValue('.replication__new-input', replicatedDBName)
.clickWhenVisible('#replicate')
.waitForElementPresent('.Toastify__toast-container .Toastify__toast--error', waitTime, true)
.end();
},
'Show error for invalid credentials' : function (client) {
const waitTime = client.globals.maxWaitTime;
const baseUrl = client.options.launch_url;
client
.createDatabase(newDatabaseName1)
.checkForDatabaseCreated(newDatabaseName1, waitTime)
.createDocument(docName1, newDatabaseName1)
.loginToGUI()
.url(baseUrl + '/#/replication/_create')
.waitForElementVisible('button#replicate', waitTime, true)
.waitForElementVisible('#replication-source', waitTime, true)
// select LOCAL as the source
.clickWhenVisible('#replication-source')
.keys(['\uE015', '\uE006'])
.waitForElementVisible('.replication__input-react-select', waitTime, true)
// enter our source DB
.setValue('.replication__input-react-select .Select-input input', [newDatabaseName1, client.Keys.ENTER])
// select source USER/PASSWORD authentication
.clickWhenVisible('#select-replication-source-auth')
.keys(['\uE015', '\uE006'])
.waitForElementVisible('#replication-source-auth-username', waitTime, true)
// enter source username/password
.setValue('#replication-source-auth-password', ['wrong_pwd', client.Keys.ENTER])
// enter a new target name
.waitForElementVisible('#replication-target', waitTime, true)
.clickWhenVisible('option[value="REPLICATION_TARGET_NEW_REMOTE_DATABASE"]')
.setValue('.replication__remote-connection-url', 'http://fake.com/dummydb')
.clickWhenVisible('#replicate')
.waitForElementPresent('.Toastify__toast-container .Toastify__toast--error', waitTime, true)
.end();
}
};