mediawiki_selenium 1.6.5 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b586d9776790289bc4652f8a959ba1571359a9ee
4
- data.tar.gz: 2a94ab474b58420757a688553be1988ef0bbc77a
3
+ metadata.gz: 3406e3a83ca87d98254baab7ad0e8aaba8a63804
4
+ data.tar.gz: 3cfa9c9d4be2e9646457f481a3b78948eb6fb4bf
5
5
  SHA512:
6
- metadata.gz: 4665b7a2048bbfadc846778c7d88df7a6ec2c436856d31198f699305af6cb7d07d073a0a7a693de285c7f9a98598bddd356657700a6bad7c8677a9474be56299
7
- data.tar.gz: 5fad19dfbfdb73de35fe183c1cde46ee940090cdf6c9372d80eb282ba21127a9e886566c3bd6b3177fb347e3b927f9da829d99c1d04aadce6d8744f1464c7beb
6
+ metadata.gz: 4f0ac98aeab7706c6a24f04ebc28a7253bc1fb068481106660826bf34016509765ef2337ada75b227cc666c3f5f69d88d994e4a381fb49565fd9827df8a80c3d
7
+ data.tar.gz: f4631f18d8ea831cac316304f9840fc7ac560c2fac92d0b1ea357deac026b9e263a1d2c26dccf82abee8c3af6df37c188cd0be867f3fe08603b154d93c8537e6
data/CREDITS CHANGED
@@ -5,6 +5,7 @@ following names for their contribution to the product.
5
5
  For further details on licensing, see the LICENSE file.
6
6
 
7
7
  == Developers ==
8
+ * Antoine Musso
8
9
  * Chris McMahon
9
10
  * Dan Duvall
10
11
  * Jeff Hall
data/README.md CHANGED
@@ -204,6 +204,40 @@ the destination path for screenshots. Example:
204
204
 
205
205
  SCREENSHOT_FAILURES=true SCREENSHOT_FAILURES_PATH="/tmp/screenshots" bundle exec cucumber
206
206
 
207
+ ### CI Rake task
208
+
209
+ To utilize the CI rake task, add the following to your `Rakefile`:
210
+
211
+ require 'mediawiki_selenium/rake_task'
212
+ MediawikiSelenium::RakeTask.new
213
+
214
+ It defaults to look for `environments.yml` and `features` under `tests/browser`.
215
+ You can specify the directory:
216
+
217
+ require 'mediawiki_selenium/rake_task'
218
+ MediawikiSelenium::RakeTask.new(test_dir: modules/ve-mw/tests/browser)
219
+
220
+ By default, it will run something like this:
221
+
222
+ bundle exec cucumber (...) --tags ~@skip --tags @en.wikipedia.beta.wmflabs.org --tags @firefox
223
+
224
+ To exclude Cucumber site tag (example: `--tags @en.wikipedia.beta.wmflabs.org`):
225
+
226
+ require 'mediawiki_selenium/rake_task'
227
+ MediawikiSelenium::RakeTask.new(site_tag: false)
228
+
229
+ The above will run:
230
+
231
+ bundle exec cucumber (...) --tags ~@skip -tags @firefox
232
+
233
+ CI specific options are passed to cucumber when the rake task detects the
234
+ environment variable WORKSPACE is set. It will emit JUnit results under
235
+ `$WORKSPACE/log/junit`. To reproduce that behavior one can:
236
+
237
+ export WORKSPACE=/tmp/myplace
238
+ mkdir -p $WORKSPACE/log/junit
239
+ bundle exec rake spec
240
+
207
241
  ## Updating Your Gemfile
208
242
 
209
243
  In your repository, the `Gemfile` specifies dependencies and `Gemfile.lock` defines
@@ -1,5 +1,9 @@
1
1
  ## Release notes
2
2
 
3
+ ### 1.7.0 2016-04-25
4
+
5
+ * Provide Rake task to serve as a CI entrypoint
6
+
3
7
  ### 1.6.5 2016-01-27
4
8
 
5
9
  * Fixed `NoMethodError` in `EmbedBrowserSession` helper
@@ -10,6 +10,7 @@ module MediawikiSelenium
10
10
  autoload :LoginHelper, 'mediawiki_selenium/helpers/login_helper'
11
11
  autoload :PageFactory, 'mediawiki_selenium/page_factory'
12
12
  autoload :Raita, 'mediawiki_selenium/raita'
