cucumber-rails 1.4.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE.md +52 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +42 -0
  4. data/.gitignore +3 -0
  5. data/.rspec +4 -1
  6. data/.rubocop.yml +68 -0
  7. data/.travis.yml +53 -26
  8. data/Appraisals +27 -63
  9. data/{History.md → CHANGELOG.md} +299 -19
  10. data/CONTRIBUTING.md +18 -27
  11. data/Gemfile +2 -4
  12. data/LICENSE +1 -1
  13. data/README.md +73 -29
  14. data/Rakefile +18 -14
  15. data/bin/install_geckodriver.sh +19 -0
  16. data/bin/install_webpacker.sh +9 -0
  17. data/config/cucumber.yml +5 -3
  18. data/cucumber-rails.gemspec +37 -25
  19. data/dev_tasks/cucumber.rake +3 -3
  20. data/dev_tasks/rspec.rake +3 -6
  21. data/dev_tasks/yard/default/layout/html/footer.erb +1 -1
  22. data/dev_tasks/yard/default/layout/html/layout.erb +5 -5
  23. data/dev_tasks/yard/default/layout/html/logo.erb +1 -1
  24. data/dev_tasks/yard/default/layout/html/setup.rb +6 -1
  25. data/dev_tasks/yard.rake +7 -14
  26. data/features/allow_rescue.feature +17 -12
  27. data/features/annotations.feature +20 -0
  28. data/features/capybara_javascript_drivers.feature +42 -32
  29. data/features/choose_javascript_database_strategy.feature +38 -57
  30. data/features/configuration.feature +48 -0
  31. data/features/database_cleaner.feature +20 -20
  32. data/features/disable_automatic_database_cleaning.feature +13 -19
  33. data/features/emulate_javascript.feature +65 -48
  34. data/features/install_cucumber_rails.feature +6 -5
  35. data/features/no_database.feature +8 -15
  36. data/features/raising_errors.feature +10 -4
  37. data/features/rerun_profile.feature +18 -8
  38. data/features/rest_api.feature +13 -13
  39. data/features/step_definitions/cucumber_rails_steps.rb +52 -66
  40. data/features/support/aruba.rb +5 -0
  41. data/features/support/cucumber_rails_helper.rb +85 -0
  42. data/features/support/env.rb +4 -35
  43. data/features/support/hooks.rb +8 -0
  44. data/gemfiles/rails_4_2.gemfile +10 -0
  45. data/gemfiles/rails_5_0.gemfile +10 -0
  46. data/gemfiles/rails_5_1.gemfile +10 -0
  47. data/gemfiles/rails_5_2.gemfile +10 -0
  48. data/gemfiles/rails_6_0.gemfile +9 -0
  49. data/lib/cucumber/rails/action_dispatch.rb +21 -0
  50. data/lib/cucumber/rails/application.rb +17 -8
  51. data/lib/cucumber/rails/capybara/javascript_emulation.rb +47 -39
  52. data/lib/cucumber/rails/capybara/select_dates_and_times.rb +8 -6
  53. data/lib/cucumber/rails/capybara.rb +2 -0
  54. data/lib/cucumber/rails/database.rb +36 -17
  55. data/lib/cucumber/rails/hooks/active_record.rb +14 -12
  56. data/lib/cucumber/rails/hooks/allow_rescue.rb +2 -0
  57. data/lib/cucumber/rails/hooks/database_cleaner.rb +6 -4
  58. data/lib/cucumber/rails/hooks/mail.rb +4 -4
  59. data/lib/cucumber/rails/hooks.rb +2 -0
  60. data/lib/cucumber/rails/rspec.rb +5 -3
  61. data/lib/cucumber/rails/world.rb +26 -9
  62. data/lib/cucumber/rails.rb +21 -18
  63. data/lib/generators/cucumber/{install/USAGE → USAGE} +2 -2
  64. data/lib/generators/cucumber/{install/install_generator.rb → install_generator.rb} +28 -15
  65. data/lib/generators/cucumber/{install/templates → templates}/config/cucumber.yml.erb +4 -3
  66. data/lib/generators/cucumber/{install/templates → templates}/script/cucumber +1 -0
  67. data/lib/generators/cucumber/{install/templates → templates}/support/_rails_each_run.rb.erb +4 -4
  68. data/lib/generators/cucumber/{install/templates → templates}/support/_rails_prefork.rb.erb +0 -0
  69. data/lib/generators/cucumber/{install/templates → templates}/support/capybara.rb +2 -0
  70. data/lib/generators/cucumber/{install/templates → templates}/support/edit_warning.txt +0 -0
  71. data/lib/generators/cucumber/{install/templates → templates}/support/rails.rb.erb +0 -0
  72. data/lib/generators/cucumber/{install/templates → templates}/support/rails_spork.rb.erb +2 -2
  73. data/lib/generators/cucumber/{install/templates → templates}/tasks/cucumber.rake.erb +19 -8
  74. data/spec/cucumber/rails/database_spec.rb +46 -33
  75. data/spec/generators/cucumber/install_generator_spec.rb +55 -0
  76. data/spec/spec_helper.rb +14 -2
  77. metadata +228 -142
  78. data/Gemfile.appraisal +0 -3
  79. data/features/step_definitions/mongo_steps.rb +0 -3
  80. data/features/support/bundler_pre_support.rb +0 -28
  81. data/features/support/fixtures/bundler-1.0.21.gem +0 -0
  82. data/features/support/fixtures/bundler-1.1.rc.gem +0 -0
  83. data/features/support/legacy_web_steps_support.rb +0 -290
  84. data/gemfiles/capybara_1_1.gemfile +0 -17
  85. data/gemfiles/rails_3_0.gemfile +0 -16
  86. data/gemfiles/rails_3_1.gemfile +0 -17
  87. data/gemfiles/rails_3_2.gemfile +0 -17
  88. data/gemfiles/rails_4_0.gemfile +0 -20
  89. data/lib/cucumber/rails/action_controller.rb +0 -12
  90. data/spec/generators/cucumber/install/install_generator_spec.rb +0 -47
