e2e tests (draft)

This commit is contained in:
witzig 2017-05-10 01:40:02 +02:00
parent 408db13fd4
commit 6c35046ab2
26 changed files with 1659 additions and 29 deletions

View file

@ -0,0 +1,25 @@
'use strict';
const Page = require('./page');
let flash;
class Flash extends Page {
getText() {
return this.element('alert').getText();
}
clear() {
return this.driver.executeScript(`
var elements = document.getElementsByClassName('alert');
while(elements.length > 0){
elements[0].parentNode.removeChild(elements[0]);
}
`);
}
}
module.exports = driver => flash || new Flash(driver, {
elementToWaitFor: 'alert',
elements: {
alert: 'div.alert:not(.js-warning)'
}
});

View file

@ -0,0 +1,12 @@
'use strict';
const Page = require('./page');
let home;
module.exports = driver => home || new Page(driver, {
url: '/',
elementToWaitFor: 'body',
elements: {
body: 'body.page--home'
}
});

View file

@ -0,0 +1,61 @@
'use strict';
const config = require('../helpers/config');
const webdriver = require('selenium-webdriver');
const By = webdriver.By;
const until = webdriver.until;
class Page {
constructor(driver, props) {
this.driver = driver;
this.props = props || {
elements: {}
};
}
element(key) {
return this.driver.findElement(By.css(this.props.elements[key] || key));
}
navigate() {
this.driver.navigate().to(config.baseUrl + this.props.url);
return this.waitUntilVisible();
}
waitUntilVisible() {
let selector = this.props.elements[this.props.elementToWaitFor];
if (!selector && this.props.url) {
selector = 'body.page--' + (this.props.url.substring(1).replace(/\//g, '--') || 'home');
}
return selector ? this.driver.wait(until.elementLocated(By.css(selector))) : this.driver.sleep(1000);
}
submit() {
return this.element('submitButton').click();
}
click(key) {
return this.element(key).click();
}
getText(key) {
return this.element(key).getText();
}
getValue(key) {
return this.element(key).getAttribute('value');
}
setValue(key, value) {
return this.element(key).sendKeys(value);
}
containsText(str) {
// let text = await driver.findElement({ css: 'body' }).getText();
return this.driver.executeScript(`
return (document.documentElement.textContent || document.documentElement.innerText).indexOf('${str}') > -1;
`);
}
}
module.exports = Page;

View file

@ -0,0 +1,84 @@
'use strict';
const config = require('../helpers/config');
const Page = require('./page');
class Web extends Page {
enterEmail(value) {
this.element('emailInput').clear();
return this.element('emailInput').sendKeys(value);
}
}
class Mail extends Page {
navigate(address) {
this.driver.sleep(100);
this.driver.navigate().to(`http://localhost:${config.app.testserver.mailboxserverport}/${address}`);
return this.waitUntilVisible();
}
}
module.exports = (driver, list) => ({
webSubscribe: new Web(driver, {
url: `/subscription/${list.cid}`,
elementToWaitFor: 'form',
elements: {
form: `form[action="/subscription/${list.cid}/subscribe"]`,
emailInput: '#main-form input[name="email"]',
submitButton: 'a[href="#submit"]'
}
}),
webConfirmSubscriptionNotice: new Web(driver, {
url: `/subscription/${list.cid}/confirm-notice`,
elementToWaitFor: 'homepageButton',
elements: {
homepageButton: `a[href="${config.settings['default-homepage']}"]`
}
}),
mailConfirmSubscription: new Mail(driver, {
elementToWaitFor: 'confirmLink',
elements: {
confirmLink: `a[href^="${config.settings['service-url']}subscription/subscribe/"]`
}
}),
webSubscribedNotice: new Web(driver, {
elementToWaitFor: 'homepageButton',
elements: {
homepageButton: 'a[href^="https://mailtrain.org"]'
}
}),
mailSubscriptionConfirmed: new Mail(driver, {
elementToWaitFor: 'unsubscribeLink',
elements: {
unsubscribeLink: 'a[href*="/unsubscribe/"]',
manageLink: 'a[href*="/manage/"]'
}
}),
webUnsubscribe: new Web(driver, {
elementToWaitFor: 'submitButton',
elements: {
submitButton: 'a[href="#submit"]'
}
}),
webUnsubscribedNotice: new Web(driver, {
elementToWaitFor: 'homepageButton',
elements: {
homepageButton: 'a[href^="https://mailtrain.org"]'
}
}),
mailUnsubscriptionConfirmed: new Mail(driver, {
elementToWaitFor: 'resubscribeLink',
elements: {
resubscribeLink: `a[href^="${config.settings['service-url']}subscription/${list.cid}"]`
}
})
});

View file

@ -0,0 +1,35 @@
'use strict';
const Page = require('./page');
class Login extends Page {
enterUsername(value) {
// this.element('usernameInput').clear();
return this.element('usernameInput').sendKeys(value);
}
enterPassword(value) {
return this.element('passwordInput').sendKeys(value);
}
}
module.exports = driver => ({
login: new Login(driver, {
url: '/users/login',
elementToWaitFor: 'submitButton',
elements: {
usernameInput: 'form[action="/users/login"] input[name="username"]',
passwordInput: 'form[action="/users/login"] input[name="password"]',
submitButton: 'form[action="/users/login"] [type=submit]'
}
}),
account: new Page(driver, {
url: '/users/account',
elementToWaitFor: 'emailInput',
elements: {
emailInput: 'form[action="/users/account"] input[name="email"]'
}
})
});