cucumber-rails 1.5.0 → 2.1.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.
Files changed (83) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE.md +52 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +42 -0
  4. data/.gitignore +3 -1
  5. data/.rspec +4 -1
  6. data/.rubocop.yml +68 -0
  7. data/.travis.yml +43 -33
  8. data/Appraisals +25 -92
  9. data/{History.md → CHANGELOG.md} +242 -40
  10. data/CONTRIBUTING.md +15 -24
  11. data/Gemfile +2 -4
  12. data/LICENSE +1 -1
  13. data/README.md +57 -27
  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 +2 -5
  18. data/cucumber-rails.gemspec +35 -28
  19. data/dev_tasks/cucumber.rake +2 -0
  20. data/dev_tasks/rspec.rake +2 -0
  21. data/dev_tasks/yard.rake +7 -14
  22. data/dev_tasks/yard/default/layout/html/setup.rb +6 -1
  23. data/features/allow_rescue.feature +16 -11
  24. data/features/annotations.feature +8 -11
  25. data/features/capybara_javascript_drivers.feature +38 -28
  26. data/features/choose_javascript_database_strategy.feature +37 -57
  27. data/features/configuration.feature +48 -0
  28. data/features/database_cleaner.feature +18 -18
  29. data/features/disable_automatic_database_cleaning.feature +12 -18
  30. data/features/emulate_javascript.feature +64 -47
  31. data/features/install_cucumber_rails.feature +4 -4
  32. data/features/no_database.feature +8 -19
  33. data/features/raising_errors.feature +9 -3
  34. data/features/rerun_profile.feature +17 -7
  35. data/features/rest_api.feature +12 -12
  36. data/features/step_definitions/cucumber_rails_steps.rb +44 -88
  37. data/features/support/aruba.rb +3 -1
  38. data/features/support/cucumber_rails_helper.rb +85 -0
  39. data/features/support/env.rb +4 -30
  40. data/features/support/hooks.rb +8 -0
  41. data/gemfiles/rails_4_2.gemfile +5 -13
  42. data/gemfiles/rails_5_0.gemfile +5 -12
  43. data/gemfiles/rails_5_1.gemfile +4 -9
  44. data/gemfiles/rails_5_2.gemfile +10 -0
  45. data/gemfiles/rails_6_0.gemfile +9 -0
  46. data/lib/cucumber/rails.rb +17 -15
  47. data/lib/cucumber/rails/action_dispatch.rb +21 -0
  48. data/lib/cucumber/rails/application.rb +16 -7
  49. data/lib/cucumber/rails/capybara.rb +2 -0
  50. data/lib/cucumber/rails/capybara/javascript_emulation.rb +45 -37
  51. data/lib/cucumber/rails/capybara/select_dates_and_times.rb +6 -4
  52. data/lib/cucumber/rails/database.rb +30 -8
  53. data/lib/cucumber/rails/hooks.rb +2 -0
  54. data/lib/cucumber/rails/hooks/active_record.rb +14 -12
  55. data/lib/cucumber/rails/hooks/allow_rescue.rb +2 -0
  56. data/lib/cucumber/rails/hooks/database_cleaner.rb +6 -4
  57. data/lib/cucumber/rails/hooks/mail.rb +4 -4
  58. data/lib/cucumber/rails/rspec.rb +3 -1
  59. data/lib/cucumber/rails/world.rb +24 -7
  60. data/lib/generators/cucumber/{install/USAGE → USAGE} +0 -0
  61. data/lib/generators/cucumber/{install/install_generator.rb → install_generator.rb} +23 -10
  62. data/lib/generators/cucumber/{install/templates → templates}/config/cucumber.yml.erb +4 -3
  63. data/lib/generators/cucumber/{install/templates → templates}/script/cucumber +1 -0
  64. data/lib/generators/cucumber/{install/templates → templates}/support/_rails_each_run.rb.erb +2 -2
  65. data/lib/generators/cucumber/{install/templates → templates}/support/_rails_prefork.rb.erb +0 -0
  66. data/lib/generators/cucumber/{install/templates → templates}/support/capybara.rb +2 -0
  67. data/lib/generators/cucumber/{install/templates → templates}/support/edit_warning.txt +0 -0
  68. data/lib/generators/cucumber/{install/templates → templates}/support/rails.rb.erb +0 -0
  69. data/lib/generators/cucumber/{install/templates → templates}/support/rails_spork.rb.erb +0 -0
  70. data/lib/generators/cucumber/{install/templates → templates}/tasks/cucumber.rake.erb +9 -9
  71. data/spec/cucumber/rails/database_spec.rb +46 -33
  72. data/spec/generators/cucumber/{install/install_generator_spec.rb → install_generator_spec.rb} +17 -9
  73. data/spec/spec_helper.rb +13 -4
  74. metadata +105 -139
  75. data/Gemfile.appraisal +0 -3
  76. data/features/support/bundler_pre_support.rb +0 -28
  77. data/features/support/fixtures/bundler-1.0.21.gem +0 -0
  78. data/features/support/fixtures/bundler-1.1.rc.gem +0 -0
  79. data/features/support/legacy_web_steps_support.rb +0 -289
  80. data/gemfiles/lowest_version_bounds.gemfile +0 -26
  81. data/gemfiles/rails_4_0.gemfile +0 -19
  82. data/gemfiles/rails_4_1.gemfile +0 -18
  83. data/lib/cucumber/rails/action_controller.rb +0 -12
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'yard'
2
4
  require 'yard/rake/yardoc_task'