@@ -1,16 +1,22 @@
1
1
  Feature: Raise Errors
2
2
 
3
3
  Scenario: Raise error for undefined route
4
- Given I have created a new Rails app "test-app" with no database and installed cucumber-rails
5
- And I write to "features/tests.feature" with:
4
+ Given I have created a new Rails app with no database and installed cucumber-rails
5
+ When I write to "features/home.feature" with:
6
6
  """
7
7
  Feature: Tests
8
8
  Scenario: Tests
9
- When I go to the products page
9
+ When I go to the home page
10
+ """
11
+ And I write to "features/home_steps.rb" with:
12
+ """
13
+ When('I go to the home page') do
14
+ visit('/')
15
+ end
10
16
  """
11
17
  And I run `bundle exec cucumber`
12
18
  Then it should fail with:
13
19
  """
14
20
  1 scenario (1 failed)
15
21
  1 step (1 failed)
16
- """
22
+ """
@@ -1,4 +1,5 @@
1
1
  Feature: Rerun profile
2
+
2
3
  In order to concentrate on failing features
3
4
  As a Rails developer working with Cucumber
4
5
  I want to rerun only failing features
@@ -8,6 +9,7 @@ Feature: Rerun profile
8
9
  And a file named "rerun.txt" with:
9
10
  """
10
11
  features/rerun_test.feature:2
12
+ features/rerun_test.feature:5
11
13
  """
12
14
  And a file named "features/rerun_test.feature" with:
13
15
  """
@@ -15,23 +17,31 @@ Feature: Rerun profile
15
17
  Scenario: failing before
16
18
  Given fixed now
17
19
 
20
+ Scenario: still failing
21
+ Given broken
22
+
18
23
  Scenario: always passing
19
24
  Given passing
20
25
  """
21
26
  And a file named "features/step_definitions/rerun_steps.rb" with:
22
27
  """
23
- Given /fixed now/ do
24
- puts "All fixed now"
28
+ Given('fixed now') do
29
+ puts 'All fixed now'
30
+ end
31
+
32
+ Given('broken') do
33
+ raise "I'm broken"
25
34
  end
26
35
 
27
- Given /passing/ do
36
+ Given('passing') do
28
37
  puts "I've always been passing"
29
38
  end
30
39
  """
31
- When I successfully run `bundle exec cucumber -p rerun`
32
- Then it should pass with:
40
+ When I run `bundle exec cucumber -p rerun`
41
+ Then it should fail with:
33
42
  """
