jenkins-bot has submitted this change and it was merged.

Change subject: Login helper for fast API-based authentication
......................................................................


Login helper for fast API-based authentication

The `LoginHelper` provides a `log_in` method that authenticates via the
API and adds the resulting cookies to the current browser instance.

This technique is a much faster way to satisfy an initial logged in
precondition and should speed up a large number of end-to-end MediaWiki
tests. It also has the added benefit of not exposing credentials in the
Selenium log.

Bug: T112908
Change-Id: I66002f5b824c2097effb8f9feda42e99b01074ba
---
A features/login_helper.feature
A features/step_definitions/login_helper_steps.rb
M lib/mediawiki_selenium.rb
M lib/mediawiki_selenium/cucumber/env.rb
M lib/mediawiki_selenium/environment.rb
A lib/mediawiki_selenium/helpers/login_helper.rb
M lib/mediawiki_selenium/step_definitions/login_steps.rb
M mediawiki_selenium.gemspec
8 files changed, 67 insertions(+), 5 deletions(-)

Approvals:
  Zfilipin: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/features/login_helper.feature b/features/login_helper.feature
new file mode 100644
index 0000000..b69f213
--- /dev/null
+++ b/features/login_helper.feature
@@ -0,0 +1,15 @@
+Feature: Login Helper
+
+  Background:
+    Given I have configured my environment from `ENV` and with:
+      """
+      user_factory: true
+      """
+      And I have set "MEDIAWIKI_API_URL" in my shell
+      And I have set "MEDIAWIKI_URL" in my shell
+      And I am using the user factory
+      And I am using the login helper
+
+  Scenario: Login helper logs in in via the API
+    When I log in via the helper method
+    Then I should be logged in to the wiki
diff --git a/features/step_definitions/login_helper_steps.rb 
b/features/step_definitions/login_helper_steps.rb
new file mode 100644
index 0000000..8a5bb05
--- /dev/null
+++ b/features/step_definitions/login_helper_steps.rb
@@ -0,0 +1,11 @@
+Given(/^I am using the login helper$/) do
+  @env.extend(MediawikiSelenium::LoginHelper)
+end
+
+When(/^I log in via the helper method$/) do
+  @env.log_in
+end
+
+Then(/^I should be logged in to the wiki$/) do
+  expect(@env.browser.element(id: 'pt-logout')).to be_present
+end
diff --git a/lib/mediawiki_selenium.rb b/lib/mediawiki_selenium.rb
index c32c8fd..659828d 100644
--- a/lib/mediawiki_selenium.rb
+++ b/lib/mediawiki_selenium.rb
@@ -6,6 +6,7 @@
   autoload :Environment, 'mediawiki_selenium/environment'
   autoload :HeadlessHelper, 'mediawiki_selenium/helpers/headless_helper'
   autoload :Initializer, 'mediawiki_selenium/initializer'
+  autoload :LoginHelper, 'mediawiki_selenium/helpers/login_helper'
   autoload :PageFactory, 'mediawiki_selenium/page_factory'
   autoload :Raita, 'mediawiki_selenium/raita'
   autoload :RemoteBrowserFactory, 'mediawiki_selenium/remote_browser_factory'
diff --git a/lib/mediawiki_selenium/cucumber/env.rb 
b/lib/mediawiki_selenium/cucumber/env.rb
index a6ec7af..8309cee 100644
--- a/lib/mediawiki_selenium/cucumber/env.rb
+++ b/lib/mediawiki_selenium/cucumber/env.rb
@@ -5,6 +5,7 @@
 World { MediawikiSelenium::Environment.load_default }
 
 World(MediawikiSelenium::ApiHelper)
+World(MediawikiSelenium::LoginHelper)
 World(MediawikiSelenium::PageFactory)
 World(MediawikiSelenium::ScreenshotHelper)
 World(MediawikiSelenium::StrictPending)
