mediawiki_selenium 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 726360dc3c099dde3ad6827c181be19adbfa5e54
4
- data.tar.gz: f6e3f6a52f72b471183508046d9b59f48af103bd
3
+ metadata.gz: 329d08a407bf34d62782833f29ddc148c36e75c0
4
+ data.tar.gz: 34f4f2700b159884ddb8b5e6ddf77c935c8fd9ee
5
5
  SHA512:
6
- metadata.gz: fb1180596eb74635fa300f438453f691d69dcdc31cb880e01e1eaf863416c68f20f9291aaf294ddfd876f8a96eae6399361fcc35ddbbcdbbd9ea39c3d1d49ae2
7
- data.tar.gz: 44e1fb0e9c836131336baf5015fa8875c48cd2b293b6db05aa832db1a5b9233370070d73b550bb9914992f50063d3fccd06f198fb8e239f52b0c2ae67a279f4c
6
+ metadata.gz: b87efa97ee1d7ad227c7d30264daf1b1144a0cedaf3ccb46495a5a68081781fe8ae4cab1db855d7b5dfce880c7ede665e3de58736a4582a521c847c1f16b43e3
7
+ data.tar.gz: 84993de521a0a42243a8420d91fdb6a41eef45abbc9281a356197968715652b9b5fad2f809799ec5d716b18e4e081da249c8dd248d3865baff9d26be6aea78b8
data/README.md CHANGED
@@ -37,7 +37,7 @@ Create a `Gemfile` in the root of your MediaWiki-related project that
37
37
  specifies the version of `mediawiki_selenium` you wish to use (typically the
38
38
  latest version).
39
39
 
40
- gem 'mediawiki_selenium', '~> 1.3.0'
40
+ gem 'mediawiki_selenium', '~> 1.4.0'
41
41
 
