From 853cba1debce646dd01b819402cb4c6d3c590c56 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C5=BDeljko=20Filipin?= Date: Mon, 8 May 2017 12:10:18 +0200 Subject: [PATCH] Create users and pages for Selenium tests using action API This will make tests slightly more robust. Bug: T164721 Bug: T167502 Change-Id: I9b2fea77b28af4f7f521490a0105e7d04730bc87 --- package.json | 1 + tests/selenium/.eslintrc.json | 3 ++ tests/selenium/README.md | 4 +- .../pageobjects/createaccount.page.js | 52 +++++++++++++++++++ tests/selenium/pageobjects/edit.page.js | 26 +++++++++- tests/selenium/pageobjects/userlogout.page.js | 11 ---- tests/selenium/specs/page.js | 15 ++++-- tests/selenium/specs/user.js | 22 ++++---- 8 files changed, 105 insertions(+), 29 deletions(-) delete mode 100644 tests/selenium/pageobjects/userlogout.page.js diff --git a/package.json b/package.json index 66c13cdd40..fe3c910bd8 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "karma-firefox-launcher": "1.0.1", "karma-mocha-reporter": "2.2.3", "karma-qunit": "1.0.0", + "nodemw": "0.10.1", "qunitjs": "1.23.1", "stylelint-config-wikimedia": "0.4.1", "wdio-junit-reporter": "0.2.0", diff --git a/tests/selenium/.eslintrc.json b/tests/selenium/.eslintrc.json index d64ada9a6d..db736b77b8 100644 --- a/tests/selenium/.eslintrc.json +++ b/tests/selenium/.eslintrc.json @@ -10,5 +10,8 @@ }, "globals": { "browser": false + }, + "rules":{ + "no-console":0 } } diff --git a/tests/selenium/README.md b/tests/selenium/README.md index 479b958735..a14cccb0fb 100644 --- a/tests/selenium/README.md +++ b/tests/selenium/README.md @@ -27,8 +27,8 @@ To run only one file (for example page.js), you first need to spawn the chromedr Then in another terminal: - cd mediawiki/tests/selenium - ../../node_modules/.bin/wdio --spec page.js + cd tests/selenium + ../../node_modules/.bin/wdio --spec specs/page.js The runner reads the config file `wdio.conf.js` and runs the spec listed in `page.js`. diff --git a/tests/selenium/pageobjects/createaccount.page.js b/tests/selenium/pageobjects/createaccount.page.js index a0b9490702..f54e31c8f8 100644 --- a/tests/selenium/pageobjects/createaccount.page.js +++ b/tests/selenium/pageobjects/createaccount.page.js @@ -21,5 +21,57 @@ class CreateAccountPage extends Page { this.create.click(); } + apiCreateAccount( username, password ) { + const url = require( 'url' ), // https://nodejs.org/docs/latest/api/url.html + baseUrl = url.parse( browser.options.baseUrl ), // http://webdriver.io/guide/testrunner/browserobject.html + Bot = require( 'nodemw' ), // https://github.com/macbre/nodemw + client = new Bot( { + protocol: baseUrl.protocol, + server: baseUrl.hostname, + port: baseUrl.port, + path: baseUrl.path, + debug: false + } ); + + return new Promise( ( resolve, reject ) => { + client.api.call( + { + action: 'query', + meta: 'tokens', + type: 'createaccount' + }, + /** + * @param {Error|null} err + * @param {Object} info Processed query result + * @param {Object} next More results? + * @param {Object} data Raw data + */ + function ( err, info, next, data ) { + if ( err ) { + reject( err ); + return; + } + client.api.call( { + action: 'createaccount', + createreturnurl: browser.options.baseUrl, + createtoken: data.query.tokens.createaccounttoken, + username: username, + password: password, + retype: password + }, function ( err ) { + if ( err ) { + reject( err ); + return; + } + resolve(); + }, 'POST' ); + }, + 'POST' + ); + + } ); + + } + } module.exports = new CreateAccountPage(); diff --git a/tests/selenium/pageobjects/edit.page.js b/tests/selenium/pageobjects/edit.page.js index 819c5464ef..25da8cb8bc 100644 --- a/tests/selenium/pageobjects/edit.page.js +++ b/tests/selenium/pageobjects/edit.page.js @@ -8,15 +8,37 @@ class EditPage extends Page { get heading() { return browser.element( '#firstHeading' ); } get save() { return browser.element( '#wpSave' ); } - open( name ) { + openForEditing( name ) { super.open( name + '&action=edit' ); } edit( name, content ) { - this.open( name ); + this.openForEditing( name ); this.content.setValue( content ); this.save.click(); } + apiEdit( name, content ) { + const url = require( 'url' ), // https://nodejs.org/docs/latest/api/url.html + baseUrl = url.parse( browser.options.baseUrl ), // http://webdriver.io/guide/testrunner/browserobject.html + Bot = require( 'nodemw' ), // https://github.com/macbre/nodemw + client = new Bot( { + protocol: baseUrl.protocol, + server: baseUrl.hostname, + port: baseUrl.port, + path: baseUrl.path, + debug: false + } ); + + return new Promise( ( resolve, reject ) => { + client.edit( name, content, `Created page with "${content}"`, function ( err ) { + if ( err ) { + return reject( err ); + } + resolve(); + } ); + } ); + } + } module.exports = new EditPage(); diff --git a/tests/selenium/pageobjects/userlogout.page.js b/tests/selenium/pageobjects/userlogout.page.js deleted file mode 100644 index e355fd53b9..0000000000 --- a/tests/selenium/pageobjects/userlogout.page.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; -const Page = require( './page' ); - -class UserLogoutPage extends Page { - - open() { - super.open( 'Special:UserLogout' ); - } - -} -module.exports = new UserLogoutPage(); diff --git a/tests/selenium/specs/page.js b/tests/selenium/specs/page.js index da80aafe23..04b3dc54ed 100644 --- a/tests/selenium/specs/page.js +++ b/tests/selenium/specs/page.js @@ -1,7 +1,7 @@ 'use strict'; const assert = require( 'assert' ), - HistoryPage = require( '../pageobjects/history.page' ), - EditPage = require( '../pageobjects/edit.page' ); + EditPage = require( '../pageobjects/edit.page' ), + HistoryPage = require( '../pageobjects/history.page' ); describe( 'Page', function () { @@ -9,6 +9,7 @@ describe( 'Page', function () { name; beforeEach( function () { + browser.deleteCookie(); content = Math.random().toString(); name = Math.random().toString(); } ); @@ -29,12 +30,14 @@ describe( 'Page', function () { var content2 = Math.random().toString(); // create - EditPage.edit( name, content ); + browser.call( function () { + return EditPage.apiEdit( name, content ); + } ); // edit EditPage.edit( name, content2 ); - // check content + // check assert.equal( EditPage.heading.getText(), name ); assert.equal( EditPage.displayedContent.getText(), content2 ); @@ -43,7 +46,9 @@ describe( 'Page', function () { it( 'should have history', function () { // create - EditPage.edit( name, content ); + browser.call( function () { + return EditPage.apiEdit( name, content ); + } ); // check HistoryPage.open( name ); diff --git a/tests/selenium/specs/user.js b/tests/selenium/specs/user.js index 6746c5b5d9..193095d304 100644 --- a/tests/selenium/specs/user.js +++ b/tests/selenium/specs/user.js @@ -1,9 +1,8 @@ 'use strict'; const assert = require( 'assert' ), CreateAccountPage = require( '../pageobjects/createaccount.page' ), - UserLoginPage = require( '../pageobjects/userlogin.page' ), - UserLogoutPage = require( '../pageobjects/userlogout.page' ), - PreferencesPage = require( '../pageobjects/preferences.page' ); + PreferencesPage = require( '../pageobjects/preferences.page' ), + UserLoginPage = require( '../pageobjects/userlogin.page' ); describe( 'User', function () { @@ -11,6 +10,7 @@ describe( 'User', function () { username; beforeEach( function () { + browser.deleteCookie(); username = `User-${Math.random().toString()}`; password = Math.random().toString(); } ); @@ -28,10 +28,9 @@ describe( 'User', function () { it( 'should be able to log in', function () { // create - CreateAccountPage.createAccount( username, password ); - - // logout - UserLogoutPage.open(); + browser.call( function () { + return CreateAccountPage.apiCreateAccount( username, password ); + } ); // log in UserLoginPage.login( username, password ); @@ -46,9 +45,14 @@ describe( 'User', function () { var realName = Math.random().toString(); // create - CreateAccountPage.createAccount( username, password ); + browser.call( function () { + return CreateAccountPage.apiCreateAccount( username, password ); + } ); + + // log in + UserLoginPage.login( username, password ); - // change real name + // change PreferencesPage.changeRealName( realName ); // check -- 2.20.1