ickyrr-gagarin
Version:
A current updated fork of gagarin
290 lines (248 loc) • 8.55 kB
JavaScript
var expect = require('chai').expect;
var either = require('../tools').either;
var Promise = require('es6-promise').Promise;
var DEFAULT_TIMEOUT = 5000;
// these two guys are required for screenshots
var fs = require('fs');
var path = require('path');
module.exports = {
addScript: function (url, verify, args) {
var self = this;
return self.promise(function (resolve, reject, url) {
var script = window.document.createElement('script');
script.src = url;
script.addEventListener('load', resolve);
window.document.head.appendChild(script);
}, [ url ]).then(function () {
if (verify) {
return self.noWait().execute(verify, args).then(function (success) {
if (!success) {
throw new Error('Script ' + url + ' has loaded but it seems that it does not contain the expected content.');
}
});
}
});
},
waitForDOM: function (selector, timeout) {
return this.wait(timeout || DEFAULT_TIMEOUT, 'until element ' + selector + ' is present', function (selector) {
return !!document.querySelector(selector);
}, [ selector ]);
},
waitUntilGone: function (selector, timeout) {
return this.wait(timeout || DEFAULT_TIMEOUT, 'until element ' + selector + ' is gone', function (selector) {
return !document.querySelector(selector);
}, [ selector ]);
},
waitUntilNotVisible: function (selector, timeout) {
return this.wait(timeout || DEFAULT_TIMEOUT, 'until element ' + selector + ' is hidden', function (selector) {
var element = document.querySelector(selector);
if(!!element){
return element.offsetWidth <= 0 && element.offsetHeight <= 0;
}else{
return false;
}
}, [ selector ]);
},
getText: function (selector) {
return this.waitForDOM(selector).execute(function (selector) {
var element = document.querySelector(selector);
return element && element.innerHTML;
}, [ selector ]);
},
//getText: function (selector) {
// return this.waitForDOM(selector).execute(function (selector) {
// return $(selector).text();
// }, selector);
//},
getValue: function (selector) {
return this.waitForDOM(selector).execute(function (selector) {
var element = document.querySelector(selector);
return element && element.value;
}, [ selector ]);
},
getClass: function (selector) {
return this.waitForDOM(selector).execute(function (selector) {
var element = document.querySelector(selector);
return (element && element.className) || '';
}, [ selector ]);
},
//click: function (selector, timeout) {
// return this.waitForDOM(selector).execute(function (selector) {
// click(selector);
// }, selector);
//},
//clickIfExists: function (selector) {
// return this.execute(function (selector) {
// click(selector);
// }, selector);
//},
setValue: function (selector, value) {
return this.waitForDOM(selector).execute(function (selector, value) {
var element = document.querySelector(selector);
if (element) {
element.value = value;
}
}, [ selector, value ]);
},
focus: function (selector) {
return this.waitForDOM(selector).execute(function (selector) {
var element = document.querySelector(selector);
element && element.focus();
}, [ selector ]);
},
blur: function (selector) {
return this.waitForDOM(selector).execute(function (selector) {
var element = document.querySelector(selector);
element && element.blur();
}, [ selector ]);
},
click: function (selector, keys) {
return this.__custom__(function (operand, done) {
operand.browser.elementByCssSelectorOrNull(selector, done);
}).then(function (element) {
if (!element) {
throw new Error('element ' + selector + ' does not exists');
}
return new Promise(function (resolve, reject) {
element.click(either(reject).or(resolve));
});
});
},
// we should probably call this helper "typeKeys"
//typeKeys: function (selector, keys) {
// do we need focus and blur?
// return this.waitForDOM(selector)
// .focus(selector)
// .sendKeys(selector, keys)
// .blur(selector);
//},
sendKeys: function (selector, keys) {
return this.__custom__(function (operand, done) {
operand.browser.elementByCssSelectorOrNull(selector, done);
}).then(function (element) {
if (!element) {
throw new Error('element ' + selector + ' does not exists');
}
return new Promise(function (resolve, reject) {
element.sendKeys(keys, either(reject).or(resolve));
});
});
},
signUp: function (options) {
return this.promise(function (resolve, reject, options) {
Accounts.createUser(options, either(reject).or(resolve));
}, [ options ]);
},
login: function (user, password) {
return this.promise(function (resolve, reject, user, password) {
Meteor.loginWithPassword(user, password, either(reject).or(resolve));
}, [ user, password ]);
},
logout: function () {
return this.promise(function (resolve, reject) {
Meteor.logout(either(reject).or(resolve));
});
},
// TODO: allow igonring controller.ready() state
waitForRoute: function (path, timeout) {
return this.execute(function (path) {
Router.go(path);
}, [ path ])
.wait(timeout || DEFAULT_TIMEOUT, 'until current path is ' + path, function (path) {
var controller = Router.current();
var pathOK = (window.location.pathname + window.location.search + window.location.hash === path);
if (controller && pathOK && controller.ready()) {
return true;
} else {
Router.go(path);
}
}, [ path ]);
},
afterFlush: function () {
return this.promise(function (resolve) {
Tracker.afterFlush(resolve);
});
},
disconnect: function () {
return this.execute(function () {
Meteor.disconnect();
}).wait(1000, 'until Meteor disconnects', function () {
return !Meteor.status().connected;
});
},
reconnect: function () {
return this.execute(function () {
Meteor.reconnect();
}).wait(1000, 'until Meteor reconnects', function () {
return Meteor.status().connected;
});
},
// LOGGING
screenshot: function () {
var screenshotsDir = path.join(process.env.CIRCLE_ARTIFACTS || '.', 'screenshots');
if (!fs.existsSync(screenshotsDir)) {
fs.mkdirSync(screenshotsDir);
}
return this
.saveScreenshot(path.join(screenshotsDir, (new Date()).toString() + '.png'))
.then(function (filePath) {
console.log('saved screenshot to file', filePath);
});
},
// ASSERTIONS
checkIfExist: function (selector) {
return this.execute(function (selector) {
return !!document.querySelector(selector);
}, [ selector ]);
},
checkIfVisible: function (selector) {
return this.execute(function (selector) {
var element = document.querySelector(selector);
if(!!element){
return element.offsetWidth > 0 && element.offsetHeight > 0;
}else{
return false;
}
}, [ selector ]);
},
expectExist: function (selector) {
return this.checkIfExist(selector).then(function (exist) {
expect(exist).to.be.true;
});
},
expectNotExist: function (selector) {
return this.checkIfExist(selector).then(function (exist) {
expect(exist).to.be.false;
});
},
expectVisible: function (selector) {
return this.checkIfVisible(selector).then(function (visible) {
expect(visible).to.be.true;
});
},
expectNotVisible: function (selector) {
return this.checkIfVisible(selector).then(function (visible) {
expect(visible).to.be.false;
});
},
expectValueToEqual: function (selector, reference) {
return this.getValue(selector).then(function (value) {
expect(value).to.be.eql(reference);
});
},
expectTextToEqual: function (selector, value) {
return this.getText(selector).then(function (text) {
expect(text).to.be.eql(value);
});
},
expectTextToContain: function (selector, value) {
return this.getText(selector).then(function (text) {
expect(text).to.contain(value);
});
},
expectToHaveClass: function (selector, value) {
return this.getClass(selector).then(function (style) {
expect(style).to.contain(value);
});
},
}