42
42
  Install the gem and its dependencies by running `bundle install`. (If
43
43
  [Bundler](http://bundler.io/) is not yet installed, install it with
@@ -169,6 +169,30 @@ behavior.
169
169
  # Keep xvfb running after execution (the default is to kill it)
170
170
  HEADLESS_DESTROY_AT_EXIT=false bundle exec cucumber ...
171
171
 
172
+ ### User Factory
173
+
174
+ Setting `user_factory` to `true` for an environment in your `environments.yml`
175
+ will enable the {MediawikiSelenium::UserFactoryHelper} module. The module
176
+ automatically creates accounts referenced in tests (calls to the `user`,
177
+ `password`, or `as_user` methods) using the MW API, and randomizes the actual
178
+ user names.
179
+
180
+ These randomized fixtures can greatly improve the atomicity/isolation of your
181
+ scenarios, ensuring control over the initial user state (e.g. an edit count
182
+ of 0) or allowing scenarios to run in parallel on the same MW installation.
183
+
184
+ Note that using this feature will result in a large number of accounts being
185
+ created for each run. You'll typically want to enable this feature only for
186
+ environments like CI (`integration`) or perhaps your local MW-Vagrant.
187
+
188
+ integration:
189
+ user_factory: true
190
+ # ...
191
+
192
+ mw-vagrant-host:
193
+ user_factory: true
194
+ # ...
195
+
172
196
  ### Screenshots
173
197
 
174
198
  You can get screenshots on failures by setting the environment
@@ -199,9 +223,17 @@ See https://www.mediawiki.org/wiki/Gerrit
199
223
 
200
224
  ## Release notes
201
225
 
226
+ ### 1.4.0 2015-06-26
227
+ * New user factory module provides account fixtures for a greater level of
228
+ isolation/atomicity between scenarios
229
+ * Updated MediaWiki API client and Cucumber dependencies for various fixes
230
+ * Fixed `PageFactory#on` for cases where it's used before browser
231
+ initialization
232
+ * Implemented integration tests that run against a MediaWiki instance in CI
233
+
202
234
  ### 1.3.0 2015-06-10
203
- * Added {Mediawiki::Environment#override} for overriding environment
204
- configuration at runtime
235
+ * Added `Environment#override` for overriding environment configuration at
236
+ runtime
205
237
  * Removed deprecated `APIPage` page object and updated upgrade docs
206
238
 
207
239
  ### 1.2.1 2015-06-02
data/UPGRADE.md CHANGED
@@ -5,7 +5,7 @@
5
5
  First, update the `Gemfile` in your project's root directory to specify the
6
6
  new version.
7
7
 
8
- gem 'mediawiki_selenium', '~> 1.3.0'
8
+ gem 'mediawiki_selenium', '~> 1.4.0'
9
9
 
10
10
  ## Upgrade gems and dependencies
11
11
 
@@ -0,0 +1,15 @@
1
+ @integration
2
+ Feature: MW API helper
3
+
4
+ Background:
5
+ Given I have configured my environment from `ENV` and with:
6
+ """
7
+ user_factory: true
8
+ """
9
+ And I have set "MEDIAWIKI_URL" in my shell
10
+ And I am using the user factory
11
+ And I am using the API helper
12
+
13
+ Scenario: API helper automatically authenticates
14
+ When I access the API helper
15
+ Then the API client should have authenticated
@@ -0,0 +1,27 @@
1
+ @integration
2
+ Feature: Basic usage
3
+
4
+ Background:
5
+ Given I have configured my environment from `ENV` and with:
6
+ """
7
+ browser: phantomjs
8
+ """
9
+ And I have set "MEDIAWIKI_URL" in my shell
10
+ And I am using a local browser
11
+
12
+ Scenario: The configured browser is used
13
+ When I start interacting with the browser
14
+ Then the browser name is `:phantomjs`
15
+
16
+ Scenario: Browsers are started on-demand
17
+ When I start interacting with the browser
18
+ Then the browser is open
19
+
20
+ Scenario: Browsers are closed automatically
21
+ Given I have started a browser
22
+ When teardown is called
23
+ Then the browser should have closed
24
+
25
+ Scenario: Navigating to the wiki
26
+ When I navigate to the `wiki_url`
27
+ Then the wiki page should have loaded
@@ -0,0 +1,14 @@
1
+ Feature: Remote browser sessions through SauceLabs
2
+
3
+ Background:
4
+ Given I have configured my environment from `ENV` and with:
5
+ """
6
+ browser: firefox
7
+ platform: linux
8
+ """
9
+
10
+ Scenario: SauceLabs sessions start just like a normal browser
11
+ Given I have set "SAUCE_ONDEMAND_USERNAME" in my shell
12
+ And I have set "SAUCE_ONDEMAND_ACCESS_KEY" in my shell
13
+ When I start interacting with the browser
14
+ Then the browser is open
@@ -0,0 +1,11 @@
1
+ Given(/^I am using the API helper$/) do
2
+ @env.extend(MediawikiSelenium::ApiHelper)
3
+ end
4
+
5
+ When(/^I access the API helper$/) do
6
+ @env.api
7
+ end
8
+
9
+ Then(/^the API client should have authenticated$/) do
10
+ expect(@env.api).to be_logged_in
11
+ end
@@ -0,0 +1,37 @@
1
+ require 'uri'
2
+
3
+ Given(/^I have started a browser$/) do
4
+ @env.browser
5
+ end
6
+
7
+ Given(/^I am using a local browser$/) do
8
+ allow(@env).to receive(:remote?).and_return(false)
9
+ end
10
+
11
+ When(/^I start interacting with the browser$/) do
12
+ @env.browser
13
+ end
14
+
15
+ When(/^I navigate to the `wiki_url`$/) do
16
+ @env.browser.goto @env.wiki_url
17
+ end
18
+
19
+ When(/^teardown is called$/) do
20
+ @env.teardown
21
+ end
22
+
23
+ Then(/^the browser is open$/) do
24
+ expect(@env.browser).to exist
25
+ end
26
+
27
+ Then(/^the wiki page should have loaded$/) do
28
+ expect(@env.browser.element(tag_name: 'body', class: 'mediawiki')).to be_present
29
+ end
30
+
31
+ Then(/^the browser should have closed$/) do
32
+ expect(@env.browser).to_not exist
33
+ end
34
+
35
+ Then(/^the browser name is `:(.*?)`$/) do |type|
36
+ expect(@env.browser.name).to eq(type.to_sym)
37
+ end
@@ -0,0 +1,22 @@
1
+ Given(/^I have configured my environment with:$/) do |yaml|
2
+ @env = MediawikiSelenium::Environment.new(YAML.load(yaml))
3
+ end
4
+
5
+ Given(/^I have configured my environment from `ENV`(?: and with:)?$/) do |*args|
6
+ configs = [ENV]
7
+ configs << YAML.load(args.first) if args.length > 0
8
+
9
+ @env = MediawikiSelenium::Environment.new(*configs)
10
+ end
11
+
12
+ Given(/^I have set "(.*?)" in my shell$/) do |var|
13
+ begin
14
+ @env.lookup(var)
15
+ rescue MediawikiSelenium::ConfigurationError
16
+ pending "you must configure #{var.upcase} to run this test"
17
+ end
18
+ end
19
+
20
+ After do
21
+ @env.teardown unless @env.nil?
22
+ end
@@ -0,0 +1,22 @@
1
+ Given(/^I am using the user factory$/) do
2
+ @env.extend(MediawikiSelenium::ApiHelper, MediawikiSelenium::UserFactoryHelper)
3
+ end
4
+
5
+ When(/^I reference the primary user$/) do
6
+ @user = @env.user
7
+ end
8
+
9
+ When(/^I reference user "(.*?)"$/) do |id|
10
+ @user = @env.user(id)
11
+ end
12
+
13
+ Then(/^an account for the user should exist$/) do
14
+ @users = @env.api.query(list: 'users', ususers: @user).data['users']
15
+
16
+ expect(@users).to be_a(Array)
17
+ expect(@users.first).to include('name')
18
+ end
19
+
20
+ Then(/^the user name should start with "(.*?)"$/) do |prefix|
21
+ expect(@users.first['name']).to start_with(prefix)
22
+ end
@@ -0,0 +1,7 @@
1
+ require 'rspec/mocks'
2
+ require 'mediawiki_selenium'
3
+
4
+ World(RSpec::Mocks::ExampleMethods)
5
+
6
+ Before { RSpec::Mocks.setup }
7
+ After { RSpec::Mocks.teardown }
@@ -0,0 +1,20 @@
1
+ @integration
2
+ Feature: User factory
3
+
4
+ Background:
5
+ Given I have configured my environment from `ENV` and with:
6
+ """
7
+ user_factory: true
8
+ """
9
+ And I have set "MEDIAWIKI_URL" in my shell
10
+ And I am using the user factory
11
+
12
+ Scenario: User factory creates the primary account
13
+ When I reference the primary user
14
+ Then an account for the user should exist
15
+ And the user name should start with "User-"
16
+
17
+ Scenario: User factory creates an alternative account
18
+ When I reference user "some_user"
19
+ Then an account for the user should exist
20
+ And the user name should start with "User-some-user-"
@@ -8,4 +8,6 @@ module MediawikiSelenium
8
8
  autoload :PageFactory, 'mediawiki_selenium/page_factory'
9
9
  autoload :Raita, 'mediawiki_selenium/raita'
10
10
  autoload :RemoteBrowserFactory, 'mediawiki_selenium/remote_browser_factory'
11
+ autoload :UserFactory, 'mediawiki_selenium/user_factory'
12
+ autoload :UserFactoryHelper, 'mediawiki_selenium/support/modules/user_factory_helper'
11
13
  end
@@ -103,6 +103,7 @@ module MediawikiSelenium
103
103
  def initialize(*configs)
104
104
  @_config = configs.map { |config| normalize_config(config) }.reduce(:merge)
105
105
  @_factory_cache = {}
106
+ @_current_alternatives = {}
106
107
  end
107
108
 
108
109
  # Whether the given environment is equal to this one. Two environments are
@@ -143,10 +144,7 @@ module MediawikiSelenium
143
144
  # @yieldparam password [String] Alternative MediaWiki password.
144
145
  #
145
146
  def as_user(id, &blk)
146
- user = lookup(:mediawiki_user, id: id)
147
- password = lookup(:mediawiki_password, id: id, default: -> { lookup(:mediawiki_password) })
148
-
149
- with(mediawiki_user: user, mediawiki_password: password, &blk)
147
+ with(mediawiki_user: user(id), mediawiki_password: password(id), &blk)
150
148
  end
151
149
 
152
150
  # Browser with which to drive tests.
@@ -180,6 +178,14 @@ module MediawikiSelenium
180
178
  lookup(:browser, default: 'firefox').downcase.to_sym
181
179
  end
182
180
 
181
+ # Returns the current alternate ID for the given configuration key.
182
+ #
183
+ # @param key [Symbol] Configuration key.
184
+ #
185
+ def current_alternative(key)
186
+ @_current_alternatives[key]
187
+ end
188
+
183
189
  # A reference to this environment. Can be used in conjunction with {#[]}
184
190
  # for syntactic sugar in looking up environment configuration where `self`
185
191
  # would otherwise seem ambiguous.
@@ -317,7 +323,7 @@ module MediawikiSelenium
317
323
  # @return [String]
318
324
  #
319
325
  def password(id = nil)
320
- lookup(:mediawiki_password, id: id)
326
+ lookup(:mediawiki_password, id: id, default: -> { lookup(:mediawiki_password) })
321
327
  end
322
328
 
323
329
  # Whether this environment has been configured to use remote browser
@@ -461,7 +467,14 @@ module MediawikiSelenium
461
467
  # @yield [*args] Values of the overridden configuration.
462
468
  #
463
469
  def with_alternative(names, id, &blk)
464
- with(lookup_all(Array(names), id: id), &blk)
470
+ names = Array(names)
471
+
472
+ original_alts = @_current_alternatives.dup
473
+ @_current_alternatives.merge!(names.each.with_object({}) { |n, alts| alts[n] = id })
474
+
475
+ with(lookup_all(names, id: id), &blk)
476
+ ensure
477
+ @_current_alternatives = original_alts
465
478
  end
466
479
 
467
480
  protected
@@ -14,7 +14,7 @@ module MediawikiSelenium
14
14
  # @see http://www.rubydoc.info/github/cheezy/page-object
15
15
  #
16
16
  def on_page(page_class, params = { using_params: {} }, visit = false)
17
- @browser = browser if visit
17
+ @browser = browser if visit || !defined?(@browser)
18
18
 
19
19
  super(page_class, params, false) do |page|
20
20
  if page.respond_to?(:goto)
@@ -11,3 +11,4 @@ World { MediawikiSelenium::Environment.load_default }
11
11
  World(MediawikiSelenium::ApiHelper)
12
12
  World(MediawikiSelenium::PageFactory)
13
13
  World(MediawikiSelenium::StrictPending)
14
+ World(MediawikiSelenium::UserFactoryHelper)
@@ -12,15 +12,23 @@ module MediawikiSelenium
12
12
  def api
13
13
  @_api_cache ||= {}
14
14
 
15
- url = lookup(:mediawiki_api_url, default: api_url_from(lookup(:mediawiki_url)))
15
+ url = api_url
16
16
 
17
17
  @_api_cache[[url, user]] ||= MediawikiApi::Client.new(url).tap do |client|
18
18
  client.log_in(user, password)
19
19
  end
20
20
  end
21
21
 
22
+ # URL to the API endpoint for the current wiki.
23
+ #
24
+ # @return [String]
25
+ #
26
+ def api_url
27
+ lookup(:mediawiki_api_url, default: -> { api_url_from(lookup(:mediawiki_url)) })
28
+ end
29
+
22
30
  # Ensures the given alternative account exists by attempting to create it
23
- # via the API. Any errors related to the account already existing are
31
+ # via the API. Any errors related to the account already existing are
24
32
  # swallowed.
25
33
  #
26
34
  # @param id [Symbol] ID of alternative user.
@@ -0,0 +1,35 @@
1
+ require 'mediawiki_api'
2
+
3
+ module MediawikiSelenium
4
+ # Provisions user accounts automatically using the MW API upon their first
5
+ # reference.
6
+ #
7
+ # Note you must explicitly enable this functionality by setting
8
+ # `user_factory` to `true` in your `environments.yml` configuration file.
9
+ #
10
+ # @see Environment
11
+ # @see UserFactory
12
+ #
13
+ module UserFactoryHelper
14
+ # @!method user
15
+ # @!method password
16
+ #
17
+ # Create account upon the first reference to its username or password.
18
+ #
19
+ # @see Environment#user
20
+ # @see Environment#password
21
+ #
22
+ [:user, :password].each do |name|
23
+ define_method(name) do |id = nil|
24
+ return super(id) unless lookup(:user_factory, default: false)
25
+ factory.create(id || current_alternative(:"mediawiki_#{name}"))[name]
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def factory
32
+ @_user_factory ||= UserFactory.new(MediawikiApi::Client.new(api_url))
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,50 @@
1
+ require 'mediawiki_api'
2
+
3
+ module MediawikiSelenium
4
+ # Factory class used to provision test user fixtures via the MW API.
5
+ #
6
+ class UserFactory
7
+ # Create a user factory. This should typically be done anew for each test
8
+ # case.
9
+ #
10
+ # @param api [MediawikiApi::Client] API client used to create users.
11
+ #
12
+ def initialize(api)
13
+ @api = api
14
+ @users = {}
15
+ end
16
+
17
+ # Return a unique name for the given user ID. Each account will be created
18
+ # via the MW API if it has not already been created.
19
+ #
20
+ # @param id [Symbol, nil] Alternative ID or `nil` for the primary user.
21
+ #
22
+ # @return [Hash]
23
+ #
24
+ def create(id = nil)
25
+ return @users[id] if @users.include?(id)
26
+
27
+ user = unique(id, 'User')
28
+ pass = unique(id, 'Pass')
29
+
30
+ create_account(user, pass)
31
+
32
+ @users[id] = { user: user, password: pass }
33
+ end
34
+
35
+ private
36
+
37
+ def create_account(user, password)
38
+ @api.create_account(user, password)
39
+ rescue MediawikiApi::ApiError => e
40
+ raise e unless e.code == 'userexists'
41
+ end
42
+
43
+ def unique(id, label)
44
+ prefix = label
45
+ prefix += "-#{id.to_s.gsub('_', '-')}" if id
46
+
47
+ "#{prefix}-#{Random.rand(36**10).to_s(36)}"
48
+ end
49
+ end
50
+ end
@@ -1,3 +1,3 @@
1
1
  module MediawikiSelenium
2
- VERSION = '1.3.0'
2
+ VERSION = '1.4.0'
3
3
  end
@@ -27,10 +27,10 @@ Gem::Specification.new do |spec|
27
27
  spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
28
28
  spec.require_paths = ['lib']
29
29
 
30
- spec.add_runtime_dependency 'cucumber', '~> 1.3', '>= 1.3.10'
30
+ spec.add_runtime_dependency 'cucumber', '~> 1.3', '>= 1.3.20'
31
31
  spec.add_runtime_dependency 'headless', '~> 1.0', '>= 1.0.1'
32
32
  spec.add_runtime_dependency 'json', '~> 1.8', '>= 1.8.1'
33
- spec.add_runtime_dependency 'mediawiki_api', '~> 0.2', '>= 0.2.1'
33
+ spec.add_runtime_dependency 'mediawiki_api', '~> 0.4', '>= 0.4.1'
34
34
  spec.add_runtime_dependency 'page-object', '~> 1.0'
35
35
  spec.add_runtime_dependency 'rest-client', '~> 1.6', '>= 1.6.7'
36
36
  spec.add_runtime_dependency 'rspec-expectations', '~> 2.14', '>= 2.14.4'
@@ -23,6 +23,10 @@ module MediawikiSelenium
23
23
  let(:mediawiki_user) { 'mw user' }
24
24
  let(:mediawiki_password) { 'mw password' }
25
25
 
26
+ def mock_environment_name(name)
27
+ expect(ENV).to receive(:[]).with('MEDIAWIKI_ENVIRONMENT').and_return(name)
28
+ end
29
+
26
30
  describe '.load' do
27
31
  subject { Environment.load(name, extra) }
28
32
 
@@ -65,14 +69,14 @@ module MediawikiSelenium
65
69
  subject { Environment.load_default }
66
70
 
67
71
  it 'loads the environment configuration specified by MEDIAWIKI_ENVIRONMENT' do
68
- expect(ENV).to receive(:[]).with('MEDIAWIKI_ENVIRONMENT').and_return('foo')
72
+ mock_environment_name('foo')
69
73
  expect(Environment).to receive(:load).with('foo', ENV)
70
74
  subject
71
75
  end
72
76
 
73
77
  context 'where MEDIAWIKI_ENVIRONMENT is not defined' do
74
78
  it 'looks for a "default" environment' do
75
- expect(ENV).to receive(:[]).with('MEDIAWIKI_ENVIRONMENT').and_return(nil)
79
+ mock_environment_name(nil)
76
80
  expect(Environment).to receive(:load).with('default', ENV)
77
81
  subject
78
82
  end
@@ -232,6 +236,42 @@ module MediawikiSelenium
232
236
  end
233
237
  end
234
238
 
239
+ describe '#current_alternative' do
240
+ subject { env.current_alternative(key) }
241
+
242
+ let(:key) { :foo }
243
+ let(:config) { { foo: 'a', foo_b: 'b', foo_c: 'c' } }
244
+
245
+ context 'when there is no active alternative' do
246
+ it { is_expected.to be(nil) }
247
+ end
248
+
249
+ context 'when there is an active alternative' do
250
+ it 'should return the alternative ID' do
251
+ env.with_alternative([key], :b) do
252
+ expect(subject).to eq(:b)
253
+ end
254
+ end
255
+ end
256
+
257
+ context 'when there are nested active alternatives' do
258
+ it 'should return the latest alternative ID' do
259
+ env.with_alternative([key], :b) do
260
+ env.with_alternative([key], :c) do
261
+ expect(subject).to eq(:c)
262
+ end
263
+ end
264
+ end
265
+
266
+ it 'properly restores the active alternatives for each level of nesting' do
267
+ env.with_alternative([key], :b) do
268
+ env.with_alternative([key], :c)
269
+ expect(subject).to eq(:b)
270
+ end
271
+ end
272
+ end
273
+ end
274
+
235
275
  describe '#env' do
236
276
  subject { env.env }
237
277
 
@@ -17,6 +17,10 @@ module MediawikiSelenium
17
17
 
18
18
  let(:browser) { double('Watir::Browser') }
19
19
 
20
+ before do
21
+ allow(env).to receive(:browser).and_return(browser)
22
+ end
23
+
20
24
  it 'returns a new page object' do
21
25
  page = double('PageObject')
22
26
  expect(page_class).to receive(:new).and_return(page)
@@ -33,6 +37,14 @@ module MediawikiSelenium
33
37
  end
34
38
  end
35
39
 
40
+ context 'when the browser has not yet been initialized' do
41
+ it 'initializes a browser' do
42
+ allow(page_class).to receive(:new)
43
+ expect(env).to receive(:browser).and_return(browser)
44
+ subject
45
+ end
46
+ end
47
+
36
48
  context 'when told to visit a page' do
37
49
  let(:visit) { true }
38
50
  let(:config) { { mediawiki_url: 'http://an.example/wiki/' } }
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ module MediawikiSelenium
4
+ describe UserFactoryHelper do
5
+ let(:env) { Environment.new(config).extend(ApiHelper, UserFactoryHelper) }
6
+
7
+ let(:api_url) { 'http://an.example/api' }
8
+ let(:api) { double('MediawikiApi::Client') }
9
+
10
+ [:user, :password].each do |method|
11
+ describe "##{method}" do
12
+ subject { env.send(method, id) }
13
+
14
+ context 'when the `user_factory` option is enabled' do
15
+ let(:config) { { mediawiki_api_url: api_url, user_factory: true } }
16
+
17
+ before do
18
+ expect(MediawikiApi::Client).to receive(:new).with(api_url).and_return(api)
19
+ end
20
+
21
+ context 'given no alternative ID' do
22
+ let(:id) { nil }
23
+
24
+ it 'creates the primary account and returns the name' do
25
+ expect(api).to receive(:create_account)
26
+
27
+ expect(subject).to be_a(String)
28
+ end
29
+ end
30
+
31
+ context 'given an existing alternative ID' do
32
+ let(:id) { :b }
33
+
34
+ it 'creates the alternative account and returns the name' do
35
+ expect(api).to receive(:create_account)
36
+
37
+ expect(subject).to be_a(String)
38
+ end
39
+
40
+ it 'should be different from the primary account' do
41
+ expect(api).to receive(:create_account).twice
42
+
43
+ expect(subject).not_to eq(env.user)
44
+ end
45
+ end
46
+ end
47
+
48
+ context 'when the `user_factory` option is not enabled' do
49
+ let(:config) { { mediawiki_api_url: api_url, user_factory: false } }
50
+ let(:id) { nil }
51
+
52
+ it "delegates to `Environment##{method}`" do
53
+ expect { subject }.to raise_error(ConfigurationError)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,77 @@
1
+ require 'spec_helper'
2
+
3
+ module MediawikiSelenium
4
+ describe UserFactory do
5
+ subject { factory }
6
+
7
+ let(:factory) { UserFactory.new(api) }
8
+ let(:api) { double('MediawikiApi::Client') }
9
+
10
+ it { is_expected.to be_a(UserFactory) }
11
+
12
+ describe '#create' do
13
+ let(:rando) { 'x' * 10 }
14
+
15
+ before do
16
+ n = double('Fixnum')
17
+ allow(Random).to receive(:rand).and_return(n)
18
+ allow(n).to receive(:to_s).with(36).and_return(rando)
19
+ end
20
+
21
+ context 'given no ID' do
22
+ it 'creates a new user like "User--<random 10 chars>"' do
23
+ expect(api).to receive(:create_account).
24
+ with("User-#{rando}", "Pass-#{rando}")
25
+
26
+ factory.create
27
+ end
28
+
29
+ it 'returns the user name and password' do
30
+ allow(api).to receive(:create_account)
31
+
32
+ expect(factory.create).to eq(user: "User-#{rando}", password: "Pass-#{rando}")
33
+ end
34
+ end
35
+
36
+ context 'given an ID' do
37
+ it 'creates a new user like "User-<id>-<random 10 chars>"' do
38
+ expect(api).to receive(:create_account).
39
+ with("User-foo-#{rando}", "Pass-foo-#{rando}")
40
+
41
+ factory.create(:foo)
42
+ end
43
+
44
+ it 'replaces underscores in IDs with dashes' do
45
+ expect(api).to receive(:create_account).
46
+ with("User-foo-bar-#{rando}", "Pass-foo-bar-#{rando}")
47
+
48
+ factory.create(:foo_bar)
49
+ end
50
+
51
+ it 'returns the alternative user name and password' do
52
+ allow(api).to receive(:create_account)
53
+
54
+ expect(factory.create(:foo)).
55
+ to eq(user: "User-foo-#{rando}", password: "Pass-foo-#{rando}")
56
+ end
57
+ end
58
+
59
+ context 'called more than once' do
60
+ it 'will not create the same account twice' do
61
+ expect(api).to receive(:create_account).once.
62
+ with("User-foo-#{rando}", "Pass-foo-#{rando}")
63
+
64
+ factory.create(:foo)
65
+ factory.create(:foo)
66
+ end
67
+
68
+ it 'returns the same user and password' do
69
+ expect(api).to receive(:create_account).
70
+ with("User-foo-#{rando}", "Pass-foo-#{rando}")
71
+
72
+ expect(factory.create(:foo)).to be(factory.create(:foo))
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -15,14 +15,12 @@
15
15
  # bundle exec cucumber
16
16
  #
17
17
  mw-vagrant-host: &default
18
+ user_factory: true
18
19
  mediawiki_url: http://127.0.0.1:8080/wiki/
19
- mediawiki_user: Selenium_user
20
- mediawiki_password: vagrant
21
20
 
22
21
  mw-vagrant-guest:
22
+ user_factory: true
23
23
  mediawiki_url: http://127.0.0.1/wiki/
24
- mediawiki_user: Selenium_user
25
- mediawiki_password: vagrant
26
24
 
27
25
  beta:
28
26
  mediawiki_url: http://en.wikipedia.beta.wmflabs.org/wiki/
@@ -34,4 +32,8 @@ test2:
34
32
  mediawiki_user: Selenium_user
35
33
  # mediawiki_password: SET THIS IN THE ENVIRONMENT!
36
34
 
35
+ integration:
36
+ user_factory: true
37
+ # mediawiki_url: THIS WILL BE SET BY JENKINS
38
+
37
39
  default: *default
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mediawiki_selenium
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris McMahon
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2015-06-11 00:00:00.000000000 Z
16
+ date: 2015-06-26 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: cucumber
@@ -24,7 +24,7 @@ dependencies:
24
24
  version: '1.3'
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: 1.3.10
27
+ version: 1.3.20
28
28
  type: :runtime
29
29
  prerelease: false
30
30
  version_requirements: !ruby/object:Gem::Requirement
@@ -34,7 +34,7 @@ dependencies:
34
34
  version: '1.3'
35
35
  - - ">="
36
36
  - !ruby/object:Gem::Version
37
- version: 1.3.10
37
+ version: 1.3.20
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: headless
40
40
  requirement: !ruby/object:Gem::Requirement
@@ -81,20 +81,20 @@ dependencies:
81
81
  requirements:
82
82
  - - "~>"
83
83
  - !ruby/object:Gem::Version
84
- version: '0.2'
84
+ version: '0.4'
85
85
  - - ">="
86
86
  - !ruby/object:Gem::Version
87
- version: 0.2.1
87
+ version: 0.4.1
88
88
  type: :runtime
89
89
  prerelease: false
90
90
  version_requirements: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
- version: '0.2'
94
+ version: '0.4'
95
95
  - - ">="
96
96
  - !ruby/object:Gem::Version
97
- version: 0.2.1
97
+ version: 0.4.1
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: page-object
100
100
  requirement: !ruby/object:Gem::Requirement
@@ -330,6 +330,15 @@ files:
330
330
  - README.md
331
331
  - UPGRADE.md
332
332
  - bin/mediawiki-selenium-init
333
+ - features/api.feature
334
+ - features/basic_usage.feature
335
+ - features/saucelabs.feature
336
+ - features/step_definitions/api_helper_steps.rb
337
+ - features/step_definitions/browser_steps.rb
338
+ - features/step_definitions/environment_steps.rb
339
+ - features/step_definitions/user_factory_steps.rb
340
+ - features/support/env.rb
341
+ - features/user_factory.feature
333
342
  - lib/mediawiki_selenium.rb
334
343
  - lib/mediawiki_selenium/browser_factory.rb
335
344
  - lib/mediawiki_selenium/browser_factory/base.rb
@@ -356,11 +365,13 @@ files:
356
365
  - lib/mediawiki_selenium/support/hooks.rb
357
366
  - lib/mediawiki_selenium/support/modules/api_helper.rb
358
367
  - lib/mediawiki_selenium/support/modules/strict_pending.rb
368
+ - lib/mediawiki_selenium/support/modules/user_factory_helper.rb
359
369
  - lib/mediawiki_selenium/support/pages.rb
360
370
  - lib/mediawiki_selenium/support/pages/login_page.rb
361
371
  - lib/mediawiki_selenium/support/pages/random_page.rb
362
372
  - lib/mediawiki_selenium/support/pages/reset_preferences_page.rb
363
373
  - lib/mediawiki_selenium/support/sauce.rb
374
+ - lib/mediawiki_selenium/user_factory.rb
364
375
  - lib/mediawiki_selenium/version.rb
365
376
  - lib/mediawiki_selenium/warnings_formatter.rb
366
377
  - mediawiki_selenium.gemspec
@@ -373,6 +384,8 @@ files:
373
384
  - spec/page_factory_spec.rb
374
385
  - spec/remote_browser_factory_spec.rb
375
386
  - spec/spec_helper.rb
387
+ - spec/user_factory_helper_spec.rb
388
+ - spec/user_factory_spec.rb
376
389
  - templates/tests/browser/environments.yml
377
390
  - templates/tests/browser/features/support/env.rb
378
391
  homepage: https://gerrit.wikimedia.org/r/#/admin/projects/mediawiki/selenium