working consent test by accepting server notices invite and clicking on link, also create room

This commit is contained in:
Bruno Windels 2018-07-20 18:51:25 +02:00
parent bc1da0565e
commit a74a753a05
6 changed files with 132 additions and 16 deletions

View file

@ -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,

View file

@ -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();

28
tests/consent.js Normal file
View file

@ -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
}

32
tests/create-room.js Normal file
View file

@ -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');
}

View file

@ -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
}

View file

@ -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
}