cucumber-rails 1.7.0 → 2.3.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 (87) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +197 -19
  3. data/CONTRIBUTING.md +16 -14
  4. data/LICENSE +1 -1
  5. data/README.md +27 -21
  6. data/lib/cucumber/rails.rb +23 -17
  7. data/lib/cucumber/rails/action_dispatch.rb +21 -0
  8. data/lib/cucumber/rails/application.rb +16 -7
  9. data/lib/cucumber/rails/capybara.rb +2 -0
  10. data/lib/cucumber/rails/capybara/javascript_emulation.rb +42 -21
  11. data/lib/cucumber/rails/capybara/select_dates_and_times.rb +3 -1
  12. data/lib/cucumber/rails/database.rb +24 -56
  13. data/lib/cucumber/rails/database/deletion_strategy.rb +13 -0
  14. data/lib/cucumber/rails/database/shared_connection_strategy.rb +27 -0
  15. data/lib/cucumber/rails/database/strategy.rb +33 -0
  16. data/lib/cucumber/rails/database/truncation_strategy.rb +13 -0
  17. data/lib/cucumber/rails/hooks.rb +2 -0
  18. data/lib/cucumber/rails/hooks/active_record.rb +8 -4
  19. data/lib/cucumber/rails/hooks/allow_rescue.rb +2 -0
  20. data/lib/cucumber/rails/hooks/database_cleaner.rb +11 -3
  21. data/lib/cucumber/rails/hooks/mail.rb +3 -1
  22. data/lib/cucumber/rails/rspec.rb +3 -1
  23. data/lib/cucumber/rails/world.rb +24 -7
  24. data/lib/generators/cucumber/{install/USAGE → USAGE} +0 -0
  25. data/lib/generators/cucumber/{install/install_generator.rb → install_generator.rb} +18 -9
  26. data/lib/generators/cucumber/{install/templates → templates}/config/cucumber.yml.erb +0 -0
  27. data/lib/generators/cucumber/{install/templates → templates}/script/cucumber +1 -0
  28. data/lib/generators/cucumber/{install/templates → templates}/support/_rails_each_run.rb.erb +0 -0
  29. data/lib/generators/cucumber/{install/templates → templates}/support/_rails_prefork.rb.erb +0 -0
  30. data/lib/generators/cucumber/{install/templates → templates}/support/capybara.rb +2 -0
  31. data/lib/generators/cucumber/{install/templates → templates}/support/edit_warning.txt +0 -0
  32. data/lib/generators/cucumber/{install/templates → templates}/support/rails.rb.erb +0 -0
  33. data/lib/generators/cucumber/{install/templates → templates}/support/rails_spork.rb.erb +0 -0
  34. data/lib/generators/cucumber/{install/templates → templates}/tasks/cucumber.rake.erb +0 -0
  35. metadata +100 -169
  36. data/.github/ISSUE_TEMPLATE.md +0 -52
  37. data/.github/PULL_REQUEST_TEMPLATE.md +0 -42
  38. data/.gitignore +0 -13
  39. data/.rspec +0 -1
  40. data/.rubocop.yml +0 -1
  41. data/.rubocop_todo.yml +0 -443
  42. data/.travis.yml +0 -45
  43. data/Appraisals +0 -32
  44. data/Gemfile +0 -7
  45. data/Rakefile +0 -49
  46. data/bin/install_geckodriver.sh +0 -19
  47. data/bin/install_webpacker.sh +0 -9
  48. data/config/.gitignore +0 -1
  49. data/config/cucumber.yml +0 -17
  50. data/cucumber-rails.gemspec +0 -44
  51. data/dev_tasks/cucumber.rake +0 -3
  52. data/dev_tasks/rspec.rake +0 -3
  53. data/dev_tasks/yard.rake +0 -35
  54. data/dev_tasks/yard/default/layout/html/bubble_32x32.png +0 -0
  55. data/dev_tasks/yard/default/layout/html/footer.erb +0 -5
  56. data/dev_tasks/yard/default/layout/html/index.erb +0 -1
  57. data/dev_tasks/yard/default/layout/html/layout.erb +0 -25
  58. data/dev_tasks/yard/default/layout/html/logo.erb +0 -1
  59. data/dev_tasks/yard/default/layout/html/setup.rb +0 -4
  60. data/features/allow_rescue.feature +0 -65
  61. data/features/annotations.feature +0 -22
  62. data/features/capybara_javascript_drivers.feature +0 -73
  63. data/features/choose_javascript_database_strategy.feature +0 -145
  64. data/features/database_cleaner.feature +0 -44
  65. data/features/disable_automatic_database_cleaning.feature +0 -55
  66. data/features/emulate_javascript.feature +0 -94
  67. data/features/install_cucumber_rails.feature +0 -14
  68. data/features/no_database.feature +0 -61
  69. data/features/raising_errors.feature +0 -16
  70. data/features/rerun_profile.feature +0 -46
  71. data/features/rest_api.feature +0 -47
  72. data/features/step_definitions/cucumber_rails_steps.rb +0 -153
  73. data/features/support/aruba.rb +0 -3
  74. data/features/support/bundler_pre_support.rb +0 -28
  75. data/features/support/env.rb +0 -40
  76. data/features/support/fixtures/bundler-1.0.21.gem +0 -0
  77. data/features/support/fixtures/bundler-1.1.rc.gem +0 -0
  78. data/features/support/legacy_web_steps_support.rb +0 -289
  79. data/gemfiles/rails_4_2.gemfile +0 -10
  80. data/gemfiles/rails_5_0.gemfile +0 -10
  81. data/gemfiles/rails_5_1.gemfile +0 -10
  82. data/gemfiles/rails_5_2.gemfile +0 -10
  83. data/gemfiles/rails_6_0.gemfile +0 -8
  84. data/lib/cucumber/rails/action_controller.rb +0 -13
  85. data/spec/cucumber/rails/database_spec.rb +0 -57
  86. data/spec/generators/cucumber/install/install_generator_spec.rb +0 -47
  87. data/spec/spec_helper.rb +0 -14
