diff --git a/helpers.js b/helpers.js index d57595f377..fae5c8e859 100644 --- a/helpers.js +++ b/helpers.js @@ -16,6 +16,7 @@ limitations under the License. // puppeteer helpers +// TODO: rename to queryAndInnertext? async function tryGetInnertext(page, selector) { const field = await page.$(selector); if (field != null) { @@ -25,6 +26,11 @@ async function tryGetInnertext(page, selector) { return null; } +async function innerText(page, field) { + const text_handle = await field.getProperty('innerText'); + return await text_handle.jsonValue(); +} + async function newPage() { const page = await browser.newPage(); await page.setViewport({ @@ -82,11 +88,17 @@ async function replaceInputText(input, text) { await input.type(text); } +// TODO: rename to waitAndQuery(Single)? async function waitAndQuerySelector(page, selector, timeout = 500) { await page.waitForSelector(selector, {visible: true, timeout}); return await page.$(selector); } +async function waitAndQueryAll(page, selector, timeout = 500) { + await page.waitForSelector(selector, {visible: true, timeout}); + return await page.$$(selector); +} + function waitForNewPage(timeout = 500) { return new Promise((resolve, reject) => { const timeoutHandle = setTimeout(() => { @@ -120,6 +132,7 @@ function delay(ms) { module.exports = { tryGetInnertext, + innerText, newPage, logConsole, logXHRRequests, @@ -127,6 +140,7 @@ module.exports = { printElements, replaceInputText, waitAndQuerySelector, + waitAndQueryAll, waitForNewPage, randomInt, riotUrl, diff --git a/start.js b/start.js index 8a3ceb354b..0c06bd9731 100644 --- a/start.js +++ b/start.js @@ -20,13 +20,16 @@ const assert = require('assert'); const signup = require('./tests/signup'); const join = require('./tests/join'); +const createRoom = require('./tests/create-room'); +const acceptServerNoticesInviteAndConsent = require('./tests/server-notices-consent'); + +const homeserver = 'http://localhost:8008'; global.riotserver = 'http://localhost:8080'; -global.homeserver = 'http://localhost:8008'; global.browser = null; async function runTests() { - global.browser = await puppeteer.launch(); + global.browser = await puppeteer.launch({headless: false}); const page = await helpers.newPage(); const username = 'bruno-' + helpers.randomInt(10000); @@ -35,9 +38,14 @@ async function runTests() { await signup(page, username, password, homeserver); process.stdout.write('done\n'); + const noticesName = "Server Notices"; + process.stdout.write(`* accepting "${noticesName}" and accepting terms & conditions ...`); + await acceptServerNoticesInviteAndConsent(page, noticesName); + process.stdout.write('done\n'); + const room = 'test'; - process.stdout.write(`* joining room ${room} ... `); - await join(page, room, true); + process.stdout.write(`* creating room ${room} ... `); + await createRoom(page, room); process.stdout.write('done\n'); await browser.close(); diff --git a/tests/consent.js b/tests/consent.js new file mode 100644 index 0000000000..3c8ada9a5e --- /dev/null +++ b/tests/consent.js @@ -0,0 +1,28 @@ +/* +Copyright 2018 New Vector Ltd + +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('../helpers'); +const assert = require('assert'); + +module.exports = async function acceptTerms(page) { + const reviewTermsButton = await helpers.waitAndQuerySelector(page, '.mx_QuestionDialog button.mx_Dialog_primary', 5000); + const termsPagePromise = helpers.waitForNewPage(); + await reviewTermsButton.click(); + const termsPage = await termsPagePromise; + const acceptButton = await termsPage.$('input[type=submit]'); + await acceptButton.click(); + await helpers.delay(500); //TODO yuck, timers +} \ No newline at end of file diff --git a/tests/create-room.js b/tests/create-room.js new file mode 100644 index 0000000000..4c9004bcaf --- /dev/null +++ b/tests/create-room.js @@ -0,0 +1,32 @@ +/* +Copyright 2018 New Vector Ltd + +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('../helpers'); +const assert = require('assert'); + +module.exports = async function createRoom(page, roomName) { + //TODO: brittle selector + const createRoomButton = await helpers.waitAndQuerySelector(page, '.mx_RoleButton[aria-label="Create new room"]'); + await createRoomButton.click(); + + const roomNameInput = await helpers.waitAndQuerySelector(page, '.mx_CreateRoomDialog_input'); + await helpers.replaceInputText(roomNameInput, roomName); + + const createButton = await helpers.waitAndQuerySelector(page, '.mx_Dialog_primary'); + await createButton.click(); + + await page.waitForSelector('.mx_MessageComposer'); +} \ No newline at end of file diff --git a/tests/server-notices-consent.js b/tests/server-notices-consent.js new file mode 100644 index 0000000000..2689036a96 --- /dev/null +++ b/tests/server-notices-consent.js @@ -0,0 +1,44 @@ +/* +Copyright 2018 New Vector Ltd + +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('../helpers'); +const assert = require('assert'); + +module.exports = async function acceptServerNoticesInviteAndConsent(page, name) { + //TODO: brittle selector + const invitesHandles = await helpers.waitAndQueryAll(page, '.mx_RoomTile_name.mx_RoomTile_invite'); + const invitesWithText = await Promise.all(invitesHandles.map(async (inviteHandle) => { + const text = await helpers.innerText(page, inviteHandle); + return {inviteHandle, text}; + })); + const inviteHandle = invitesWithText.find(({inviteHandle, text}) => { + return text.trim() === name; + }).inviteHandle; + + await inviteHandle.click(); + + const acceptInvitationLink = await helpers.waitAndQuerySelector(page, ".mx_RoomPreviewBar_join_text a:first-child"); + await acceptInvitationLink.click(); + + const consentLink = await helpers.waitAndQuerySelector(page, ".mx_EventTile_body a", 1000); + + const termsPagePromise = helpers.waitForNewPage(); + await consentLink.click(); + const termsPage = await termsPagePromise; + const acceptButton = await termsPage.$('input[type=submit]'); + await acceptButton.click(); + await helpers.delay(500); //TODO yuck, timers +} \ No newline at end of file diff --git a/tests/signup.js b/tests/signup.js index 5560fc56cf..e482c7dfea 100644 --- a/tests/signup.js +++ b/tests/signup.js @@ -65,9 +65,9 @@ module.exports = async function signup(page, username, password, homeserver) { console.log(xhrLogs.logs()); */ - await acceptTerms(page); + //await acceptTerms(page); - await helpers.delay(10000); + await helpers.delay(2000); //printElements('page', await page.$('#matrixchat')); // await navigation_promise; @@ -75,13 +75,3 @@ module.exports = async function signup(page, username, password, homeserver) { const url = page.url(); assert.strictEqual(url, helpers.riotUrl('/#/home')); } - -async function acceptTerms(page) { - const reviewTermsButton = await helpers.waitAndQuerySelector(page, '.mx_QuestionDialog button.mx_Dialog_primary'); - const termsPagePromise = helpers.waitForNewPage(); - await reviewTermsButton.click(); - const termsPage = await termsPagePromise; - const acceptButton = await termsPage.$('input[type=submit]'); - await acceptButton.click(); - await helpers.delay(500); //TODO yuck, timers -} \ No newline at end of file