13
+ autoload :RakeTask, 'mediawiki_selenium/rake_task'
13
14
  autoload :RemoteBrowserFactory, 'mediawiki_selenium/remote_browser_factory'
14
15
  autoload :ScreenshotHelper, 'mediawiki_selenium/helpers/screenshot_helper'
15
16
  autoload :StrictPending, 'mediawiki_selenium/cucumber/strict_pending'
@@ -3,6 +3,8 @@ Before('@custom-browser') do |scenario|
3
3
  end
4
4
 
5
5
  AfterConfiguration do |config|
6
+ MediawikiSelenium::Environment.default_test_directory = config.paths.first || '.'
7
+
6
8
  # Install a formatter that can be used to show feature-related warnings
7
9
  pretty_format, io = config.formats.find { |(format, _io)| format == 'pretty' }
8
10
  config.formats << ['MediawikiSelenium::WarningsFormatter', io] if pretty_format
@@ -63,7 +63,7 @@ module MediawikiSelenium
63
63
  include Comparable
64
64
 
65
65
  class << self
66
- attr_accessor :default_configuration
66
+ attr_accessor :default_configuration, :default_test_directory
67
67
 
68
68
  # Instantiates a new environment using the given set of default
69
69
  # configuration from `environments.yml` in the current working
@@ -71,20 +71,23 @@ module MediawikiSelenium
71
71
  #
72
72
  # @param name [String] Name of the environment.
73
73
  # @param extra [Hash] Additional configuration to use.
74
+ # @param test_dir [String] Path from which to search upward for
75
+ # `environments.yml`
74
76
  #
75
- def load(name, extra = {})
77
+ def load(name, extra = {}, test_dir = nil)
76
78
  name = name.to_s
77
79
  configs = []
78
80
 
79
81
  unless name.empty?
80
- envs = YAML.load_file(default_configuration)
82
+ envs = YAML.load_file(search_for_configuration(test_dir || default_test_directory))
81
83
  raise ConfigurationError, "unknown environment `#{name}`" unless envs.include?(name)
82
84
  configs << envs[name]
83
85
  end
84
86
 
85
87
  configs << extra
86
88
 
87
- new(*configs)
89
+ env = new(*configs)
90
+ env
88
91
  end
89
92
 
90
93
  # Instantiates a new environment from the values of `ENV` and the
@@ -93,12 +96,29 @@ module MediawikiSelenium
93
96
  #
94
97
  # @see load
95
98
  #
96
- def load_default
97
- load(ENV['MEDIAWIKI_ENVIRONMENT'] || 'default', ENV)
99
+ def load_default(test_dir = nil)
100
+ load(ENV['MEDIAWIKI_ENVIRONMENT'] || 'default', ENV, test_dir)
101
+ end
102
+
103
+ # Searches for `environments.yml` in the given path. If it isn't found,
104
+ # the search continues upward in the directory hierarchy.
105
+ #
106
+ # @param path [String] Path to search for configuration
107
+ #
108
+ # @return [String] Qualified path to the configuration file
109
+ #
110
+ def search_for_configuration(path)
111
+ return default_configuration if path.nil? || path.empty?
112
+
113
+ file_path = File.join(path, default_configuration)
114
+ return file_path if File.exist?(file_path)
115
+
116
+ search_for_configuration(File.dirname(path))
98
117
  end
99
118
  end
100
119
 
101
120
  self.default_configuration = 'environments.yml'
121
+ self.default_test_directory = 'tests/browser'
102
122
 
103
123
  def initialize(*configs)
104
124
  @_config = configs.map { |config| normalize_config(config) }.reduce(:merge)
@@ -174,12 +194,41 @@ module MediawikiSelenium
174
194
  end
175
195
  end
176
196
 
177
- # Name of the browser we're using.
197
+ # Name of the browser we're using. If the `:browser` configuration
198
+ # contains a version at the end, only the name is returned.
199
+ #
200
+ # @example
201
+ # env = Environment.new(browser: 'internet_explorer 8.0')
202
+ # env.browser_name # => :internet_explorer
178
203
  #
179
204
  # @return [Symbol]
180
205
  #
181
206
  def browser_name