34
- 1 scenario (1 passed)
35
- 1 step (1 passed)
43
+ 2 scenarios (1 failed, 1 passed)
44
+ 2 steps (1 failed, 1 passed)
36
45
  """
37
- And the file "rerun.txt" should not contain "features/rerun_test.feature:2"
46
+ And the file "rerun.txt" should not contain "features/rerun_test.feature:2"
47
+ And the file "rerun.txt" should contain "features/rerun_test.feature:5"
@@ -1,18 +1,18 @@
1
1
  Feature: REST API
2
2
 
3
3
  Scenario: Compare JSON
4
- Given I have created a new Rails app "rails-3-app" and installed cucumber-rails
5
- And I write to "app/controllers/posts_controller.rb" with:
4
+ Given I have created a new Rails app and installed cucumber-rails
5
+ When I write to "app/controllers/posts_controller.rb" with:
6
6
  """
7
7
  class PostsController < ApplicationController
8
8
  def index
9
- render :json => {'hello' => 'world'}.to_json
9
+ render json: {'hello' => 'world'}.to_json
10
10
  end
11
11
  end
12
12
  """
13
13
  And I write to "config/routes.rb" with:
14
14
  """
15
- Rails3App::Application.routes.draw do
15
+ TestApp::Application.routes.draw do
16
16
  resources :posts
17
17
  end
18
18
  """
@@ -28,20 +28,20 @@ Feature: REST API
28
28
  }
29
29
  \"\"\"
30
30
  """
31
- And I write to "features/step_definitions/rest_steps.rb" with:
31
+ And I write to "features/step_definitions/post_steps.rb" with:
32
32
  """
33
- When /^the client requests GET (.*)$/ do |path|
33
+ When('the client requests GET /{word}') do |path|
34
34
  get(path)
35
35
  end
36
36
 
37
- Then /^the response should be JSON:$/ do |json|
38
- JSON.parse(last_response.body).should == JSON.parse(json)
37
+ Then('the response should be JSON:') do |json|
38
+ expect(JSON.parse(last_response.body)).to eq(JSON.parse(json))
39
39
  end
40
40
  """
41
41
  And I run `bundle exec rake db:migrate`
42
42
  And I run `bundle exec rake cucumber`
43
- Then it should pass with:
44
- """
45
- 1 scenario (1 passed)
46
- 2 steps (2 passed)
47
- """
43
+ Then the feature run should pass with:
44
+ """
45
+ 1 scenario (1 passed)
46
+ 2 steps (2 passed)
47
+ """
@@ -1,83 +1,69 @@
1
- module CucumberRailsHelper
2
- def rails_new(options={})
3
- options[:name] ||= 'test_app'
4
- run_simple "bundle exec rails new #{options[:name]} --skip-test-unit #{options[:args]}"
5
- assert_passing_with('README')
6
- cd options[:name]
7
- end
1
+ # frozen_string_literal: true
8
2
 
9
- def install_cucumber_rails(*options)
10
- if options.include?(:not_in_test_group)
11
- gem "cucumber-rails", :path => "#{File.expand_path('.')}"
12
- else
13
- gem "cucumber-rails", :group => :test, :require => false, :path => "#{File.expand_path('.')}"
14
- end
15
- gem "capybara", :group => :test
16
- gem "rspec-rails", :group => :test
17
- gem "database_cleaner", :group => :test unless options.include?(:no_database_cleaner)
18
- gem 'factory_girl', :group => :test unless options.include?(:no_factory_girl)
19
- gem "selenium-webdriver", :group => :test
20
- run_simple "bundle exec rails generate cucumber:install"
21
- end
22
-
23
- def gem(name, options)
24
- line = %{gem "#{name}", #{options.inspect}\n}
25
- append_to_file('Gemfile', line)
26
- end
27
-
28
- def prepare_aruba_report
29
- if(ENV['ARUBA_REPORT_DIR'])
30
- @aruba_report_start = Time.new
31
- sleep(1)
32
- end
33
- end
34
-
35
- def fixture(path)
36
- File.expand_path(File.dirname(__FILE__) + "./../support/fixtures/#{path}")
37
- end
38
- end
39
- World(CucumberRailsHelper)
40
-
41
- Given /^I have created a new Rails app and installed cucumber\-rails, accidentally outside of the test group in my Gemfile$/ do
3
+ Given('I have created a new Rails app and installed cucumber-rails, accidentally outside of the test group in my Gemfile') do
42
4
  rails_new
43
5
  install_cucumber_rails :not_in_test_group
44
- create_web_steps
45
- prepare_aruba_report
46
- end
47
-
48
- Given /^I have created a new Rails app "([^"]*)" and installed cucumber\-rails$/ do |app_name|
49
- rails_new :name => app_name
50
- install_cucumber_rails
51
- create_web_steps
52
- prepare_aruba_report
53
6
  end
