commit e806b0d22ac454be9b4b9bb13a1425bef13b3c49 Author: Bruno Windels Date: Thu Jul 5 11:55:45 2018 +0100 initial commit diff --git a/package.json b/package.json new file mode 100644 index 0000000000..fa67de0069 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "e2e-tests", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "jest": "^23.2.0", + "puppeteer": "^1.5.0" + } +} diff --git a/title.test.js b/title.test.js new file mode 100644 index 0000000000..d416e889f0 --- /dev/null +++ b/title.test.js @@ -0,0 +1,162 @@ +const puppeteer = require('puppeteer'); +const riotserver = 'http://localhost:8080'; +const homeserver = 'http://localhost:8008'; +let browser = null; + +jest.setTimeout(10000); + +async function try_get_innertext(page, selector) { + const field = await page.$(selector); + if (field != null) { + const text_handle = await field.getProperty('innerText'); + return await text_handle.jsonValue(); + } + return null; +} + +async function new_page() { + const page = await browser.newPage(); + await page.setViewport({ + width: 1280, + height: 800 + }); + return page; +} + +function log_console(page) { + let buffer = ""; + page.on('console', msg => { + buffer += msg.text() + '\n'; + }); + return { + logs() { + return buffer; + } + } +} + +function log_xhr_requests(page) { + let buffer = ""; + page.on('request', req => { + const type = req.resourceType(); + if (type === 'xhr' || type === 'fetch') { + buffer += `${req.method()} ${req.url()} \n`; + if (req.method() === "POST") { + buffer += " Post data: " + req.postData(); + } + } + }); + return { + logs() { + return buffer; + } + } +} + +function rnd_int(max) { + return Math.ceil(Math.random()*max); +} + +function riot_url(path) { + return riotserver + path; +} + +function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +async function get_outer_html(element_handle) { + const html_handle = await element_handle.getProperty('outerHTML'); + return await html_handle.jsonValue(); +} + +async function print_elements(label, elements) { + console.log(label, await Promise.all(elements.map(get_outer_html))); +} + +async function replace_input_text(input, text) { + // click 3 times to select all text + await input.click({clickCount: 3}); + // then remove it with backspace + await input.press('Backspace'); + // and type the new text + await input.type(text); +} + +beforeAll(async () => { + browser = await puppeteer.launch(); +}); + +afterAll(() => { + return browser.close(); +}) + +test('test page loads', async () => { + const page = await browser.newPage(); + await page.goto(riot_url('/')); + const title = await page.title(); + expect(title).toBe("Riot"); +}); + +test('test signup', async () => { + const page = await new_page(); + const console_logs = log_console(page); + const xhr_logs = log_xhr_requests(page); + await page.goto(riot_url('/#/register')); + //click 'Custom server' radio button + await page.waitForSelector('#advanced', {visible: true, timeout: 500}); + await page.click('#advanced'); + + const username = 'bruno-' + rnd_int(10000); + const password = 'testtest'; + //fill out form + await page.waitForSelector('.mx_ServerConfig', {visible: true, timeout: 500}); + const login_fields = await page.$$('.mx_Login_field'); + expect(login_fields.length).toBe(7); + const username_field = login_fields[2]; + const password_field = login_fields[3]; + const password_repeat_field = login_fields[4]; + const hsurl_field = login_fields[5]; + await replace_input_text(username_field, username); + await replace_input_text(password_field, password); + await replace_input_text(password_repeat_field, password); + await replace_input_text(hsurl_field, homeserver); + //wait over a second because Registration/ServerConfig have a 1000ms + //delay to internally set the homeserver url + //see Registration::render and ServerConfig::props::delayTimeMs + await delay(1200); + /// focus on the button to make sure error validation + /// has happened before checking the form is good to go + const register_button = await page.$('.mx_Login_submit'); + await register_button.focus(); + //check no errors + const error_text = await try_get_innertext(page, '.mx_Login_error'); + expect(error_text).toBeFalsy(); + //submit form + await page.screenshot({path: "beforesubmit.png", fullPage: true}); + await register_button.click(); + + //confirm dialog saying you cant log back in without e-mail + await page.waitForSelector('.mx_QuestionDialog', {visible: true, timeout: 500}); + const continue_button = await page.$('.mx_QuestionDialog button.mx_Dialog_primary'); + print_elements('continue_button', [continue_button]); + await continue_button.click(); + //wait for registration to finish so the hash gets set + //onhashchange better? + await delay(1000); +/* + await page.screenshot({path: "afterlogin.png", fullPage: true}); + console.log('browser console logs:'); + console.log(console_logs.logs()); + console.log('xhr logs:'); + console.log(xhr_logs.logs()); +*/ + + + //print_elements('page', await page.$('#matrixchat')); +// await navigation_promise; + + //await page.waitForSelector('.mx_MatrixChat', {visible: true, timeout: 3000}); + const url = page.url(); + expect(url).toBe(riot_url('/#/home')); +});