diff --git a/tests/browser/features/editor_wikitext_nosave.feature b/tests/selenium/features/editor_wikitext_nosave.feature similarity index 100% rename from tests/browser/features/editor_wikitext_nosave.feature rename to tests/selenium/features/editor_wikitext_nosave.feature diff --git a/tests/browser/features/mainmenu_loggedin.feature b/tests/selenium/features/mainmenu_loggedin.feature similarity index 80% rename from tests/browser/features/mainmenu_loggedin.feature rename to tests/selenium/features/mainmenu_loggedin.feature index 3e3c984..7929df9 100644 --- a/tests/browser/features/mainmenu_loggedin.feature +++ b/tests/selenium/features/mainmenu_loggedin.feature @@ -16,9 +16,4 @@ Feature: Menus open correct page for anonymous users And I should see a link to "Settings" in the main navigation menu And I should see a link to "Contributions" in the main navigation menu And I should see a link to "Watchlist" in the main navigation menu - - @extension-geodata - Scenario: Nearby link in menu - Given at least one article with geodata exists - When I click on the main navigation button - Then I should see a link to "Nearby" in the main navigation menu + And I should see a link to "Nearby" in the main navigation menu diff --git a/tests/browser/features/search_loggedin.feature b/tests/selenium/features/search_loggedin.feature similarity index 100% rename from tests/browser/features/search_loggedin.feature rename to tests/selenium/features/search_loggedin.feature diff --git a/tests/selenium/features/step_definitions/common_steps.js b/tests/selenium/features/step_definitions/common_steps.js index 695cff1..d967b2e 100644 --- a/tests/selenium/features/step_definitions/common_steps.js +++ b/tests/selenium/features/step_definitions/common_steps.js @@ -71,6 +71,12 @@ const iShouldSeeAToastNotification = () => { ArticlePage.notification_element.waitForVisible(); }; +const iShouldSeeAToastNotificationWithMessage = ( msg ) => { + iShouldSeeAToastNotification(); + const notificationBody = ArticlePage.notification_element.element( '.mw-notification-content' ); + assert.strictEqual( notificationBody.getText().indexOf( msg ) > -1, true ); +}; + const iClickTheBrowserBackButton = () => { browser.back(); }; @@ -86,17 +92,24 @@ const iSeeAnOverlay = () => { }; const iDoNotSeeAnOverlay = () => { + waitForPropagation( 5000 ); browser.waitUntil( () => !ArticlePageWithOverlay.overlay_element.isVisible() ); assert.strictEqual( ArticlePageWithOverlay.overlay_element.isVisible(), false ); }; +const iAmUsingMobileScreenResolution = () => { + browser.setViewportSize( { width: 320, height: 480 }, true ); +}; + module.exports = { waitForPropagation, + iAmUsingMobileScreenResolution, iSeeAnOverlay, iDoNotSeeAnOverlay, iClickTheOverlayCloseButton, iClickTheBrowserBackButton, createPage, createPages, pageExists, iAmOnAPageThatDoesNotExist, iShouldSeeAToastNotification, + iShouldSeeAToastNotificationWithMessage, iAmLoggedIntoTheMobileWebsite, iAmUsingTheMobileSite, iAmLoggedIn, iAmOnPage, iAmInBetaMode 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 82d7dce..7c45d9f 100644 --- a/tests/selenium/features/step_definitions/create_page_api_steps.js +++ b/tests/selenium/features/step_definitions/create_page_api_steps.js @@ -1,5 +1,6 @@ const { api, ArticlePage } = require( '../support/world' ); const Api = require( 'wdio-mediawiki/Api' ); +const Page = require( 'wdio-mediawiki/Page' ); const { iAmOnPage, waitForPropagation, @@ -65,9 +66,48 @@ const iGoToAPageThatHasLanguages = () => { } ); }; +const watch = ( title ) => { + // Ideally this would use the API but mwbot / Selenium's API can't do this right now + // So we run the non-js workflow. + const page = new Page(); + page.openTitle( title, { action: 'watch' } ); + browser.element( '#mw-content-text button[type="submit"]' ).click(); + waitForPropagation( 10000 ); +}; + +const iAmViewingAWatchedPage = () => { + const title = `I am on the "Selenium mobile watched page test ${new Date().getTime()}`; + + createPage( title, 'watch test' ).then( () => { + watch( title ); + // navigate away from page + iAmOnPage( 'Main Page' ); + waitForPropagation( 5000 ); + // and back to page + iAmOnPage( title ); + waitForPropagation( 5000 ); + } ); +}; + +const iAmViewingAnUnwatchedPage = () => { + // new pages are watchable but unwatched by default + const title = 'I am on the "Selenium mobile unwatched test ' + new Date(); + iAmOnPage( title ); +}; + +const iAmOnAPageWithNoTalkTopics = () => { + const title = `Selenium talk test ${new Date()}`; + + createPage( title, 'Selenium' ); + iAmOnPage( title ); +}; + module.exports = { waitForPropagation, iAmOnAPageThatHasTheFollowingEdits, + iAmOnAPageWithNoTalkTopics, + iAmViewingAWatchedPage, + iAmViewingAnUnwatchedPage, iAmInAWikiThatHasCategories, iGoToAPageThatHasLanguages }; diff --git a/tests/selenium/features/step_definitions/index.js b/tests/selenium/features/step_definitions/index.js index 54b7c3b..aff3b9e 100644 --- a/tests/selenium/features/step_definitions/index.js +++ b/tests/selenium/features/step_definitions/index.js @@ -4,10 +4,14 @@ const { defineSupportCode } = require( 'cucumber' ), } = require( './category_steps' ), { iAmInAWikiThatHasCategories, iAmOnAPageThatHasTheFollowingEdits, + iAmOnAPageWithNoTalkTopics, + iAmViewingAWatchedPage, iAmViewingAnUnwatchedPage, iGoToAPageThatHasLanguages } = require( './create_page_api_steps' ), { pageExists, iAmOnAPageThatDoesNotExist, iShouldSeeAToastNotification, + iShouldSeeAToastNotificationWithMessage, iAmUsingMobileScreenResolution, iAmUsingTheMobileSite, iClickTheBrowserBackButton, + iClickTheOverlayCloseButton, iDoNotSeeAnOverlay, iAmLoggedIntoTheMobileWebsite, iAmOnPage, iAmInBetaMode } = require( './common_steps' ), @@ -21,6 +25,32 @@ const { defineSupportCode } = require( 'cucumber' ), iTypeIntoTheEditor, iClickContinue, iClickSubmit, iSayOkayInTheConfirmDialog, theTextOfTheFirstHeadingShouldBe, thereShouldBeARedLinkWithText } = require( './editor_steps' ), + { + theWatchstarShouldNotBeSelected, theWatchstarShouldBeSelected, + iClickTheWatchstar, iClickTheUnwatchStar } = require( './watch_steps' ), + { iVisitMyUserPage, iShouldBeOnMyUserPage, thereShouldBeALinkToMyUploads, + thereShouldBeALinkToMyContributions, thereShouldBeALinkToMyTalkPage + } = require( './user_page_steps' ), + { + iClickTheSearchIcon, + iTypeIntoTheSearchBox, + iClickASearchWatchstar, + iSeeTheSearchOverlay + } = require( './search_steps' ), + { + iClickTheTalkButton, + iAddATopic, + iSeeTheTalkOverlay, + thereShouldBeASaveDiscussionButton, + noTopicIsPresent, + thereShouldBeAnAddDiscussionButton, + thereShouldBeNoTalkButton, + iShouldSeeTheTopicInTheListOfTopics + } = require( './talk_steps' ), + { iSeeALinkToAboutPage, iShouldSeeAUserPageLinkInMenu, + iClickOnTheMainNavigationButton, + iShouldSeeALinkInMenu, iShouldSeeALinkToDisclaimer + } = require( './menu_steps' ), { iHaveNoNotifications, iClickOnTheNotificationIcon, iShouldSeeTheNotificationsOverlay, iClickTheNotificationsOverlayCloseButton, iShouldNotSeeTheNotificationsOverlay @@ -39,12 +69,15 @@ defineSupportCode( function ( { Then, When, Given } ) { When( /^I click continue$/, iClickContinue ); When( /^I click submit$/, iClickSubmit ); When( /^I say OK in the confirm dialog$/, iSayOkayInTheConfirmDialog ); + When( /^I click the wikitext editor overlay close button$/, iClickTheOverlayCloseButton ); Then( /^I do not see the wikitext editor overlay$/, iDoNotSeeTheWikitextEditorOverlay ); Then( /^the text of the first heading should be "(.+)"$/, theTextOfTheFirstHeadingShouldBe ); Then( /^there should be a red link with text "(.+)"$/, thereShouldBeARedLinkWithText ); + Then( /^I should not see the wikitext editor overlay$/, iDoNotSeeAnOverlay ); // common steps Given( /^I am using the mobile site$/, iAmUsingTheMobileSite ); + When( /^I am viewing the site in mobile mode$/, iAmUsingMobileScreenResolution ); Given( /^I am in beta mode$/, iAmInBetaMode ); @@ -52,9 +85,11 @@ defineSupportCode( function ( { Then, When, Given } ) { Given( /^I am logged into the mobile website$/, iAmLoggedIntoTheMobileWebsite ); Then( /^I should see a toast notification$/, iShouldSeeAToastNotification ); + Then( /^I should see a toast with message "(.+)"$/, iShouldSeeAToastNotificationWithMessage ); When( /I click the browser back button/, iClickTheBrowserBackButton ); // Page steps + Given( /^I am on a page with no talk topics$/, iAmOnAPageWithNoTalkTopics ); Given( /^I am in a wiki that has categories$/, () => { iAmInAWikiThatHasCategories( 'Selenium categories test page' ); } ); @@ -62,6 +97,8 @@ defineSupportCode( function ( { Then, When, Given } ) { Given( /^I am on a page that does not exist$/, iAmOnAPageThatDoesNotExist ); Given( /^I go to a page that has languages$/, iGoToAPageThatHasLanguages ); Given( /^the page "(.+)" exists$/, pageExists ); + Given( /^I am viewing a watched page$/, iAmViewingAWatchedPage ); + Given( /^I am viewing an unwatched page$/, iAmViewingAnUnwatchedPage ); // history steps When( /^I open the latest diff$/, iOpenTheLatestDiff ); @@ -79,6 +116,43 @@ defineSupportCode( function ( { Then, When, Given } ) { Then( /after 1 seconds I should not see the notifications overlay/, iShouldNotSeeTheNotificationsOverlay ); Then( /I should see the notifications overlay/, iShouldSeeTheNotificationsOverlay ); + // talk + When( /^I click the talk button$/, iClickTheTalkButton ); + When( /^I add a topic called "(.+)"$/, iAddATopic ); + Then( /^I see the talk overlay$/, iSeeTheTalkOverlay ); + Then( /^I should see the talk overlay$/, iSeeTheTalkOverlay ); + Then( /^there should be a save discussion button$/, thereShouldBeASaveDiscussionButton ); + Then( /^no topic is present$/, noTopicIsPresent ); + Then( /^there should be an add discussion button$/, thereShouldBeAnAddDiscussionButton ); + Then( /^there should be no talk button$/, thereShouldBeNoTalkButton ); + Then( /^I should see the topic called "(.+)" in the list of topics$/, iShouldSeeTheTopicInTheListOfTopics ); + + // user page + Given( /^I visit my user page$/, iVisitMyUserPage ); + When( /^I should be on my user page$/, iShouldBeOnMyUserPage ); + Then( /^there should be a link to my uploads$/, thereShouldBeALinkToMyUploads ); + Then( /^there should be a link to my contributions$/, thereShouldBeALinkToMyContributions ); + Then( /^there should be a link to my talk page$/, thereShouldBeALinkToMyTalkPage ); + + // search + When( /^I click the search icon$/, iClickTheSearchIcon ); + When( /^I type into search box "(.+)"$/, iTypeIntoTheSearchBox ); + When( /^I click a search watch star$/, iClickASearchWatchstar ); + Then( /^I see the search overlay$/, iSeeTheSearchOverlay ); + + // main menu + When( /^I click on the main navigation button$/, iClickOnTheMainNavigationButton ); + When( /^I should see a link to the about page$/, iSeeALinkToAboutPage ); + Then( /^I should see a link to my user page in the main navigation menu$/, iShouldSeeAUserPageLinkInMenu ); + Then( /^I should see a link to "(.+)" in the main navigation menu$/, iShouldSeeALinkInMenu ); + Then( /^I should see a link to the disclaimer$/, iShouldSeeALinkToDisclaimer ); + + // watchstar + When( /^I click the watch star$/, iClickTheWatchstar ); + When( /^I click the unwatch star$/, iClickTheUnwatchStar ); + Then( /^the watch star should not be selected$/, theWatchstarShouldNotBeSelected ); + Then( /^the watch star should be selected$/, theWatchstarShouldBeSelected ); + // Category steps When( /^I click on the category button$/, iClickOnTheCategoryButton ); diff --git a/tests/selenium/features/step_definitions/menu_steps.js b/tests/selenium/features/step_definitions/menu_steps.js new file mode 100644 index 0000000..df51736 --- /dev/null +++ b/tests/selenium/features/step_definitions/menu_steps.js @@ -0,0 +1,29 @@ +const assert = require( 'assert' ); +const { ArticlePage } = require( '../support/world.js' ); + +const iSeeALinkToAboutPage = () => { + assert.strictEqual( ArticlePage.menu_element.element( '*=About' ).isVisible(), true ); +}; + +const iClickOnTheMainNavigationButton = () => { + ArticlePage.menu_button_element.click(); +}; + +const iShouldSeeAUserPageLinkInMenu = () => { + ArticlePage.menu_element.element( '.mw-ui-icon-minerva-profile' ); +}; + +const iShouldSeeALinkInMenu = ( text ) => { + assert.strictEqual( ArticlePage.menu_element.element( `=${text}` ).isVisible(), + true, `Link to ${text} is visible.` ); +}; + +const iShouldSeeALinkToDisclaimer = () => { + assert.strictEqual( ArticlePage.menu_element.element( '=Disclaimers' ).isVisible(), true ); +}; + +module.exports = { + iClickOnTheMainNavigationButton, + iSeeALinkToAboutPage, iShouldSeeAUserPageLinkInMenu, + iShouldSeeALinkInMenu, iShouldSeeALinkToDisclaimer +}; diff --git a/tests/selenium/features/step_definitions/search_steps.js b/tests/selenium/features/step_definitions/search_steps.js new file mode 100644 index 0000000..92b80d4 --- /dev/null +++ b/tests/selenium/features/step_definitions/search_steps.js @@ -0,0 +1,38 @@ +const { iSeeAnOverlay } = require( './common_steps' ); +const { ArticlePage } = require( '../support/world.js' ); +const ArticlePageWithOverlay = require( '../support/pages/article_page_with_overlay' ); + +const iClickTheSearchIcon = () => { + ArticlePage.search_icon_element.click(); +}; + +const iTypeIntoTheSearchBox = ( term ) => { + const input = ArticlePageWithOverlay.overlay_element + .element( 'input' ); + input.waitForExist(); + input.setValue( term ); +}; + +const iSeeSearchResults = () => { + ArticlePageWithOverlay.overlay_element + .element( '.page-list' ).waitForExist( 5000 ); +}; + +const iClickASearchWatchstar = () => { + iSeeSearchResults(); + const watchThisArticle = ArticlePageWithOverlay.overlay_element + .element( '.watch-this-article' ); + watchThisArticle.waitForExist( 5000 ); + watchThisArticle.click(); +}; + +const iSeeTheSearchOverlay = () => { + iSeeAnOverlay(); +}; + +module.exports = { + iClickTheSearchIcon, + iTypeIntoTheSearchBox, + iClickASearchWatchstar, + iSeeTheSearchOverlay +}; diff --git a/tests/selenium/features/step_definitions/talk_steps.js b/tests/selenium/features/step_definitions/talk_steps.js new file mode 100644 index 0000000..afe4dae --- /dev/null +++ b/tests/selenium/features/step_definitions/talk_steps.js @@ -0,0 +1,74 @@ +const assert = require( 'assert' ); +const { iSeeAnOverlay, waitForPropagation } = require( './common_steps' ); +const ArticlePageWithEditorOverlay = require( '../support/pages/article_page_with_editor_overlay' ); +const { ArticlePage } = require( '../support/world.js' ); + +const iClickTheTalkButton = () => { + ArticlePage.waitUntilResourceLoaderModuleReady( 'skins.minerva.talk' ); + ArticlePage.talk_element.waitForVisible(); + ArticlePage.talk_element.click(); +}; + +const iAddATopic = ( subject ) => { + ArticlePageWithEditorOverlay.continue_element.waitForVisible(); + ArticlePageWithEditorOverlay.continue_element.click(); + ArticlePageWithEditorOverlay.editor_overlay_element.waitForExist(); + const overlay = ArticlePageWithEditorOverlay.editor_overlay_element; + overlay.element( '.overlay input' ).waitForExist(); + overlay.element( '.overlay input' ).setValue( subject ); + overlay.element( '.overlay textarea' ).setValue( 'Topic body is a really long text.' ); + browser.waitUntil( () => + !ArticlePageWithEditorOverlay.submit_element.getAttribute( 'disabled' ) + ); + ArticlePageWithEditorOverlay.submit_element.click(); + waitForPropagation( 5000 ); +}; + +const iSeeTheTalkOverlay = () => { + iSeeAnOverlay(); +}; + +const thereShouldBeASaveDiscussionButton = () => { + const submit = ArticlePageWithEditorOverlay.submit_element; + submit.waitForExist(); + assert.strictEqual( submit.isVisible(), true ); +}; + +const noTopicIsPresent = () => { + ArticlePageWithEditorOverlay.editor_overlay_element.waitForExist(); + const overlay = ArticlePageWithEditorOverlay.editor_overlay_element; + overlay.element( '.content-header' ).waitForExist(); + assert.strictEqual( + overlay.element( '.content-header' ).getText(), + 'There are no conversations about this page.' + ); +}; + +const thereShouldBeAnAddDiscussionButton = () => { + ArticlePageWithEditorOverlay.continue_element.waitForVisible(); +}; + +const thereShouldBeNoTalkButton = () => { + assert.strictEqual( ArticlePage.talk_element.isVisible(), false ); +}; + +const iShouldSeeTheTopicInTheListOfTopics = ( subject ) => { + ArticlePageWithEditorOverlay.editor_overlay_element.waitForExist(); + ArticlePageWithEditorOverlay.editor_overlay_element.element( '.topic-title-list li' ).waitForExist(); + const firstItem = ArticlePageWithEditorOverlay.editor_overlay_element.element( '.topic-title-list li' ); + assert.strictEqual( + firstItem.getText().indexOf( subject ) > -1, + true + ); +}; + +module.exports = { + iAddATopic, + iSeeTheTalkOverlay, + thereShouldBeASaveDiscussionButton, + noTopicIsPresent, + thereShouldBeAnAddDiscussionButton, + thereShouldBeNoTalkButton, + iShouldSeeTheTopicInTheListOfTopics, + iClickTheTalkButton +}; diff --git a/tests/selenium/features/step_definitions/user_page_steps.js b/tests/selenium/features/step_definitions/user_page_steps.js new file mode 100644 index 0000000..c02eb6a --- /dev/null +++ b/tests/selenium/features/step_definitions/user_page_steps.js @@ -0,0 +1,28 @@ +const assert = require( 'assert' ); +const { ArticlePage } = require( '../support/world.js' ); +const { iAmOnPage } = require( './common_steps' ); +const { theTextOfTheFirstHeadingShouldBe } = require( './editor_steps' ); + +const username = browser.options.username.replace( /_/g, ' ' ); + +const iVisitMyUserPage = () => { + iAmOnPage( `User:${username}` ); +}; + +const iShouldBeOnMyUserPage = () => { + theTextOfTheFirstHeadingShouldBe( username ); +}; + +const thereShouldBeALinkToMyUploads = () => { + assert.strictEqual( ArticlePage.user_links_element.element( '=Uploads' ).isVisible(), true ); +}; + +const thereShouldBeALinkToMyContributions = () => { + assert.strictEqual( ArticlePage.user_links_element.element( '=Contributions' ).isVisible(), true ); +}; +const thereShouldBeALinkToMyTalkPage = () => { + assert.strictEqual( ArticlePage.user_links_element.element( '=Talk' ).isVisible(), true ); +}; + +module.exports = { iVisitMyUserPage, iShouldBeOnMyUserPage, thereShouldBeALinkToMyUploads, + thereShouldBeALinkToMyContributions, thereShouldBeALinkToMyTalkPage }; diff --git a/tests/selenium/features/step_definitions/watch_steps.js b/tests/selenium/features/step_definitions/watch_steps.js new file mode 100644 index 0000000..0852700 --- /dev/null +++ b/tests/selenium/features/step_definitions/watch_steps.js @@ -0,0 +1,30 @@ +const assert = require( 'assert' ); +const { ArticlePage } = require( '../support/world.js' ); + +const theWatchstarShouldNotBeSelected = () => { + ArticlePage.watch_element.waitForExist(); + assert.strictEqual( ArticlePage.watched_element.isExisting(), false, + 'the watched element should not be present' ); +}; + +const theWatchstarShouldBeSelected = () => { + ArticlePage.watched_element.waitForExist(); + const watchstar = ArticlePage.watched_element; + assert.strictEqual( watchstar.isVisible(), true ); +}; + +const iClickTheWatchstar = () => { + ArticlePage.waitUntilResourceLoaderModuleReady( 'skins.minerva.watchstar' ); + ArticlePage.watch_element.waitForExist(); + ArticlePage.watch_element.click(); +}; + +const iClickTheUnwatchStar = () => { + ArticlePage.waitUntilResourceLoaderModuleReady( 'skins.minerva.watchstar' ); + ArticlePage.watch_element.waitForExist(); + ArticlePage.watch_element.click(); +}; + +module.exports = { + theWatchstarShouldNotBeSelected, theWatchstarShouldBeSelected, + iClickTheWatchstar, iClickTheUnwatchStar }; diff --git a/tests/selenium/features/support/pages/article_page.js b/tests/selenium/features/support/pages/article_page.js index 2f3f76e..54fdad1 100644 --- a/tests/selenium/features/support/pages/article_page.js +++ b/tests/selenium/features/support/pages/article_page.js @@ -10,6 +10,13 @@ const MinervaPage = require( './minerva_page' ); class ArticlePage extends MinervaPage { + get watch_element() { return $( '#ca-watch' ); } + get talk_element() { return $( '.talk ' ); } + get watched_element() { return $( '.mw-ui-icon-mf-watched' ); } + get menu_button_element() { return $( '#mw-mf-main-menu-button' ); } + get search_icon_element() { return $( '#searchIcon' ); } + get menu_element() { return $( 'nav' ); } + get user_links_element() { return $( '.user-links' ); } get notifications_button_element() { return $( '.user-button' ); } get category_element() { return $( '.category-button' ); } get edit_link_element() { return $( '#ca-edit' ); } diff --git a/tests/selenium/features/support/pages/article_page_with_editor_overlay.js b/tests/selenium/features/support/pages/article_page_with_editor_overlay.js index 156ecbd..4563752 100644 --- a/tests/selenium/features/support/pages/article_page_with_editor_overlay.js +++ b/tests/selenium/features/support/pages/article_page_with_editor_overlay.js @@ -10,12 +10,12 @@ const MinervaPage = require( './minerva_page' ); class ArticlePageWithEditorOverlay extends MinervaPage { - get editor_overlay_element() { return $( '.editor-overlay' ); } + get editor_overlay_element() { return $( '.overlay' ); } // overlay components - get editor_textarea_element() { return $( '.editor-overlay .wikitext-editor' ); } - get continue_element() { return $( '.editor-overlay .continue' ); } - get submit_element() { return $( '.editor-overlay .submit' ); } + get editor_textarea_element() { return $( '.overlay .wikitext-editor' ); } + get continue_element() { return $( '.overlay .continue' ); } + get submit_element() { return $( '.overlay .submit' ); } } module.exports = new ArticlePageWithEditorOverlay(); diff --git a/tests/selenium/features/support/pages/article_page_with_overlay.js b/tests/selenium/features/support/pages/article_page_with_overlay.js index 50e82fc..c6512e0 100644 --- a/tests/selenium/features/support/pages/article_page_with_overlay.js +++ b/tests/selenium/features/support/pages/article_page_with_overlay.js @@ -13,6 +13,7 @@ class ArticlePageWithOverlay extends MinervaPage { get overlay_element() { return $( '.overlay' ); } // overlay components + get overlay_content_element() { return $( '.overlay-content' ); } get overlay_close_element() { return $( '.overlay .cancel' ); } } diff --git a/tests/browser/features/talk.feature b/tests/selenium/features/talk.feature similarity index 89% rename from tests/browser/features/talk.feature rename to tests/selenium/features/talk.feature index 61ef79b..7fda0b5 100644 --- a/tests/browser/features/talk.feature +++ b/tests/selenium/features/talk.feature @@ -31,14 +31,13 @@ Feature: Talk Scenario: Add topic button shows on talk pages for logged in users Given the page "Talk:Selenium talk test" exists And I am logged into the mobile website - And I am on the "Talk:Selenium UI test" page + And I am on the "Talk:Selenium talk test" page When I click the talk button Then there should be a save discussion button Scenario: A newly created topic appears in the list of topics immediately - Given the page "Talk:Selenium talk test" exists - And I am logged into the mobile website - And the page "Selenium talk test" exists + Given I am logged into the mobile website + And I am on a page with no talk topics When I click the talk button And I see the talk overlay And no topic is present diff --git a/tests/browser/features/user_page.feature b/tests/selenium/features/user_page.feature similarity index 100% rename from tests/browser/features/user_page.feature rename to tests/selenium/features/user_page.feature diff --git a/tests/browser/features/watchstar.feature b/tests/selenium/features/watchstar.feature similarity index 70% rename from tests/browser/features/watchstar.feature rename to tests/selenium/features/watchstar.feature index 227c1c7..7762912 100644 --- a/tests/browser/features/watchstar.feature +++ b/tests/selenium/features/watchstar.feature @@ -7,11 +7,11 @@ Feature: Manage Watchlist Scenario: Add an article to the watchlist Given I am viewing an unwatched page When I click the watch star - Then I should see a toast with message "Added Selenium mobile watch test to your watchlist" + Then I should see a toast with message "Added" And the watch star should be selected Scenario: Remove an article from the watchlist Given I am viewing a watched page When I click the unwatch star - Then I should see a toast with message "Removed Selenium mobile watch test from your watchlist" + Then I should see a toast with message "Removed" And the watch star should not be selected diff --git a/tests/selenium/specs/editor_wikitext_nosave.js b/tests/selenium/specs/editor_wikitext_nosave.js new file mode 100644 index 0000000..3f629cb --- /dev/null +++ b/tests/selenium/specs/editor_wikitext_nosave.js @@ -0,0 +1,31 @@ +const { + iAmOnAPageThatDoesNotExist, iClickTheBrowserBackButton, + iClickTheOverlayCloseButton, iDoNotSeeAnOverlay, + iAmLoggedIntoTheMobileWebsite + } = require( '../features/step_definitions/common_steps' ), + { + iClickTheEditButton, iSeeTheWikitextEditorOverlay + } = require( '../features/step_definitions/editor_steps' ); + +// @chrome @en.m.wikipedia.beta.wmflabs.org @firefox @test2.m.wikipedia.org @vagrant @login +describe( 'Wikitext Editor', () => { + + beforeEach( () => { + iAmLoggedIntoTheMobileWebsite(); + iAmOnAPageThatDoesNotExist(); + iClickTheEditButton(); + iSeeTheWikitextEditorOverlay(); + } ); + + // @smoke + it( 'Closing editor (overlay button)', () => { + iClickTheOverlayCloseButton(); + iDoNotSeeAnOverlay(); + } ); + + it( 'Closing editor (browser button)', () => { + iClickTheBrowserBackButton(); + iDoNotSeeAnOverlay(); + } ); + +} ); diff --git a/tests/selenium/specs/mainmenu_loggedin.js b/tests/selenium/specs/mainmenu_loggedin.js new file mode 100644 index 0000000..6822bec --- /dev/null +++ b/tests/selenium/specs/mainmenu_loggedin.js @@ -0,0 +1,34 @@ +const { + iAmLoggedIntoTheMobileWebsite, + iAmOnPage + } = require( '../features/step_definitions/common_steps' ), + { iSeeALinkToAboutPage, iShouldSeeAUserPageLinkInMenu, + iClickOnTheMainNavigationButton, + iShouldSeeALinkInMenu, iShouldSeeALinkToDisclaimer + } = require( '../features/step_definitions/menu_steps' ); + +// @chrome @en.m.wikipedia.beta.wmflabs.org @firefox @test2.m.wikipedia.org @vagrant @login +describe( 'Menus open correct page for anonymous users', () => { + + beforeEach( () => { + iAmLoggedIntoTheMobileWebsite(); + iAmOnPage( 'Main Page' ); + } ); + + it( 'Check links in menu', () => { + iClickOnTheMainNavigationButton(); + iShouldSeeALinkToDisclaimer(); + iShouldSeeAUserPageLinkInMenu(); + iSeeALinkToAboutPage(); + [ 'Log out', 'Home', 'Random', 'Settings', 'Contributions', + 'Watchlist' ].forEach( ( label ) => { + iShouldSeeALinkInMenu( label ); + } ); + try { + iShouldSeeALinkInMenu( 'Nearby' ); + } catch ( e ) { + // eslint-disable-next-line no-console + console.warn( 'Nearby item will only appear in main menu if $wgMFNearby is configured' ); + } + } ); +} ); diff --git a/tests/selenium/specs/search_loggedin.js b/tests/selenium/specs/search_loggedin.js new file mode 100644 index 0000000..1e998d7 --- /dev/null +++ b/tests/selenium/specs/search_loggedin.js @@ -0,0 +1,30 @@ +const { + pageExists, iShouldSeeAToastNotification, + iAmUsingMobileScreenResolution, + iAmUsingTheMobileSite, + iAmLoggedIntoTheMobileWebsite, + iAmOnPage + } = require( '../features/step_definitions/common_steps' ), + { + iClickTheSearchIcon, + iTypeIntoTheSearchBox, + iClickASearchWatchstar, + iSeeTheSearchOverlay + } = require( '../features/step_definitions/search_steps' ); + +// @test2.m.wikipedia.org @vagrant @login +describe( 'Search', () => { + + it( 'Clicking on a watchstar toggles the watchstar', () => { + iAmUsingTheMobileSite(); + pageExists( 'Selenium search test' ); + iAmLoggedIntoTheMobileWebsite(); + iAmOnPage( 'Main Page' ); + iAmUsingMobileScreenResolution(); + iClickTheSearchIcon(); + iSeeTheSearchOverlay(); + iTypeIntoTheSearchBox( 'Selenium search tes' ); + iClickASearchWatchstar(); + iShouldSeeAToastNotification(); + } ); +} ); diff --git a/tests/selenium/specs/talk.js b/tests/selenium/specs/talk.js new file mode 100644 index 0000000..ef0b5b7 --- /dev/null +++ b/tests/selenium/specs/talk.js @@ -0,0 +1,76 @@ +const { iAmOnAPageWithNoTalkTopics } = require( '../features/step_definitions/create_page_api_steps' ), + { + pageExists, iAmOnAPageThatDoesNotExist, + iAmUsingTheMobileSite, + iAmLoggedIntoTheMobileWebsite, + iAmOnPage + } = require( '../features/step_definitions/common_steps' ), + { + iClickTheTalkButton, + iAddATopic, + iSeeTheTalkOverlay, + thereShouldBeASaveDiscussionButton, + noTopicIsPresent, + thereShouldBeAnAddDiscussionButton, + thereShouldBeNoTalkButton, + iShouldSeeTheTopicInTheListOfTopics + } = require( '../features/step_definitions/talk_steps' ); + +// @chrome @en.m.wikipedia.beta.wmflabs.org @firefox @test2.m.wikipedia.org @vagrant +describe( 'Talk', () => { + + beforeEach( () => { + iAmUsingTheMobileSite(); + pageExists( 'Talk:Selenium talk test' ); + pageExists( 'Selenium talk test' ); + } ); + + it( 'Add discussion on talk page not possible as logged out user', () => { + iAmOnPage( 'Selenium talk test' ); + thereShouldBeNoTalkButton(); + } ); + + // @login + it( 'Talk on a page that does exist', () => { + iAmLoggedIntoTheMobileWebsite(); + iAmOnPage( 'Selenium talk test' ); + iClickTheTalkButton(); + iSeeTheTalkOverlay(); + } ); + + // @login + it( 'Talk on a page that doesn\'t exist (bug 64268)', () => { + iAmLoggedIntoTheMobileWebsite(); + iAmOnAPageThatDoesNotExist(); + iClickTheTalkButton(); + iSeeTheTalkOverlay(); + } ); + + // @smoke @login + it( 'Add discussion for talk page possible as logged in user', () => { + iAmLoggedIntoTheMobileWebsite(); + iAmOnPage( 'Selenium talk test' ); + iClickTheTalkButton(); + thereShouldBeAnAddDiscussionButton(); + } ); + + // @smoke @login + it( 'Add topic button shows on talk pages for logged in users', () => { + iAmLoggedIntoTheMobileWebsite(); + iAmOnAPageThatDoesNotExist(); + iAmOnPage( 'Talk:Selenium talk test' ); + iClickTheTalkButton(); + thereShouldBeASaveDiscussionButton(); + } ); + + it( 'A newly created topic appears in the list of topics immediately', () => { + iAmLoggedIntoTheMobileWebsite(); + iAmOnAPageWithNoTalkTopics(); + iClickTheTalkButton(); + iSeeTheTalkOverlay(); + noTopicIsPresent(); + iAddATopic( 'New topic' ); + iShouldSeeTheTopicInTheListOfTopics( 'New topic' ); + } ); + +} ); diff --git a/tests/selenium/specs/user_page.js b/tests/selenium/specs/user_page.js new file mode 100644 index 0000000..6f04fe6 --- /dev/null +++ b/tests/selenium/specs/user_page.js @@ -0,0 +1,21 @@ +const { iAmLoggedIntoTheMobileWebsite } = require( '../features/step_definitions/common_steps' ), + { iVisitMyUserPage, iShouldBeOnMyUserPage, thereShouldBeALinkToMyUploads, + thereShouldBeALinkToMyContributions, thereShouldBeALinkToMyTalkPage + } = require( '../features/step_definitions/user_page_steps' ); + +// @chrome @firefox @login @test2.m.wikipedia.org @vagrant +describe( 'User:', () => { + + beforeEach( () => { + iAmLoggedIntoTheMobileWebsite(); + iVisitMyUserPage(); + } ); + + // @en.m.wikipedia.beta.wmflabs.org + it( 'Check components in user page', () => { + iShouldBeOnMyUserPage(); + thereShouldBeALinkToMyTalkPage(); + thereShouldBeALinkToMyContributions(); + thereShouldBeALinkToMyUploads(); + } ); +} ); diff --git a/tests/selenium/specs/watchstar.js b/tests/selenium/specs/watchstar.js new file mode 100644 index 0000000..438c8f7 --- /dev/null +++ b/tests/selenium/specs/watchstar.js @@ -0,0 +1,31 @@ +const { iAmViewingAWatchedPage, + iAmViewingAnUnwatchedPage } = require( '../features/step_definitions/create_page_api_steps' ), + { + iShouldSeeAToastNotificationWithMessage, + iAmLoggedIntoTheMobileWebsite + } = require( '../features/step_definitions/common_steps' ), + { + theWatchstarShouldNotBeSelected, theWatchstarShouldBeSelected, + iClickTheWatchstar, iClickTheUnwatchStar } = require( '../features/step_definitions/watch_steps' ); + +// @chrome @smoke @test2.m.wikipedia.org @login @vagrant +describe( 'Manage Watchlist', () => { + + beforeEach( () => { + iAmLoggedIntoTheMobileWebsite(); + } ); + + it( 'Remove an article from the watchlist', () => { + iAmViewingAWatchedPage(); + iClickTheUnwatchStar(); + iShouldSeeAToastNotificationWithMessage( 'Removed' ); + theWatchstarShouldNotBeSelected(); + } ); + + it( 'Add an article to the watchlist', () => { + iAmViewingAnUnwatchedPage(); + iClickTheWatchstar(); + iShouldSeeAToastNotificationWithMessage( 'Added' ); + theWatchstarShouldBeSelected(); + } ); +} );