54
7
 
55
- Given /^I have created a new Rails app and installed cucumber\-rails$/ do
8
+ Given('I have created a new Rails app and installed cucumber-rails') do
56
9
  rails_new
57
10
  install_cucumber_rails
58
- create_web_steps
59
- prepare_aruba_report
60
11
  end
61
12
 
62
- Given /^I have created a new Rails app with no database and installed cucumber-rails$/ do
63
- rails_new :args => '--skip-active-record'
64
- install_cucumber_rails :no_database_cleaner, :no_factory_girl
13
+ Given('I have created a new Rails app with no database and installed cucumber-rails') do
14
+ rails_new args: '--skip-active-record'
15
+ install_cucumber_rails :no_database_cleaner, :no_factory_bot
65
16
  overwrite_file('features/support/env.rb', "require 'cucumber/rails'\n")
66
- create_web_steps
67
17
  end
68
18
 
69
- Given /^I have created a new Rails app "(.*?)" with no database and installed cucumber\-rails$/ do |app_name|
70
- rails_new :name => app_name, :args => '--skip-active-record'
71
- install_cucumber_rails :no_database_cleaner, :no_factory_girl
72
- overwrite_file('features/support/env.rb', "require 'cucumber/rails'\n")
73
- create_web_steps
19
+ Given('I have a {string} ActiveRecord model object') do |name|
20
+ run_command_and_stop("bundle exec rails g model #{name}")
21
+ run_command_and_stop('bundle exec rake db:migrate RAILS_ENV=test')
22
+ end
23
+
24
+ Given('I remove the {string} gem from the Gemfile') do |gem_name|
25
+ content = File.open(expand_path('Gemfile'), 'r').readlines
26
+ new_content = []
27
+
28
+ content.each do |line|
29
+ next if /gem ["|']#{gem_name}["|'].*/.match?(line)
30
+
31
+ new_content << line
32
+ end
33
+
34
+ overwrite_file('Gemfile', new_content.join("\r\n"))
35
+ end
36
+
37
+ Given('I force selenium to run Firefox in headless mode') do
38
+ selenium_config = %{
39
+ Capybara.register_driver :selenium do |app|
40
+ http_client = Selenium::WebDriver::Remote::Http::Default.new
41
+ http_client.read_timeout = 180
42
+
43
+ browser_options = Selenium::WebDriver::Firefox::Options.new
44
+ browser_options.args << '--headless'
45
+ Capybara::Selenium::Driver.new(
46
+ app,
47
+ browser: :firefox,
48
+ options: browser_options,
49
+ http_client: http_client
50
+ )
51
+ end
52
+
53
+ Capybara.server = :webrick
54
+ }
55
+
56
+ step 'I append to "features/support/env.rb" with:', selenium_config
74
57
  end
75
58
 
76
- Given /^I have a "([^"]*)" ActiveRecord model object$/ do |name|
77
- run_simple("bundle exec rails g model #{name}")
78
- run_simple("bundle exec rake db:migrate RAILS_ENV=test")
59
+ When('I run the cukes') do
60
+ run_command_and_stop('bundle exec cucumber')
79
61
  end
80
62
 