182
- lookup(:browser, default: 'firefox').downcase.to_sym
207
+ browser_spec[0].to_sym
208
+ end
209
+
210
+ # Tag names that can be used to filter test scenarios for a specific
211
+ # browser and/or version.
212
+ #
213
+ # @return [Array<String>]
214
+ #
215
+ def browser_tags
216
+ tags = [browser_name.to_s]
217
+
218
+ version = browser_version
219
+ tags << "#{browser_name}_#{version}" if version
220
+
221
+ tags
222
+ end
223
+
224
+ # Version of the browser we're using. If a `:version` configuration
225
+ # is provided, that value is returned. Otherwise a version is searched for
226
+ # in the `:browser` configuration.
227
+ #
228
+ # @return [String]
229
+ #
230
+ def browser_version
231
+ lookup(:version, default: browser_spec[1])
183
232
  end
184
233
 
185
234
  # Returns the current alternate ID for the given configuration key.
@@ -514,7 +563,19 @@ module MediawikiSelenium
514
563
  private
515
564
 
516
565
  def browser_config
517
- lookup_all(browser_factory.all_binding_keys, default: nil).reject { |_k, v| v.nil? }
566
+ config = lookup_all(browser_factory.all_binding_keys, default: nil).reject { |_k, v| v.nil? }
567
+
568
+ # The browser version may be provided as part of the `:browser`
569
+ # configuration or separately as `:version`. In either case,
570
+ # `browser_version` will return the right value.
571
+ version = browser_version
572
+ config[:version] = version unless version.nil?
573
+
574
+ config
575
+ end
576
+
577
+ def browser_spec
578
+ lookup(:browser, default: 'firefox').to_s.downcase.split(' ')
518
579
  end
519
580
 
520
581
  def normalize_config(hash)
@@ -0,0 +1,31 @@
1
+ require 'cucumber/rake/task'
2
+ require 'mediawiki_selenium'
3
+ require 'uri'
4
+
5
+ module MediawikiSelenium
6
+ class RakeTask < Cucumber::Rake::Task
7
+ def initialize(name: :selenium, test_dir: Environment.default_test_directory, site_tag: true)
8
+ target = File.expand_path(test_dir, Rake.original_dir)
9
+ env = Environment.load_default(target)
10
+
11
+ workspace = env.lookup(:workspace, default: nil)
12
+ site = URI.parse(env.lookup(:mediawiki_url)).host
13
+ browser_tags = env.browser_tags.map { |tag| "@#{tag}" }.join(',')
14
+
15
+ options = Shellwords.escape(test_dir)
16
+
17
+ if workspace
18
+ options +=
19
+ ' --backtrace --verbose --color --format pretty'\
20
+ " --format Cucumber::Formatter::Sauce --out '#{workspace}/log/junit'"\
21
+ ' --tags ~@skip'
22
+ options +=
23
+ " --tags @#{site}" if site_tag
24
+ end
25
+
26
+ super(name) do |t|
27
+ t.cucumber_opts = "#{options} --tags #{browser_tags}"
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,3 +1,3 @@
1
1
  module MediawikiSelenium
2
- VERSION = '1.6.5'
2
+ VERSION = '1.7.0'
3
3
  end
@@ -23,18 +23,16 @@ 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
-
30
26
  describe '.load' do
31
27
  subject { Environment.load(name, extra) }
32
28
 
33
29
  let(:name) { 'foo' }
34
30
  let(:extra) { {} }
31
+ let(:env_file) { 'environments.yml' }
35
32
 
36
33
  before do
37
- expect(YAML).to receive(:load_file).with('environments.yml').
34
+ allow(Environment).to receive(:search_for_configuration).and_return(env_file)
35
+ allow(YAML).to receive(:load_file).with(env_file).
38
36
  and_return('foo' => { 'x' => 'a', 'y' => 'b' })
39
37
  end
40
38
 
@@ -63,21 +61,43 @@ module MediawikiSelenium
63
61
  expect(subject[:y]).to eq('b')
64
62
  end
65
63
  end
64
+
65
+ context 'when a test_dir is given' do
66
+ subject { Environment.load('foo', {}, test_dir) }
67
+
68
+ let(:test_dir) { '/srv/workspace/job' }
69
+ let(:env_file) { File.join(test_dir, 'environments.yml') }
70
+
71
+ it 'loads configuration in the given test_dir' do
72
+ expect(Environment).to receive(:search_for_configuration).with(test_dir).
73
+ and_return(env_file)
74
+ expect(YAML).to receive(:load_file).with(env_file).
75
+ and_return('foo' => { 'x' => 'a', 'y' => 'b' })
76
+ subject
77
+ end
78
+ end
79
+
66
80
  end