3
5
 
@@ -6,9 +8,8 @@ API_DIR = File.join(SITE_DIR, 'api', 'cucumber-rails', 'ruby', 'yardoc')
6
8
 
7
9
  namespace :api do
8
10
  file :dir do
9
- unless File.directory?(SITE_DIR)
10
- raise "You need to git clone git@github.com:cucumber/cucumber.github.com.git #{SITE_DIR}"
11
- end
11
+ raise "You need to git clone git@github.com:cucumber/cucumber.github.com.git #{SITE_DIR}" unless File.directory?(SITE_DIR)
12
+
12
13
  sh('git pull origin master')
13
14
  mkdir_p API_DIR
14
15
  end
@@ -18,18 +19,10 @@ namespace :api do
18
19
  YARD::Rake::YardocTask.new(:yard) do |yard|
19
20
  dir = API_DIR
20
21
  mkdir_p dir
21
- yard.options = ["--out", dir]
22
- end
23
- task :yard => :dir
24
-
25
- task :release do
26
- Dir.chdir(SITE_DIR) do
27
- sh('git add .')
28
- sh("git commit -m 'Update API docs for cucumber-rails v#{cucumber-rails::VERSION}'")
29
- sh('git push origin master')
30
- end
22
+ yard.options = ['--out', dir]
31
23
  end
24
+ task yard: :dir
32
25
 
33
26
  desc "Generate YARD docs for Cucumber-Rails' API"
34
- task :doc => [:yard, :release]
27
+ task doc: :yard
35
28
  end
@@ -1,4 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  def init
2
4
  super
3
- options[:serializer].serialize('/images/bubble_32x32.png', IO.read(File.dirname(__FILE__) + '/bubble_32x32.png'))
5
+ options[:serializer].serialize(
6
+ '/images/bubble_32x32.png',
7
+ IO.read(File.dirname(__FILE__) + '/bubble_32x32.png')
8
+ )
4
9
  end
@@ -1,54 +1,59 @@
1
1
  Feature: Allow Cucumber to rescue exceptions
2
2
 
3
3
  Background: A controller that raises an exception
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
- raise "There is an error in index"
9
+ raise 'There is an error in index'
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
  """
19
19
 
20
20
  Scenario: Allow rescue
21
- Given I write to "features/posts.feature" with:
21
+ When I write to "features/posts.feature" with:
22
22
  """
