diff --git a/tests/selenium/config/wdio.conf.js b/tests/selenium/config/wdio.conf.js new file mode 100644 index 0000000..820435f --- /dev/null +++ b/tests/selenium/config/wdio.conf.js @@ -0,0 +1,30 @@ +/** + * Extending the Mediawiki core webdriver config + */ + +const path = require( 'path' ), + coreConfig = require( '../../../../../tests/selenium/wdio.conf' ), + relPath = ( foo ) => path.resolve( __dirname, '../..', foo ), + MinervaConfig = Object.assign( coreConfig.config, { + services: [], + specs: [ + relPath( './selenium/features/*.feature' ) + ], + cucumberOpts: { + tagsInTitle: true, + timeout: 20000, // 20 seconds + require: [ + relPath( './selenium/features/support/world.js' ), + relPath( './selenium/features/support/hooks.js' ), + relPath( './selenium/features/step_definitions/create_page_api_steps.js' ), + relPath( './selenium/features/step_definitions/common_steps.js' ), + relPath( './selenium/features/step_definitions/category_steps.js' ), + relPath( './selenium/features/step_definitions/editor_steps.js' ), + relPath( './selenium/features/step_definitions/diff_steps.js' ), + relPath( './selenium/features/step_definitions/special_history_steps.js' ) + ] + }, + framework: 'cucumber' + } ); + +exports.config = MinervaConfig; diff --git a/tests/browser/features/diff.feature b/tests/selenium/features/diff.feature similarity index 79% rename from tests/browser/features/diff.feature rename to tests/selenium/features/diff.feature index ad43aa9..b863cdb 100644 --- a/tests/browser/features/diff.feature +++ b/tests/selenium/features/diff.feature @@ -1,7 +1,5 @@ -@chrome @en.m.wikipedia.beta.wmflabs.org @firefox @test2.m.wikipedia.org @vagrant @login Feature: Page diff - @smoke @editing Scenario: Added and removed content Given I am logged into the mobile website And I am on a page that has the following edits: diff --git a/tests/selenium/features/step_definitions/create_page_api_steps.js b/tests/selenium/features/step_definitions/create_page_api_steps.js index 8e035e1..7ec1946 100644 --- a/tests/selenium/features/step_definitions/create_page_api_steps.js +++ b/tests/selenium/features/step_definitions/create_page_api_steps.js @@ -1,4 +1,4 @@ -const { api } = require( '../support/world' ), +const { api, ArticlePage } = require( '../support/world' ), Api = require( 'wdio-mediawiki/Api' ); const login = () => { @@ -46,7 +46,25 @@ const iAmInAWikiThatHasCategories = ( title ) => { waitForPropagation( 5000 ); }; +const iAmOnAPageThatHasTheFollowingEdits = function ( table ) { + const randomString = Math.random().toString( 36 ).substring( 7 ), + pageTitle = `Selenium_diff_test_${randomString}`, + edits = table.rawTable.map( ( row, i ) => + [ i === 0 ? 'create' : 'edit', pageTitle, row[ 0 ] ] ); + + api.loginGetEditToken( { + username: browser.options.username, + password: browser.options.password, + apiUrl: `${browser.options.baseUrl}/api.php` + } ) + .then( () => api.batch( edits ) ) + .then( () => ArticlePage.open( pageTitle ) ) + .catch( ( err ) => { throw err; } ); + waitForPropagation( 5000 ); +}; + module.exports = { waitForPropagation, + iAmOnAPageThatHasTheFollowingEdits, iAmInAWikiThatHasCategories }; diff --git a/tests/selenium/features/step_definitions/diff_steps.js b/tests/selenium/features/step_definitions/diff_steps.js new file mode 100644 index 0000000..0dd99c3 --- /dev/null +++ b/tests/selenium/features/step_definitions/diff_steps.js @@ -0,0 +1,12 @@ +const assert = require( 'assert' ), + { DiffPage } = require( '../support/world.js' ); + +const iShouldSeeAddedContent = ( text ) => { + DiffPage.inserted_content_element.waitForVisible(); + assert.strictEqual( DiffPage.inserted_content_element.getText(), text ); +}; +const iShouldSeeRemovedContent = ( text ) => { + assert.strictEqual( DiffPage.deleted_content_element.getText(), text ); +}; + +module.exports = { iShouldSeeAddedContent, iShouldSeeRemovedContent }; diff --git a/tests/selenium/features/step_definitions/history_steps.js b/tests/selenium/features/step_definitions/history_steps.js index 00551a0..f7318f8 100644 --- a/tests/selenium/features/step_definitions/history_steps.js +++ b/tests/selenium/features/step_definitions/history_steps.js @@ -1,5 +1,6 @@ const assert = require( 'assert' ), - { ArticlePage, SpecialHistoryPage } = require( '../support/world' ); + { ArticlePage, SpecialHistoryPage, + SpecialMobileDiffPage } = require( '../support/world.js' ); const iClickOnTheHistoryLinkInTheLastModifiedBar = () => { ArticlePage.last_modified_bar_history_link_element.waitForVisible(); @@ -7,6 +8,13 @@ const iClickOnTheHistoryLinkInTheLastModifiedBar = () => { assert.strictEqual( SpecialHistoryPage.side_list_element.isVisible(), true ); }; +const iOpenTheLatestDiff = () => { + SpecialHistoryPage.last_contribution_link_element.waitForExist(); + SpecialHistoryPage.last_contribution_link_element.click(); + assert.strictEqual( SpecialMobileDiffPage.user_info_element.isVisible(), true ); +}; + module.exports = { + iOpenTheLatestDiff, iClickOnTheHistoryLinkInTheLastModifiedBar }; diff --git a/tests/selenium/features/step_definitions/index.js b/tests/selenium/features/step_definitions/index.js index 2270d28..c356ca0 100644 --- a/tests/selenium/features/step_definitions/index.js +++ b/tests/selenium/features/step_definitions/index.js @@ -2,13 +2,18 @@ const { defineSupportCode } = require( 'cucumber' ), { iClickOnTheCategoryButton, iShouldSeeTheCategoriesOverlay, iShouldSeeAListOfCategories } = require( './category_steps' ), - { iAmInAWikiThatHasCategories } = require( './create_page_api_steps' ), + { iAmInAWikiThatHasCategories, + iAmOnAPageThatHasTheFollowingEdits } = require( './create_page_api_steps' ), { iAmUsingTheMobileSite, iAmLoggedIntoTheMobileWebsite, iAmOnPage, iAmInBetaMode } = require( './common_steps' ), { + iShouldSeeAddedContent, iShouldSeeRemovedContent + } = require( './diff_steps' ), + { + iOpenTheLatestDiff, iClickOnTheHistoryLinkInTheLastModifiedBar } = require( './history_steps' ); @@ -27,11 +32,17 @@ defineSupportCode( function ( { Then, When, Given } ) { Given( /^I am in a wiki that has categories$/, () => { iAmInAWikiThatHasCategories( 'Selenium categories test page' ); } ); + Given( /^I am on a page that has the following edits:$/, iAmOnAPageThatHasTheFollowingEdits ); // history steps + When( /^I open the latest diff$/, iOpenTheLatestDiff ); When( /^I click on the history link in the last modified bar$/, iClickOnTheHistoryLinkInTheLastModifiedBar ); + // diff steps + Then( /^I should see "(.*?)" as added content$/, iShouldSeeAddedContent ); + Then( /^I should see "(.*?)" as removed content$/, iShouldSeeRemovedContent ); + // Category steps When( /^I click on the category button$/, iClickOnTheCategoryButton ); diff --git a/tests/selenium/features/support/pages/diff_page.js b/tests/selenium/features/support/pages/diff_page.js new file mode 100644 index 0000000..34f5abd --- /dev/null +++ b/tests/selenium/features/support/pages/diff_page.js @@ -0,0 +1,17 @@ +/** + * Represents a page showing the difference between two revisions + * + * @extends Page + * @example + * https://en.m.wikipedia.org/w/index.php?title=Barack_Obama&type=revision&diff=833886807&oldid=833885770&diffmode=source + */ + +const { Page } = require( './mw_core_pages' ); + +class DiffPage extends Page { + + get inserted_content_element() { return $( 'ins' ); } + get deleted_content_element() { return $( 'del' ); } +} + +module.exports = new DiffPage(); diff --git a/tests/selenium/features/support/pages/minerva_pages.js b/tests/selenium/features/support/pages/minerva_pages.js index 4fc39ed..4b72491 100644 --- a/tests/selenium/features/support/pages/minerva_pages.js +++ b/tests/selenium/features/support/pages/minerva_pages.js @@ -3,5 +3,8 @@ * To simplify imports in world.js. */ module.exports = { - ArticlePage: require( './article_page' ) + ArticlePage: require( './article_page' ), + SpecialHistoryPage: require( './special_history_page' ), + SpecialMobileDiffPage: require( './special_mobilediff_page' ), + DiffPage: require( './diff_page' ) }; diff --git a/tests/selenium/features/support/pages/special_history_page.js b/tests/selenium/features/support/pages/special_history_page.js new file mode 100644 index 0000000..b54c4ab --- /dev/null +++ b/tests/selenium/features/support/pages/special_history_page.js @@ -0,0 +1,27 @@ +const { Page } = require( './mw_core_pages' ); +/** + * Represents the mobile-first Special:History page + * + * @extends Page + * @example + * https://en.m.wikipedia.org/wiki/Special:History/Barack_Obama + */ +class SpecialHistoryPage extends Page { + + get content_header_bar_element() { return $( '.content-header' ); } + get content_header_bar_link_element() { return $( '.content-header a' ); } + get side_list_element() { return $( '.side-list' ); } + get last_contribution_element() { return $( '.side-list li' ); } + get last_contribution_link_element() { return $( '.side-list li a' ); } + get last_contribution_title_element() { return $( '.side-list li h3' ); } + get last_contribution_timestamp_element() { return $( '.side-list li p.timestamp' ); } + get last_contribution_edit_summary_element() { return $( '.side-list li p.edit-summary' ); } + get last_contribution_username_element() { return $( '.side-list li p.mw-mf-user' ); } + get more_link_element() { return $( '.more' ); } + + open() { + super.open( 'Special:History' ); + } +} + +module.exports = new SpecialHistoryPage(); diff --git a/tests/selenium/features/support/pages/special_mobilediff_page.js b/tests/selenium/features/support/pages/special_mobilediff_page.js new file mode 100644 index 0000000..46e67c5 --- /dev/null +++ b/tests/selenium/features/support/pages/special_mobilediff_page.js @@ -0,0 +1,16 @@ +/** + * Represents the mobile-first Special:MobileDiff page + * + * @extends Page + * @example + * https://en.m.wikipedia.org/wiki/Special:MobileDiff/833886807 + */ + +const { Page } = require( './mw_core_pages' ); + +class SpecialMobileDiffPage extends Page { + + get user_info_element() { return $( '#mw-mf-userinfo' ); } +} + +module.exports = new SpecialMobileDiffPage(); diff --git a/tests/selenium/specs/diff.js b/tests/selenium/specs/diff.js new file mode 100644 index 0000000..7bf4568 --- /dev/null +++ b/tests/selenium/specs/diff.js @@ -0,0 +1,29 @@ +const { iAmOnAPageThatHasTheFollowingEdits + } = require( '../features/step_definitions/create_page_api_steps' ), + { + iAmLoggedIntoTheMobileWebsite + } = require( '../features/step_definitions/common_steps' ), + { + iShouldSeeAddedContent, iShouldSeeRemovedContent + } = require( '../features/step_definitions/diff_steps' ), + { + iOpenTheLatestDiff, + iClickOnTheHistoryLinkInTheLastModifiedBar + } = require( '../features/step_definitions/history_steps' ); + +describe( 'Page diff', () => { + it( 'Added and removed content', () => { + iAmLoggedIntoTheMobileWebsite(); + iAmOnAPageThatHasTheFollowingEdits( { + rawTable: [ + [ ' text ' ], + [ ' ABC DEF ' ], + [ ' ABC GHI ' ] + ] + } ); + iClickOnTheHistoryLinkInTheLastModifiedBar(); + iOpenTheLatestDiff(); + iShouldSeeAddedContent( 'GHI' ); + iShouldSeeRemovedContent( 'DEF' ); + } ); +} );