@@ -1,145 +0,0 @@
1
- Feature: Choose javascript database strategy
2
-
3
- When running a scenario with the @javascript tag, Capybara will fire up a web server
4
- in the same process in a separate thread to your cukes. By default, this means ActiveRecord will give it a
5
- separate database connection, which in turn means data you put into your database from
6
- Cucumber step definitions (e.g. using FactoryBot) won't be visible to the web server
7
- until the database transaction is committed.
8
-
9
- So if you use a transaction strategy for cleaning up your database at the end of a scenario,
10
- it won't work for javascript scenarios by default.
11
-
12
- There are two ways around this. One is to switch to a truncation strategy for javascript
13
- scenarios. This is slower, but more reliable.
14
-
15
- The alternative is to patch ActiveRecord to share a single database connection between
16
- threads. This means you still get the speed benefits of using a transaction to roll back
17
- your database, but you run the risk of the two threads stomping on one another as they
18
- talk to the database.
19
-
20
- Right now, the default behavior is to use truncation, but you can override this by telling
21
- cucumber-rails which strategy to use for javascript scenarios.
22
-
23
- The deletion strategy can be quicker for situations where truncation causes locks which
24
- has been reported by some Oracle users.
25
-
26
- Background:
27
- Given I have created a new Rails app and installed cucumber-rails
28
- And I have a "Widget" ActiveRecord model object
29
-
30
- Scenario: Set the strategy to truncation and run a javascript scenario.
31
- Given I append to "features/env.rb" with:
32
- """
33
- DatabaseCleaner.strategy = :transaction
34
- Cucumber::Rails::Database.javascript_strategy = :truncation
35
- """
36
- And I write to "features/widgets.feature" with:
37
- """
38
- Feature:
39
- Background:
40
- Given I have created 2 widgets
41
-
42
- @javascript
43
- Scenario:
44
- Then the DatabaseCleaner strategy should be truncation
45
- When I create 3 widgets
46
- Then I should have 5 widgets
47
-
48
- @javascript
49
- Scenario:
50
- Then the DatabaseCleaner strategy should be truncation
51
- And I should have 2 widgets
52
-
53
- Scenario:
54
- Then the DatabaseCleaner strategy should be transaction
55
- And I should have 2 widgets
56
- """
57
- And I write to "features/step_definitions/widget_steps.rb" with:
58
- """
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
70
- """
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
-
78
- Scenario: Set the strategy to deletion and run a javascript scenario.
79
- Given I append to "features/env.rb" with:
80
- """
81
- Cucumber::Rails::Database.javascript_strategy = :deletion
82
- """
83
- And I write to "features/widgets.feature" with:
84
- """
85
- @javascript
86
- Feature:
87
- Background:
88
- Given I have created 2 widgets
89
-
90
- Scenario:
91
- When I create 3 widgets
92
- Then I should have 5 widgets
93
-
94
- Scenario:
95
- Then I should have 2 widgets
96
- """
97
- And I write to "features/step_definitions/widget_steps.rb" with:
98
- """
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
106
- """
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
-
114
- Scenario: Set the strategy to truncation with an except option and run a javascript scenario.
115
- Given I append to "features/env.rb" with:
116
- """
117
- Cucumber::Rails::Database.javascript_strategy = :truncation, {:except=>%w[widgets]}
118
- """
119
- And I write to "features/widgets.feature" with:
120
- """
121
- @javascript
122
- Feature:
123
- Scenario:
124
- When I create 3 widgets
125
- Then I should have 3 widgets
126
-
127
- Scenario:
128
- Then I should have 3 widgets
129
- """
130
- And I write to "features/step_definitions/widget_steps.rb" with:
131
- """
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
139
- """
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
- """
@@ -1,44 +0,0 @@
1
- Feature: DatabaseCleaner
2
-
3
- Scenario: Create records in background
4
- Given I have created a new Rails app and installed cucumber-rails
5
- And I write to "features/widgets.feature" with:
6
- """
7
- Feature: Create widgets
8
- Background: some widdgets
9
- Given I have 2 widgets
10
-
11
- Scenario: Add 3
12
- When I create 3 more widgets
13
- Then I should have 5 widgets
14
-
15
- Scenario: Add 7
16
- When I create 7 more widgets
17
- Then I should have 9 widgets
18
- """
19
- And I run `rails generate model widget name:string`
20
- And I write to "features/step_definitions/widget_steps.rb" with:
21
- """
22
- Given /^I have (\d+) widgets$/ do |n|
23
- n.to_i.times do |i|
24
- Widget.create! name: "Widget #{Widget.count + i}"
25
- end
26
- end
27
-
28
- When /^I create (\d+) more widgets$/ do |n|
29
- n.to_i.times do |i|
30
- Widget.create! name: "Widget #{Widget.count + i}"
31
- end
32
- end
33
-
34
- Then /^I should have (\d+) widgets$/ do |n|
35
- Widget.count.should == n.to_i
36
- end
37
- """
38
- And I run `bundle exec rake db:migrate`
39
- And I run `bundle exec rake cucumber`
40
- Then the feature run should pass with:
41
- """
42
- 2 scenarios (2 passed)
43
- 6 steps (6 passed)
44
- """
@@ -1,55 +0,0 @@
1
- Feature: Disable automatic database cleaning
2
-
3
- By default, a set of Before/After hooks are installed to
4
- invoke database_cleaner on every scenario except those tagged
5
- "@no-database-cleaner". Sometimes when a user is switching between
6
- cleaning strategies, this can initiate an undesired database
7
- transaction.
8
-
9
- To avoid the need for users making frequent strategy switches to apply
10
- this tag, a configuration option is provided so that the user can
11
- control the invocation of database_cleaner explicitly.
12
-
13
- Scenario: Disabling automatic cleaning
14
- Given I have created a new Rails app and installed cucumber-rails
15
- And I append to "features/env.rb" with:
16
- """
17
- Cucumber::Rails::Database.autorun_database_cleaner = false
18
- """
19
- And I write to "features/widgets.feature" with:
20
- """
21
- Feature: Create widgets
22
- Scenario: Create 3 widgets
23
- When I create 3 widgets
24
- Then I should have 3 widgets
25
-
26
- Scenario: Create 5 widgets
27
- When I create 5 widgets
28
- Then I should have 8 widgets
29
- """
30
- And I run `rails generate model widget name:string`
31
- And I write to "features/step_definitions/widget_steps.rb" with:
32
- """
33
- Given /^I have (\d+) widgets$/ do |n|
34
- n.to_i.times do |i|
35
- Widget.create! name: "Widget #{Widget.count + i}"
36
- end
37
- end
38
-
39
- When /^I create (\d+) widgets$/ do |n|
40
- n.to_i.times do |i|
41
- Widget.create! name: "Widget #{Widget.count + i}"
42
- end
43
- end
44
-
45
- Then /^I should have (\d+) widgets$/ do |n|
46
- Widget.count.should == n.to_i
47
- end
48
- """
49
- And I run `bundle exec rake db:migrate`
50
- And I run `bundle exec rake cucumber`
51
- Then the feature run should pass with:
52
- """
53
- 2 scenarios (2 passed)
54
- 4 steps (4 passed)
55
- """
@@ -1,94 +0,0 @@
1
- Feature: Emulate Javascript
2
-
3
- Scenario: See a widget
4
- Given I have created a new Rails app and installed cucumber-rails
5
- And I force selenium to run Firefox in headless mode
6
- And I run `rails generate scaffold widget name:string`
7
- And I write to "features/f.feature" with:
8
- """
9
- @javascript
10
- Feature: Widget inventory
11
- Scenario: Delete a widget
12
- Given there is a widget named "wrench"
13
- When I go to the widgets page
14
- Then I should see "wrench"
15
- """
16
- And I write to "features/step_definitions/s.rb" with:
17
- """
18
- Given /^there is a widget named "([^"]*)"$/ do |name|
19
- FactoryBot.create(:widget, name: name)
20
- end
21
- """
22
- And I write to "features/support/factories.rb" with:
23
- """
24
- FactoryBot.define do
25
- factory :widget do
26
- name { 'testwidget' }
27
- end
28
- end
29
- """
30
- When I run `bundle exec rake db:migrate`
31
- And I run `bundle exec rake cucumber`
32
- Then the feature run should pass with:
33
- """
34
- 1 scenario (1 passed)
35
- 3 steps (3 passed)
36
- """
37
-
38
- Scenario: Pass on the CSRF token
39
- Given I have created a new Rails app and installed cucumber-rails
40
- And I run `rails generate scaffold widget name:string`
41
- And I run `sed -i -e 's/forgery_protection *= false/forgery_protection = true/' config/environments/test.rb`
42
- And I run `rails generate controller session establish`
43
- And I write to "app/controllers/session_controller.rb" with:
44
- """
45
- class SessionController < ApplicationController
46
- def establish
47
- session[:verified] = true
48
- end
49
- end
50
- """
51
- And I write to "app/controllers/application_controller.rb" with:
52
- """
53
- class ApplicationController < ActionController::Base
54
- protect_from_forgery
55
- before_action except: :establish do
56
- render text: "denied", status: :forbidden and return false unless session[:verified]
57
- end
58
- end
59
- """
60
- And I write to "features/f.feature" with:
61
- """
62
- Feature: Widget inventory
63
- Scenario: Delete a widget
64
- Given there is a widget named "wrench"
65
- When I go to the session establish page
66
- And I go to the widgets page
67
- Then I should see "wrench"
68
- When I follow "Destroy"
69
- Then I should not see "denied"
70
- And I should be on the widgets page
71
- And I should not see "wrench"
72
- """
73
- And I write to "features/step_definitions/s.rb" with:
74
- """
75
- Given /^there is a widget named "([^"]*)"$/ do |name|
76
- FactoryBot.create(:widget, name: name)
77
- end
78
- """
79
- And I write to "features/support/factories.rb" with:
80
- """
81
- FactoryBot.define do
82
- factory :widget do
83
- name { 'testwidget' }
84
- end
85
- end
86
- """
87
- When I run `bundle exec rake db:migrate`
88
- And I run `bundle exec rake cucumber`
89
- Then the feature run should pass with:
90
- """
91
- 1 scenario (1 passed)
92
- 8 steps (8 passed)
93
- """
94
-
@@ -1,14 +0,0 @@
1
- Feature: Rails
2
- In order to take over the world
3
- Cucumber-Rails should work on major versions
4
- of Rails and Ruby, with Capybara, Spork and DatabaseCleaner
5
-
6
- Scenario: Install Cucumber-Rails
7
- Given I have created a new Rails app and installed cucumber-rails
8
- Then the following files should exist:
9
- | config/cucumber.yml |
10
- | script/cucumber |
11
- | features/support/env.rb |
12
- | features/step_definitions/.gitkeep |
13
- | lib/tasks/cucumber.rake |
14
- And the file "features/support/env.rb" should contain "require 'cucumber/rails'"
@@ -1,61 +0,0 @@
1
- Feature: No Database
2
- Allow Cucumber to work with a Rails app without a database
3
-
4
- @fails-on-travis
5
- Scenario: No ActiveRecord and DatabaseCleaner
6
- Given I have created a new Rails app with no database and installed cucumber-rails
7
- # Turn off ActiveRecord
8
- And I write to "config/application.rb" with:
9
- """
10
- require File.expand_path('../boot', __FILE__)
11
-
12
- require 'action_controller/railtie'
13
- require 'action_mailer/railtie'
14
- require 'rails/test_unit/railtie'
15
-
16
- Bundler.require(:default, Rails.env) if defined?(Bundler)
17
-
18
- module TestApp
19
- class Application < Rails::Application
20
- config.encoding = "utf-8"
21
- config.filter_parameters += [:password]
22
- end
23
- end
24
- """
25
- And I overwrite "features/support/env.rb" with:
26
- """
27
- require 'cucumber/rails'
28
- """
29
- And I remove the 'database_cleaner' gem from the Gemfile
30
- And I remove the 'sqlite' gem from the Gemfile
31
- And I write to "app/controllers/posts_controller.rb" with:
32
- """
33
- class PostsController < ApplicationController
34
- def index
35
- raise "There is an error in index"
36
- end
37
- end
38
- """
39
- And I write to "config/routes.rb" with:
40
- """
41
- TestApp::Application.routes.draw do
42
- resources :posts
43
- end
44
- """
45
- And I write to "features/posts.feature" with:
46
- """
47
- Feature: posts
48
- Scenario: See them
49
- When I do it
50
- """
51
- And I write to "features/step_definitions/posts_steps.rb" with:
52
- """
53
- When /^I do it$/ do
54
- visit '/posts'
55
- end
56
- """
57
- And I run `bundle exec rake cucumber`
58
- Then it should fail with:
59
- """
60
- There is an error in index
61
- """
@@ -1,16 +0,0 @@
1
- Feature: Raise Errors
2
-
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:
6
- """
7
- Feature: Tests
8
- Scenario: Tests
9
- When I go to the products page
10
- """
11
- And I run `bundle exec cucumber`
12
- Then it should fail with:
13
- """
14
- 1 scenario (1 failed)
15
- 1 step (1 failed)
16
- """
@@ -1,46 +0,0 @@
1
- Feature: Rerun profile
2
- In order to concentrate on failing features
3
- As a Rails developer working with Cucumber
4
- I want to rerun only failing features
5
-
6
- Scenario: Rerun
7
- Given I have created a new Rails app and installed cucumber-rails
8
- And a file named "rerun.txt" with:
9
- """
10
- features/rerun_test.feature:2
11
- features/rerun_test.feature:5
12
- """
13
- And a file named "features/rerun_test.feature" with:
14
- """
15
- Feature: Rerun test
16
- Scenario: failing before
17
- Given fixed now
18
-
19
- Scenario: still failing
20
- Given broken
21
-
22
- Scenario: always passing
23
- Given passing
24
- """
25
- And a file named "features/step_definitions/rerun_steps.rb" with:
26
- """
27
- Given /fixed now/ do
28
- puts "All fixed now"
29
- end
30
-
31
- Given /broken/ do
32
- raise "I'm broken"
33
- end
34
-
35
- Given /passing/ do
36
- puts "I've always been passing"
37
- end
38
- """
39
- When I run `bundle exec cucumber -p rerun`
40
- Then it should fail with:
41
- """
42
- 2 scenarios (1 failed, 1 passed)
43
- 2 steps (1 failed, 1 passed)
44
- """
45
- And the file "rerun.txt" should not contain "features/rerun_test.feature:2"
46
- And the file "rerun.txt" should contain "features/rerun_test.feature:5"