23
- Feature: posts
23
+ Feature: Posts
24
24
  @allow-rescue
25
25
  Scenario: See posts
26
26
  When I look at the posts
27
+ Then I should see the public error page
27
28
  """
28
29
  And I write to "features/step_definitions/posts_steps.rb" with:
29
30
  """
30
- When /^I look at the posts$/ do
31
+ When('I look at the posts') do
31
32
  visit '/posts'
32
33
  end
34
+
35
+ Then('I should see the public error page') do
36
+ expect(page).to have_content "We're sorry, but something went wrong."
37
+ end
33
38
  """
34
39
  And I run `bundle exec rake db:migrate`
35
40
  And I run `bundle exec cucumber`
36
41
  Then the feature run should pass with:
37
42
  """
38
43
  1 scenario (1 passed)
39
- 1 step (1 passed)
44
+ 2 steps (2 passed)
40
45
  """
41
46
 
42
47
  Scenario: Don't allow rescue
43
- Given I write to "features/posts.feature" with:
48
+ When I write to "features/posts.feature" with:
44
49
  """
45
- Feature: posts
50
+ Feature: Posts
46
51
  Scenario: See them
47
52
  When I look at the posts
48
53
  """
49
54
  And I write to "features/step_definitions/posts_steps.rb" with:
50
55
  """
51
- When /^I look at the posts$/ do
56
+ When('I look at the posts') do
52
57
  visit '/posts'
53
58
  end
54
59
  """
@@ -1,23 +1,20 @@
1
- @requires-rails-version-42
2
1
  Feature: Annotations
3
2
 
4
- I order to track my development progress
3
+ In order to track my development progress
5
4
  As a developer
6
5
  I should be able to list annotations in my features
7
6
 
8
- Background:
9
- Given I have created a new Rails app "test-app" with no database and installed cucumber-rails
10
- And I write to "features/tests.feature" with:
7
+ Scenario: See annotations in feature file
8
+ Given I have created a new Rails app with no database and installed cucumber-rails
9
+ When I write to "features/products.feature" with:
11
10
  """
12
- Feature: Tests
13
- Scenario: Tests
11
+ Feature: Products
12
+ Scenario: Test a Product
14
13
  # TODO: When I go to the products page
15
14
  """
16
-
17
- Scenario: See annotations in .feature file
18
15
  When I run `bundle exec rake notes`
19
16
  Then it should pass with:
20
17
  """