67
81
 
68
82
  describe '.load_default' do
69
83
  subject { Environment.load_default }
70
84
 
85
+ let(:mediawiki_environment) { 'foo' }
86
+
87
+ before do
88
+ expect(ENV).to receive(:[]).with('MEDIAWIKI_ENVIRONMENT').and_return(mediawiki_environment)
89
+ end
90
+
71
91
  it 'loads the environment configuration specified by MEDIAWIKI_ENVIRONMENT' do
72
- mock_environment_name('foo')
73
- expect(Environment).to receive(:load).with('foo', ENV)
92
+ expect(Environment).to receive(:load).with(mediawiki_environment, ENV, nil)
74
93
  subject
75
94
  end
76
95
 
77
96
  context 'where MEDIAWIKI_ENVIRONMENT is not defined' do
97
+ let(:mediawiki_environment) { nil }
98
+
78
99
  it 'looks for a "default" environment' do
79
- mock_environment_name(nil)
80
- expect(Environment).to receive(:load).with('default', ENV)
100
+ expect(Environment).to receive(:load).with('default', ENV, nil)
81
101
  subject
82
102
  end
83
103
  end
@@ -250,6 +270,60 @@ module MediawikiSelenium
250
270
  expect(subject).to be(:firefox)
251
271
  end
252
272
  end
273
+
274
+ context 'when browser and version are combined' do
275
+ let(:browser) { 'internet_explorer 8.0' }
276
+
277
+ it 'returns only the name' do
278
+ expect(subject).to be(:internet_explorer)
279
+ end
280
+ end
281
+ end
282
+
283
+ describe '#browser_tags' do
284
+ subject { env.browser_tags }
285
+
286
+ context 'when a version is specified' do
287
+ let(:browser) { 'internet_explorer 8.0' }
288
+
289
+ it 'returns tags for use in filter test scenarios' do
290
+ expect(subject).to eq(['internet_explorer', 'internet_explorer_8.0'])
291
+ end
292
+ end
293
+
294
+ context 'when no version is specified' do
295
+ let(:browser) { 'internet_explorer' }
296
+
297
+ it 'includes only a tag for the browser name' do
298
+ expect(subject).to eq(['internet_explorer'])
299
+ end
300
+ end
301
+ end
302
+
303
+ describe '#browser_version' do
304
+ subject { env.browser_version }
305
+
306
+ let(:browser) { 'internet_explorer 8.0' }
307
+
308
+ context 'when no explicit version configuration is provided' do
309
+ it 'is the version specified at the end of browser' do
310
+ expect(subject).to eq('8.0')
311
+ end
312
+ end
313
+
314
+ context 'when an explicit version configuration is provided' do
315
+ let(:config) { minimum_config.merge(version: '9.0') }
316
+
317
+ it 'ignores the version given at the end of browser and returns the explicit one' do
318
+ expect(subject).to eq('9.0')
319
+ end
320
+ end
321
+
322
+ context 'when no version is specified' do
323
+ let(:browser) { 'internet_explorer' }
324
+
325
+ it { is_expected.to be(nil) }
326
+ end
253
327
  end
254
328
 
255
329
  describe '#current_alternative' do
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.6.5
4
+ version: 1.7.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: 2016-01-27 00:00:00.000000000 Z
16
+ date: 2016-04-25 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: cucumber
@@ -395,6 +395,7 @@ files:
395
395
  - lib/mediawiki_selenium/raita/formatter.rb
396
396
  - lib/mediawiki_selenium/raita/logger.rb
397
397
  - lib/mediawiki_selenium/raita/null_io.rb
398
+ - lib/mediawiki_selenium/rake_task.rb
398
399
  - lib/mediawiki_selenium/remote_browser_factory.rb
399
400
  - lib/mediawiki_selenium/rspec.rb
400
401
  - lib/mediawiki_selenium/rspec/environment.rb
@@ -445,7 +446,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
445
446
  version: '0'
446
447
  requirements: []
447
448
  rubyforge_project:
448
- rubygems_version: 2.4.3
449
+ rubygems_version: 2.4.5.1
449
450
  signing_key:
450
451
  specification_version: 4
451
452
  summary: An easy way to run MediaWiki Selenium tests.