81
- When /^I run the cukes$/ do
82
- run_simple('bundle exec cucumber')
63
+ # Copied from Aruba
64
+ Then('the feature run should pass with:') do |string|
65
+ step 'the output should not contain " failed)"'
66
+ step 'the output should not contain " undefined)"'
67
+ step 'the exit status should be 0'
68
+ step 'the output should contain:', string
83
69
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ Aruba.configure do |config|
4
+ config.exit_timeout = 360
5
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CucumberRailsHelper
4
+ def rails_new(options = {})
5
+ validate_rails_new_success(run_rails_new_command(options))
6
+ clear_bundle_env_vars(options[:name])
7
+ end
8
+
9
+ def install_cucumber_rails(*options)
10
+ add_conditional_gems(options)
11
+
12
+ add_gem 'capybara', group: :test
13
+ add_gem 'selenium-webdriver', '~> 3.11', group: :test
14
+ add_gem 'rspec-expectations', '~> 3.7', group: :test
15
+ add_gem 'database_cleaner', '>= 1.8.0', group: :test unless options.include?(:no_database_cleaner)
16
+ add_gem 'factory_bot', '>= 3.2', group: :test unless options.include?(:no_factory_bot)
17
+
18
+ run_command_and_stop 'bundle install'
19
+ run_command_and_stop 'bundle exec rails webpacker:install' if rails6?
20
+ run_command_and_stop 'bundle exec rails generate cucumber:install'
21
+ end
22
+
23
+ def add_gem(name, *args)
24
+ line = convert_gem_opts_to_string(name, *args)
25
+ gem_regexp = /gem ["']#{name}["'].*$/
26
+ gemfile_content = File.read(expand_path('Gemfile'))
27
+
28
+ if gemfile_content&.match?(gem_regexp)
29
+ updated_gemfile_content = gemfile_content.gsub(gem_regexp, line)
30
+ overwrite_file('Gemfile', updated_gemfile_content)
31
+ else
32
+ append_to_file('Gemfile', line)
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def run_rails_new_command(options)
39
+ options[:name] ||= 'test_app'
40
+ flags = '--skip-bundle --skip-test-unit --skip-spring --skip-bootsnap'
41
+ flags += ' --skip-webpack-install' if rails6?
42
+ run_command "bundle exec rails new #{options[:name]} #{flags} #{options[:args]}"
43
+ end
44
+
45
+ def validate_rails_new_success(result)
46
+ expect(result).to have_output(/README/)
47
+ expect(last_command_started).to be_successfully_executed
48
+ end
49
+
50
+ def clear_bundle_env_vars(dir)
51
+ cd dir
52
+ delete_environment_variable 'RUBYOPT'
53
+ delete_environment_variable 'BUNDLE_BIN_PATH'
54
+ delete_environment_variable 'BUNDLE_GEMFILE'
55
+ end
56
+
57
+ def rails6?
58
+ `bundle exec rails -v`.start_with?('Rails 6')
59
+ end
60
+
61
+ def add_conditional_gems(options)
62
+ if options.include?(:not_in_test_group)
63
+ add_gem 'cucumber-rails', path: File.expand_path('.').to_s
64
+ else
65
+ add_gem 'cucumber-rails', group: :test, require: false, path: File.expand_path('.').to_s
66
+ end
67
+
68
+ if rails6?
69
+ add_gem 'sqlite3', '~> 1.4'
70
+ else
71
+ add_gem 'sqlite3', '~> 1.3.13'
72
+ end
73
+ end
74
+
75
+ def convert_gem_opts_to_string(name, *args)
76
+ options = args.last.is_a?(Hash) ? args.pop : {}
77
+ parts = ["'#{name}'"]
78
+ parts << args.map(&:inspect) if args.any?
79
+ parts << options.inspect[1..-2] if options.any?
80
+ new_parts = parts.flatten.map { |part| part.gsub(/:(\w+)=>/, '\1: ') }
81
+ "gem #{new_parts.join(', ')}\n"
82
+ end
83
+ end
84
+
85
+ World(CucumberRailsHelper)
@@ -1,37 +1,6 @@
1
- $:.unshift(File.dirname(__FILE__) + '/../../lib')
2
- require 'rubygems'
3
- require 'bundler/setup'
4
- require 'rspec/expectations'
5
- require 'aruba/cucumber'
6
-
7
- Before do
8
- @aruba_timeout_seconds = 120 # A long time needed some times
9
- unset_bundler_env_vars
10
- end
1
+ # frozen_string_literal: true
11
2
 
12
- if(ENV['ARUBA_REPORT_DIR'])
13
- # Override reporting behaviour so we don't document all files, only the ones
14
- # that have been created after @aruba_report_start (a Time object). This is
15
- # given a value after the Rails app is generated (see cucumber_rails_steps.rb)
16
- module Aruba
17
- module Reporting
18
- def children(dir)
19
- children = Dir["#{dir}/*"].sort
20
-
21
- # include
22
- children = children.select do |child|
23
- File.directory?(child) ||
24
- (@aruba_report_start && File.stat(child).mtime > @aruba_report_start)
25
- end
26
-
27
- # exclude
28
- children = children.reject do |child|
29
- child =~ /Gemfile/ ||
30
- child =~ /\.log$/
31
- end
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
32
4
 
33
- children
34
- end
35
- end
36
- end
37
- end
5
+ require 'rspec/expectations'
6
+ require 'aruba/cucumber'
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ After do |scenario|
4
+ if scenario.failed?
5
+ puts last_command_stopped.stdout
6
+ puts last_command_stopped.stderr
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "capybara", "< 3.16.0", platform: :mri_23
6
+ gem "nokogiri", "< 1.9.1", platform: :mri_23
7
+ gem "railties", "~> 4.2.11"
8
+ gem "sqlite3", "~> 1.3.13"
9
+
10
+ gemspec path: "../"
@@ -0,0 +1,10 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "capybara", "< 3.16.0", platform: :mri_23
6
+ gem "nokogiri", "< 1.9.1", platform: :mri_23
7
+ gem "railties", "~> 5.0.7"
8
+ gem "sqlite3", "~> 1.3.13"
9
+
10
+ gemspec path: "../"
@@ -0,0 +1,10 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "capybara", "< 3.16.0", platform: :mri_23
6
+ gem "nokogiri", "< 1.9.1", platform: :mri_23
7
+ gem "railties", "~> 5.1.7"
8
+ gem "sqlite3", "~> 1.3.13"
9
+
10
+ gemspec path: "../"
@@ -0,0 +1,10 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "capybara", "< 3.16.0", platform: :mri_23
6
+ gem "nokogiri", "< 1.9.1", platform: :mri_23
7
+ gem "railties", "~> 5.2.0"
8
+ gem "sqlite3", "~> 1.3.13"
9
+
10
+ gemspec path: "../"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "railties", "~> 6.0.0"
6
+ gem "rails", "~> 6.0.0"
7
+ gem "sqlite3", "~> 1.4"
8
+
9
+ gemspec path: "../"
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActionController::Base.class_eval do
4
+ cattr_accessor :allow_rescue
5
+ end
6
+
7
+ module Cucumber
8
+ module Rails
9
+ module ActionDispatch
10
+ module ShowExceptions
11
+ def call(env)
12
+ env['action_dispatch.show_detailed_exceptions'] = !ActionController::Base.allow_rescue
13
+ env['action_dispatch.show_exceptions'] = !env['action_dispatch.show_detailed_exceptions']
14
+ super(env)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ ActionDispatch::ShowExceptions.prepend(Cucumber::Rails::ActionDispatch::ShowExceptions)
@@ -1,17 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails/application'
2
4
 
3
5
  # Make sure the ActionDispatch::ShowExceptions middleware is always enabled,
4
6
  # regardless of what is in config/environments/test.rb
5
7
  # Instead we are overriding ActionDispatch::ShowExceptions to be able to
6
8
  # toggle whether or not exceptions are raised.
7
- class Rails::Application
8
- alias __cucumber_orig_initialize__ initialize!
9
-
10
- def initialize!
11
- ad = config.action_dispatch
12
- def ad.show_exceptions
13
- true
9
+
10
+ module Cucumber
11
+ module Rails
12
+ module Application
13
+ def initialize!
14
+ ad = config.action_dispatch
15
+
16
+ def ad.show_exceptions
17
+ true
18
+ end
19
+
20
+ super
21
+ end
14
22
  end
15
- __cucumber_orig_initialize__
16
23
  end
17
24
  end
25
+
26
+ Rails::Application.prepend(Cucumber::Rails::Application)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Cucumber
2
4
  module Rails
3
5
  module Capybara
@@ -8,10 +10,12 @@ module Cucumber
8
10
  alias_method :click, :click_with_javascript_emulation
9
11
  end
10
12
  end
11
-
12
- def click_with_javascript_emulation
13
+
14
+ def click_with_javascript_emulation(*)
13
15
  if link_with_non_get_http_method?
14
- ::Capybara::RackTest::Form.new(driver, js_form(element_node.document, self[:href], emulated_method)).submit(self)
16
+ ::Capybara::RackTest::Form.new(
17
+ driver, js_form(element_node.document, self[:href], emulated_method)
18
+ ).submit(self)
15
19
  else
16
20
  click_without_javascript_emulation
17
21
  end
@@ -44,61 +48,65 @@ module Cucumber
44
48
  js_form['action'] = action
45
49
  js_form['method'] = method
46
50
 
47
- if emulated_method and emulated_method.downcase != method.downcase
48
- input = document.create_element('input')
49
- input['type'] = 'hidden'
50
- input['name'] = '_method'
51
- input['value'] = emulated_method
52
- js_form.add_child(input)
53
- end
51
+ add_hidden_method_input(document, js_form) unless same?(emulated_method, method)
52
+
53
+ # rails will wipe the session if the CSRF token is not sent with non-GET requests
54
+ add_hidden_csrf_input(document, js_form) if csrf? && !get?(emulated_method)
54
55
 
55
- # rails will wipe the session if the CSRF token is not sent
56
- # with non-GET requests
57
- if csrf? && emulated_method.downcase != "get"
58
- input = document.create_element('input')
59
- input['type'] = 'hidden'
60
- input['name'] = csrf_param
61
- input['value'] = csrf_token
62
- js_form.add_child(input)
63
- end
64
-
65
56
  js_form
66
57
  end
67
58
 
59
+ def same?(emulated_method, method)
60
+ emulated_method.casecmp(method).zero?
61
+ end
62
+
63
+ def add_hidden_method_input(document, js_form)
64
+ input = document.create_element('input')
65
+ input['type'] = 'hidden'
66
+ input['name'] = '_method'
67
+ input['value'] = emulated_method
68
+ js_form.add_child(input)
69
+ end
70
+
71
+ def get?(emulated_method)
72
+ same?(emulated_method, 'get')
73
+ end
74
+
75
+ def add_hidden_csrf_input(document, js_form)
76
+ input = document.create_element('input')
77
+ input['type'] = 'hidden'
78
+ input['name'] = csrf_param
79
+ input['value'] = csrf_token
80
+ js_form.add_child(input)
81
+ end
82
+
68
83
  def link_with_non_get_http_method?
69
- if ::Rails.version.to_f >= 3.0
70
- tag_name == 'a' && element_node['data-method'] && element_node['data-method'] =~ /(?:delete|put|post)/
71
- else
72
- tag_name == 'a' && element_node['onclick'] && element_node['onclick'] =~ /var f = document\.createElement\('form'\); f\.style\.display = 'none';/
73
- end
84
+ tag_name == 'a' &&
85
+ element_node['data-method'] &&
86
+ element_node['data-method'] =~ /(?:delete|put|post)/
74
87
  end
75
88
 
76
89
  def emulated_method
77
- if ::Rails.version.to_f >= 3.0
78
- element_node['data-method']
79
- else
80
- element_node['onclick'][/m\.setAttribute\('value', '([^']*)'\)/, 1]
81
- end
90
+ element_node['data-method']
82
91
  end
83
92
 
84
93
  def element_node
85
- if self.respond_to? :native
86
- self.native
87
- else
88
- warn "DEPRECATED: cucumber-rails loves you, just not your version of Capybara. Please update Capybara to >= 0.4.0"
89
- self.node
90
- end
94
+ native
91
95
  end
92
96
  end
93
97
  end
94
98
  end
95
99
  end
96
100
 
97
- class Capybara::RackTest::Node
98
- include ::Cucumber::Rails::Capybara::JavascriptEmulation
101
+ module Capybara
102
+ module RackTest
103
+ class Node
104
+ include ::Cucumber::Rails::Capybara::JavascriptEmulation
105
+ end
106
+ end
99
107
  end
100
108
 
101
- Before('~@no-js-emulation') do
109
+ Before('not @no-js-emulation') do
102
110
  # Enable javascript emulation
103
111
  ::Capybara::RackTest::Node.class_eval do
104
112
  alias_method :click, :click_with_javascript_emulation