21
- features/tests.feature:
22
- * [ 3] [TODO] When I go to the products page
18
+ features/products.feature:
19
+ * [3] [TODO] When I go to the products page
23
20
  """
@@ -3,37 +3,45 @@ Feature: Capybara Javascript Drivers
3
3
 
4
4
  Background: A simple calendar app
5
5
  Given I have created a new Rails app and installed cucumber-rails
6
- And I successfully run `bundle exec rails g scaffold appointment name:string when:datetime`
7
- And I write to "features/step_definitions/date_time_steps.rb" with:
8
- """
9
- When /^(?:|I )select "([^"]+)" as the "([^"]+)" time$/ do |time, selector|
10
- select_time(time, :from => selector)
11
- end
12
-
13
- When /^(?:|I )select "([^"]+)" as the "([^"]+)" date$/ do |date, selector|
14
- select_date(date, :from => selector)
15
- end
16
-
17
- When /^(?:|I )select "([^"]+)" as the "([^"]+)" date and time$/ do |datetime, selector|
18
- select_datetime(datetime, :from => selector)
19
- end
20
- """
6
+ And I force selenium to run Firefox in headless mode
7
+ When I run `bundle exec rails g scaffold appointment name:string when:datetime`
21
8
 
22
9
  Scenario: Use a particular driver
23
- Given I write to "features/create_appointment.feature" with:
10
+ When I write to "features/create_appointment.feature" with:
24
11
  """
25
12
  @javascript
26
13
  Feature: Create appointments
27
- Scenario: Constitution on May 17
14
+ Scenario: Visit the Constitution on May 17
28
15
  Given I am on the new appointment page
29
16
  And I fill in "Norway's constitution" for "Name"
30
17
  And I select "2015-02-20 15:10:00 UTC" as the "When" date and time
31
18
  And I press "Create Appointment"
32
19
  Then I should see "Norway's constitution"
33
20
  And I should see "2015-02-20 15:10:00 UTC"
21
+ """
22
+ And I write to "features/create_appointment_steps.rb" with:
23
+ """
24
+ Given('I am on the new appointment page') do
25
+ visit new_appointment_path
26
+ end
34
27
 
28
+ When('I fill in {string} for {string}') do |value, field|
29
+ fill_in(field, with: value)
30
+ end
31
+
32
+ When('I press {string}') do |button|
33
+ click_button(button)
34
+ end
35
+
36
+ Then('I should see {string}') do |text|
37
+ expect(page).to have_content(text)
38
+ end
39
+
40
+ When('I select {string} as the {string} date and time') do |datetime, selector|
41
+ select_datetime(datetime, from: selector)
42
+ end
35
43
  """
36
- When I run `bundle exec rake db:migrate`
44
+ And I run `bundle exec rake db:migrate`
37
45
  And I run `bundle exec rake cucumber`
38
46
  Then the feature run should pass with:
39
47
  """
@@ -42,28 +50,30 @@ Feature: Capybara Javascript Drivers
42
50
  """
43
51
 
44
52
  Scenario: Mixed DB access
45
- Given I write to "features/create_appointment.feature" with:
53
+ When I write to "features/create_appointment.feature" with:
46
54
  """
47
55
  @javascript
48
56
  Feature: Create appointments
49
- Scenario: Constitution on May 17
57
+ Scenario: Visit the Constitution on May 17
50
58
  Given a random appointment
51
- And I am viewing random appointment
59
+ And I am viewing the appointment
52
60
  Then I should see "Random appointment"
53
-
54
61
  """
55
- And I write to "features/step_definitions/custom_steps.rb" with:
62
+ And I write to "features/step_definitions/create_appointment_steps.rb" with:
56
63
  """
57
- Given /^a random appointment$/ do
58
- @appointment = Appointment.create!(:name => 'Random appointment', :when => DateTime.now)
64
+ Given('a random appointment') do
65
+ @appointment = Appointment.create!(name: 'Random appointment', when: DateTime.now)
59
66
  end
60
67
 
61
- Given /^I am viewing random appointment$/ do
68
+ Given('I am viewing the appointment') do
62
69
  visit appointment_path(@appointment)
63
70
  end
64
- """
65
71
 
66
- When I run `bundle exec rake db:migrate`
72
+ Then('I should see {string}') do |text|
73
+ expect(page).to have_content(text)
74
+ end
75
+ """
76
+ And I run `bundle exec rake db:migrate`
67
77
  And I run `bundle exec rake cucumber`
68
78
  Then the feature run should pass with:
69
79
  """
@@ -1,9 +1,9 @@
1
1
  Feature: Choose javascript database strategy
2
2
 
3
- When running a scenario with the @javascript tag, Capybara will fire up a web server
3
+ Whilst running a scenario with the @javascript tag, Capybara will fire up a web server
4
4
  in the same process in a separate thread to your cukes. By default, this means ActiveRecord will give it a
5
5
  separate database connection, which in turn means data you put into your database from
6
- Cucumber step definitions (e.g. using FactoryGirl) won't be visible to the web server
6
+ Cucumber step definitions (e.g. using FactoryBot) won't be visible to the web server
7
7
  until the database transaction is committed.
8
8
 
9
9
  So if you use a transaction strategy for cleaning up your database at the end of a scenario,
@@ -26,9 +26,23 @@ Feature: Choose javascript database strategy
26
26
  Background:
27
27
  Given I have created a new Rails app and installed cucumber-rails
28
28
  And I have a "Widget" ActiveRecord model object
29
+ When I write to "features/step_definitions/widget_steps.rb" with:
30
+ """
31
+ When('I create {int} widgets') do |number|
32
+ number.times { Widget.create! }
33
+ end
34
+
35
+ Then('I should have {int} widgets') do |number|
36
+ expect(Widget.count).to eq(number)
37
+ end
38
+
39
+ Then('the DatabaseCleaner strategy should be {word}') do |strategy_name|
40
+ expect(DatabaseCleaner.cleaners.values.first.strategy.to_s).to match(/#{strategy_name}/i)
41
+ end
42
+ """
29
43
 
30
44
  Scenario: Set the strategy to truncation and run a javascript scenario.
31
- Given I append to "features/env.rb" with:
45
+ When I append to "features/env.rb" with:
32
46
  """
33
47
  DatabaseCleaner.strategy = :transaction
34
48
  Cucumber::Rails::Database.javascript_strategy = :truncation
@@ -37,13 +51,13 @@ Feature: Choose javascript database strategy
37
51
  """
38
52
  Feature:
39
53
  Background:
40
- Given I have created 2 widgets
54
+ When I create 2 widgets
41
55
 
42
56
  @javascript
43
57
  Scenario:
44
- Then the DatabaseCleaner strategy should be truncation
45
58
  When I create 3 widgets
46
- Then I should have 5 widgets
59
+ Then the DatabaseCleaner strategy should be truncation
60
+ And I should have 5 widgets
47
61
 
48
62
  @javascript
49
63
  Scenario:
@@ -54,29 +68,15 @@ Feature: Choose javascript database strategy
54
68
  Then the DatabaseCleaner strategy should be transaction
55
69
  And I should have 2 widgets
56
70
  """
57
- And I write to "features/step_definitions/widget_steps.rb" with:
71
+ And I run the cukes
72
+ Then the feature run should pass with:
58
73
  """
59
- Given /created? (\d) widgets/ do |num|
60
- num.to_i.times { Widget.create! }
61
- end
62
-
63
- Then /should have (\d) widgets/ do |num|
64
- Widget.count.should == num.to_i
65
- end
66
-
67
- Then /^the DatabaseCleaner strategy should be (\w+)$/ do |strategy_name|
68
- DatabaseCleaner.connections.first.strategy.to_s.should =~ /#{strategy_name}/i
69
- end
74
+ 3 scenarios (3 passed)
75
+ 10 steps (10 passed)
70
76
  """
71
- When I run the cukes
72
- Then the feature run should pass with:
73
- """
74
- 3 scenarios (3 passed)
75
- 10 steps (10 passed)
76
- """
77
77
 
78
- Scenario: Set the strategy to deletion and run a javascript scenario.
79
- Given I append to "features/env.rb" with:
78
+ Scenario: Set the strategy to deletion and run a javascript scenario.
79
+ When I append to "features/env.rb" with:
80
80
  """
81
81
  Cucumber::Rails::Database.javascript_strategy = :deletion
82
82
  """
@@ -85,7 +85,7 @@ Feature: Choose javascript database strategy
85
85
  @javascript
86
86
  Feature:
87
87
  Background:
88
- Given I have created 2 widgets
88
+ When I create 2 widgets
89
89
 
90
90
  Scenario:
91
91
  When I create 3 widgets
@@ -94,27 +94,17 @@ Feature: Choose javascript database strategy
94
94
  Scenario:
95
95
  Then I should have 2 widgets
96
96
  """
97
- And I write to "features/step_definitions/widget_steps.rb" with:
97
+ And I run the cukes
98
+ Then the feature run should pass with:
98
99
  """
99
- Given /created? (\d) widgets/ do |num|
100
- num.to_i.times { Widget.create! }
101
- end
102
-
103
- Then /should have (\d) widgets/ do |num|
104
- Widget.count.should == num.to_i
105
- end
100
+ 2 scenarios (2 passed)
101
+ 5 steps (5 passed)
106
102
  """
107
- When I run the cukes
108
- Then the feature run should pass with:
109
- """
110
- 2 scenarios (2 passed)
111
- 5 steps (5 passed)
112
- """
113
103
 
114
104
  Scenario: Set the strategy to truncation with an except option and run a javascript scenario.
115
- Given I append to "features/env.rb" with:
105
+ When I append to "features/env.rb" with:
116
106
  """
117
- Cucumber::Rails::Database.javascript_strategy = :truncation, {:except=>%w[widgets]}
107
+ Cucumber::Rails::Database.javascript_strategy = :truncation, { except: %w[widgets] }
118
108
  """
119
109
  And I write to "features/widgets.feature" with:
120
110
  """
@@ -127,19 +117,9 @@ Feature: Choose javascript database strategy
127
117
  Scenario:
128
118
  Then I should have 3 widgets
129
119
  """
130
- And I write to "features/step_definitions/widget_steps.rb" with:
120
+ And I run the cukes
121
+ Then the feature run should pass with:
131
122
  """
132
- Given /created? (\d) widgets/ do |num|
133
- num.to_i.times { Widget.create! }
134
- end
135
-
136
- Then /should have (\d) widgets/ do |num|
137
- Widget.count.should == num.to_i
138
- end
123
+ 2 scenarios (2 passed)
124
+ 3 steps (3 passed)
139
125
  """
140
- When I run the cukes
141
- Then the feature run should pass with:
142
- """
143
- 2 scenarios (2 passed)
144
- 3 steps (3 passed)
145
- """
@@ -0,0 +1,48 @@
1
+ Feature: Cucumber Rails Configuration
2
+
3
+ In order to configure how Cucumber-Rails runs
4
+ As a developer
5
+ I should be able to alter the settings of my project
6
+
7
+ Scenario: Default configuration
8
+ Given I have created a new Rails app with no database and installed cucumber-rails
9
+ When I write to "features/config.feature" with:
10
+ """
11
+ Feature: Rack Test Methods
12
+ Scenario: Default Methods are added to the World
13
+ Then Rack Test should be mixed into the Cucumber World
14
+ """
15
+ When I write to "features/step_definitions/config_steps.rb" with:
16
+ """
17
+ Then('Rack Test should be mixed into the Cucumber World') do
18
+ expect(self.class.ancestors).to include(Rack::Test::Methods)
19
+ end
20
+ """
21
+ And I run `bundle exec rake cucumber`
22
+ Then the feature run should pass with:
23
+ """
24
+ 1 scenario (1 passed)
25
+ 1 step (1 passed)
26
+ """
27
+
28
+ Scenario: Altered configuration
29
+ Given I have created a new Rails app with no database and installed cucumber-rails
30
+ And I set the environment variable "CR_REMOVE_RACK_TEST_HELPERS" to "true"
31
+ When I write to "features/config.feature" with:
32
+ """
33
+ Feature: Rack Test Methods
34
+ Scenario: Rack Test Methods can be removed from the world
35
+ Then Rack Test should not be mixed into the Cucumber World
36
+ """
37
+ When I write to "features/step_definitions/config_steps.rb" with:
38
+ """
39
+ Then('Rack Test should not be mixed into the Cucumber World') do
40
+ expect(self.class.ancestors).not_to include(Rack::Test::Methods)
41
+ end
42
+ """
43
+ And I run `bundle exec rake cucumber`
44
+ Then the feature run should pass with:
45
+ """
46
+ 1 scenario (1 passed)
47
+ 1 step (1 passed)
48
+ """