diff --git a/lib/mediawiki_selenium/environment.rb 
b/lib/mediawiki_selenium/environment.rb
index 3da2f1d..7fd6cb4 100644
--- a/lib/mediawiki_selenium/environment.rb
+++ b/lib/mediawiki_selenium/environment.rb
@@ -437,7 +437,7 @@
     # @yield [url]
     # @yieldparam url [String] Wiki URL.
     #
-    def visit_wiki(id)
+    def visit_wiki(id = nil)
       on_wiki(id) do |url|
         browser.goto url
         yield url if block_given?
diff --git a/lib/mediawiki_selenium/helpers/login_helper.rb 
b/lib/mediawiki_selenium/helpers/login_helper.rb
new file mode 100644
index 0000000..9649744
--- /dev/null
+++ b/lib/mediawiki_selenium/helpers/login_helper.rb
@@ -0,0 +1,36 @@
+require 'uri'
+
+module MediawikiSelenium
+  # Expepiates logging in to wikis by authenticating with the MW API and
+  # transfering the returned cookie to the current browser.
+  #
+  module LoginHelper
+    # Authenticate with the current wiki's API and save the resulting cookie
+    # in the current browser.
+    #
+    # @param cookies [Hash] Extra cookies to set.
+    #
+    def log_in(cookies = {})
+      visit_wiki do |url|
+        uri = URI.parse(url)
+
+        options = {}
+        options[:domain] = uri.host unless ['localhost', 
'127.0.0.1'].include?(uri.host)
+
+        api.cookies.each do |cookie|
+          browser.cookies.add cookie.name, cookie.value, options.merge({
+            secure: cookie.secure,
+            path: cookie.path,
+            expires: cookie.expires
+          })
+        end
+
+        cookies.each do |name, value|
+          browser.cookies.add name.to_s, value, options
+        end
+
+        browser.refresh
+      end
+    end
+  end
+end
diff --git a/lib/mediawiki_selenium/step_definitions/login_steps.rb 
b/lib/mediawiki_selenium/step_definitions/login_steps.rb
index 8cb9f91..15ee00f 100644
--- a/lib/mediawiki_selenium/step_definitions/login_steps.rb
+++ b/lib/mediawiki_selenium/step_definitions/login_steps.rb
@@ -1,5 +1,3 @@
 Given(/^I am logged in(?: as (\w+))?$/) do |user|
-  as_user(user) do |user, password|
-    visit(LoginPage).login_with(user, password)
-  end
+  as_user(user) { log_in }
 end
diff --git a/mediawiki_selenium.gemspec b/mediawiki_selenium.gemspec
index 6bb7269..8526d32 100644
--- a/mediawiki_selenium.gemspec
+++ b/mediawiki_selenium.gemspec
@@ -30,7 +30,7 @@
   spec.add_runtime_dependency 'cucumber', '~> 1.3', '>= 1.3.20'
   spec.add_runtime_dependency 'headless', '~> 2.0', '>= 2.1.0'
   spec.add_runtime_dependency 'json', '~> 1.8', '>= 1.8.1'
-  spec.add_runtime_dependency 'mediawiki_api', '~> 0.4', '>= 0.4.1'
+  spec.add_runtime_dependency 'mediawiki_api', '~> 0.5', '>= 0.5.0'
   spec.add_runtime_dependency 'page-object', '~> 1.0'
   spec.add_runtime_dependency 'rest-client', '~> 1.6', '>= 1.6.7'
   spec.add_runtime_dependency 'rspec-core', '~> 2.14', '>= 2.14.4'

-- 
To view, visit https://gerrit.wikimedia.org/r/226950
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I66002f5b824c2097effb8f9feda42e99b01074ba
Gerrit-PatchSet: 7
Gerrit-Project: mediawiki/selenium
Gerrit-Branch: master
Gerrit-Owner: Dduvall <[email protected]>
Gerrit-Reviewer: CSteipp <[email protected]>
Gerrit-Reviewer: Dduvall <[email protected]>
Gerrit-Reviewer: Hashar <[email protected]>
Gerrit-Reviewer: Jdlrobson <[email protected]>
Gerrit-Reviewer: Sbisson <[email protected]>
Gerrit-Reviewer: Zfilipin <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to