cucumber-rails 2.0.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +135 -18
  3. data/CONTRIBUTING.md +14 -2
  4. data/LICENSE +1 -1
  5. data/README.md +5 -24
  6. data/lib/cucumber/rails.rb +11 -13
  7. data/lib/cucumber/rails/action_dispatch.rb +21 -0
  8. data/lib/cucumber/rails/application.rb +11 -8
  9. data/lib/cucumber/rails/capybara/javascript_emulation.rb +27 -16
  10. data/lib/cucumber/rails/database.rb +7 -57
  11. data/lib/cucumber/rails/database/deletion_strategy.rb +13 -0
  12. data/lib/cucumber/rails/database/shared_connection_strategy.rb +27 -0
  13. data/lib/cucumber/rails/database/strategy.rb +35 -0
  14. data/lib/cucumber/rails/database/truncation_strategy.rb +13 -0
  15. data/lib/cucumber/rails/hooks/database_cleaner.rb +9 -3
  16. data/lib/cucumber/rails/hooks/mail.rb +1 -1
  17. data/lib/cucumber/rails/world.rb +2 -2
  18. data/lib/generators/cucumber/install_generator.rb +10 -13
  19. data/lib/generators/cucumber/templates/config/cucumber.yml.erb +3 -3
  20. data/lib/generators/cucumber/templates/tasks/cucumber.rake.erb +5 -0
  21. metadata +92 -99
  22. data/.github/ISSUE_TEMPLATE.md +0 -52
  23. data/.github/PULL_REQUEST_TEMPLATE.md +0 -42
  24. data/.gitignore +0 -14
  25. data/.rspec +0 -4
  26. data/.rubocop.yml +0 -33
  27. data/.rubocop_todo.yml +0 -59
  28. data/.travis.yml +0 -60
  29. data/Appraisals +0 -35
  30. data/Gemfile +0 -5
  31. data/Rakefile +0 -53
  32. data/bin/install_geckodriver.sh +0 -19
  33. data/bin/install_webpacker.sh +0 -9
  34. data/config/.gitignore +0 -1
  35. data/config/cucumber.yml +0 -17
  36. data/cucumber-rails.gemspec +0 -44
  37. data/dev_tasks/cucumber.rake +0 -5
  38. data/dev_tasks/rspec.rake +0 -5
  39. data/dev_tasks/yard.rake +0 -36
  40. data/dev_tasks/yard/default/layout/html/bubble_32x32.png +0 -0
  41. data/dev_tasks/yard/default/layout/html/footer.erb +0 -5
  42. data/dev_tasks/yard/default/layout/html/index.erb +0 -1
  43. data/dev_tasks/yard/default/layout/html/layout.erb +0 -25
  44. data/dev_tasks/yard/default/layout/html/logo.erb +0 -1
  45. data/dev_tasks/yard/default/layout/html/setup.rb +0 -9
  46. data/features/allow_rescue.feature +0 -65
  47. data/features/annotations.feature +0 -20
  48. data/features/capybara_javascript_drivers.feature +0 -82
  49. data/features/choose_javascript_database_strategy.feature +0 -125
  50. data/features/configuration.feature +0 -48
  51. data/features/database_cleaner.feature +0 -44
  52. data/features/disable_automatic_database_cleaning.feature +0 -49
  53. data/features/emulate_javascript.feature +0 -109
  54. data/features/install_cucumber_rails.feature +0 -14
  55. data/features/no_database.feature +0 -61
  56. data/features/raising_errors.feature +0 -22
  57. data/features/rerun_profile.feature +0 -47
  58. data/features/rest_api.feature +0 -47
  59. data/features/step_definitions/cucumber_rails_steps.rb +0 -69
  60. data/features/support/aruba.rb +0 -5
  61. data/features/support/cucumber_rails_helper.rb +0 -76
  62. data/features/support/env.rb +0 -6
  63. data/features/support/hooks.rb +0 -8
  64. data/gemfiles/rails_4_2.gemfile +0 -10
  65. data/gemfiles/rails_5_0.gemfile +0 -10
  66. data/gemfiles/rails_5_1.gemfile +0 -10
  67. data/gemfiles/rails_5_2.gemfile +0 -10
  68. data/gemfiles/rails_6_0.gemfile +0 -9
  69. data/lib/cucumber/rails/action_controller.rb +0 -17
  70. data/lib/generators/cucumber/templates/support/rails_spork.rb.erb +0 -13
  71. data/spec/cucumber/rails/database_spec.rb +0 -61
  72. data/spec/generators/cucumber/install_generator_spec.rb +0 -55
  73. data/spec/spec_helper.rb +0 -16
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'cucumber/rake/task'
4
-
5
- Cucumber::Rake::Task.new
data/dev_tasks/rspec.rake DELETED
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rspec/core/rake_task'
4
-
5
- RSpec::Core::RakeTask.new
data/dev_tasks/yard.rake DELETED
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'yard'
4
- require 'yard/rake/yardoc_task'
5
-
6
- SITE_DIR = File.expand_path(File.dirname(__FILE__) + '/../cucumber.github.com')
7
- API_DIR = File.join(SITE_DIR, 'api', 'cucumber-rails', 'ruby', 'yardoc')
8
-
9
- namespace :api do
10
- file :dir do
11
- raise "You need to git clone git@github.com:cucumber/cucumber.github.com.git #{SITE_DIR}" unless File.directory?(SITE_DIR)
12
-
13
- sh('git pull origin master')
14
- mkdir_p API_DIR
15
- end
16
-
17
- template_path = File.expand_path(File.join(File.dirname(__FILE__), 'yard'))
18
- YARD::Templates::Engine.register_template_path(template_path)
19
- YARD::Rake::YardocTask.new(:yard) do |yard|
20
- dir = API_DIR
21
- mkdir_p dir
22
- yard.options = ['--out', dir]
23
- end
24
- task yard: :dir
25
-
26
- task :release do
27
- Dir.chdir(SITE_DIR) do
28
- sh('git add .')
29
- sh("git commit -m 'Update API docs for cucumber-rails v#{cucumber-rails::VERSION}'")
30
- sh('git push origin master')
31
- end
32
- end
33
-
34
- desc "Generate YARD docs for Cucumber-Rails' API"
35
- task doc: %i[yard release]
36
- end
@@ -1,5 +0,0 @@
1
- <div id="footer">
2
- Generated on <%= Time.now.strftime("%c") %> by
3
- <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
4
- <%= YARD::VERSION %> (ruby-<%= RUBY_VERSION %>).
5
- </div>
@@ -1 +0,0 @@
1
- <%= yieldall %>
@@ -1,25 +0,0 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
- <head>
5
- <%= erb(:headers) %>
6
- </head>
7
- <body>
8
- <script type="text/javascript" charset="utf-8">
9
- if (window.top.frames.main) document.body.className = 'frames';
10
- </script>
11
-
12
- <div id="header">
13
- <%= erb(:logo) %>
14
- <%= erb(:breadcrumb) %>
15
- <%= erb(:search) %>
16
- <div class="clear"></div>
17
- </div>
18
-
19
- <iframe id="search_frame"></iframe>
20
-
21
- <div id="content"><%= yieldall %></div>
22
-
23
- <%= erb(:footer) %>
24
- </body>
25
- </html>
@@ -1 +0,0 @@
1
- <h3><img src="<%= url_for('images/bubble_32x32.png') %>"></img> Cucumber-Rails <%= CUCUMBER_RAILS_VERSION %></h3>
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- def init
4
- super
5
- options[:serializer].serialize(
6
- '/images/bubble_32x32.png',
7
- IO.read(File.dirname(__FILE__) + '/bubble_32x32.png')
8
- )
9
- end
@@ -1,65 +0,0 @@
1
- Feature: Allow Cucumber to rescue exceptions
2
-
3
- Background: A controller that raises an exception
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
- """
7
- class PostsController < ApplicationController
8
- def index
9
- raise 'There is an error in index'
10
- end
11
- end
12
- """
13
- And I write to "config/routes.rb" with:
14
- """
15
- TestApp::Application.routes.draw do
16
- resources :posts
17
- end
18
- """
19
-
20
- Scenario: Allow rescue
21
- When I write to "features/posts.feature" with:
22
- """
23
- Feature: posts
24
- @allow-rescue
25
- Scenario: See posts
26
- When I look at the posts
27
- Then I should see the public error page
28
- """
29
- And I write to "features/step_definitions/posts_steps.rb" with:
30
- """
31
- When('I look at the posts') do
32
- visit '/posts'
33
- end
34
- Then('I should see the public error page') do
35
- expect(page).to have_content "We're sorry, but something went wrong."
36
- end
37
- """
38
- And I run `bundle exec rake db:migrate`
39
- And I run `bundle exec cucumber`
40
- Then the feature run should pass with:
41
- """
42
- 1 scenario (1 passed)
43
- 2 steps (2 passed)
44
- """
45
-
46
- Scenario: Don't allow rescue
47
- When I write to "features/posts.feature" with:
48
- """
49
- Feature: posts
50
- Scenario: See them
51
- When I look at the posts
52
- """
53
- And I write to "features/step_definitions/posts_steps.rb" with:
54
- """
55
- When('I look at the posts') do
56
- visit '/posts'
57
- end
58
- """
59
- And I run `bundle exec rake db:migrate`
60
- And I run `bundle exec cucumber`
61
- Then it should fail with:
62
- """
63
- 1 scenario (1 failed)
64
- 1 step (1 failed)
65
- """
@@ -1,20 +0,0 @@
1
- Feature: Annotations
2
-
3
- In order to track my development progress
4
- As a developer
5
- I should be able to list annotations in my features
6
-
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:
10
- """
11
- Feature: Products
12
- Scenario: Test a Product
13
- # TODO: When I go to the products page
14
- """
15
- When I run `bundle exec rake notes`
16
- Then it should pass with:
17
- """
18
- features/products.feature:
19
- * [3] [TODO] When I go to the products page
20
- """
@@ -1,82 +0,0 @@
1
- @focus
2
- Feature: Capybara Javascript Drivers
3
-
4
- Background: A simple calendar app
5
- Given I have created a new Rails app and installed cucumber-rails
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`
8
-
9
- Scenario: Use a particular driver
10
- When I write to "features/create_appointment.feature" with:
11
- """
12
- @javascript
13
- Feature: Create appointments
14
- Scenario: Visit the Constitution on May 17
15
- Given I am on the new appointment page
16
- And I fill in "Norway's constitution" for "Name"
17
- And I select "2015-02-20 15:10:00 UTC" as the "When" date and time
18
- And I press "Create Appointment"
19
- Then I should see "Norway's constitution"
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
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
43
- """
44
- And I run `bundle exec rake db:migrate`
45
- And I run `bundle exec rake cucumber`
46
- Then the feature run should pass with:
47
- """
48
- 1 scenario (1 passed)
49
- 6 steps (6 passed)
50
- """
51
-
52
- Scenario: Mixed DB access
53
- When I write to "features/create_appointment.feature" with:
54
- """
55
- @javascript
56
- Feature: Create appointments
57
- Scenario: Visit the Constitution on May 17
58
- Given a random appointment
59
- And I am viewing the appointment
60
- Then I should see "Random appointment"
61
- """
62
- And I write to "features/step_definitions/create_appointment_steps.rb" with:
63
- """
64
- Given('a random appointment') do
65
- @appointment = Appointment.create!(name: 'Random appointment', when: DateTime.now)
66
- end
67
-
68
- Given('I am viewing the appointment') do
69
- visit appointment_path(@appointment)
70
- end
71
-
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`
77
- And I run `bundle exec rake cucumber`
78
- Then the feature run should pass with:
79
- """
80
- 1 scenario (1 passed)
81
- 3 steps (3 passed)
82
- """
@@ -1,125 +0,0 @@
1
- Feature: Choose javascript database strategy
2
-
3
- Whilst 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
- 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.connections.first.strategy.to_s).to match(/#{strategy_name}/i)
41
- end
42
- """
43
-
44
- Scenario: Set the strategy to truncation and run a javascript scenario.
45
- When I append to "features/env.rb" with:
46
- """
47
- DatabaseCleaner.strategy = :transaction
48
- Cucumber::Rails::Database.javascript_strategy = :truncation
49
- """
50
- And I write to "features/widgets.feature" with:
51
- """
52
- Feature:
53
- Background:
54
- When I create 2 widgets
55
-
56
- @javascript
57
- Scenario:
58
- When I create 3 widgets
59
- Then the DatabaseCleaner strategy should be truncation
60
- And I should have 5 widgets
61
-
62
- @javascript
63
- Scenario:
64
- Then the DatabaseCleaner strategy should be truncation
65
- And I should have 2 widgets
66
-
67
- Scenario:
68
- Then the DatabaseCleaner strategy should be transaction
69
- And I should have 2 widgets
70
- """
71
- And 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
- When 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
- When I create 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 run the cukes
98
- Then the feature run should pass with:
99
- """
100
- 2 scenarios (2 passed)
101
- 5 steps (5 passed)
102
- """
103
-
104
- Scenario: Set the strategy to truncation with an except option and run a javascript scenario.
105
- When I append to "features/env.rb" with:
106
- """
107
- Cucumber::Rails::Database.javascript_strategy = :truncation, { except: %w[widgets] }
108
- """
109
- And I write to "features/widgets.feature" with:
110
- """
111
- @javascript
112
- Feature:
113
- Scenario:
114
- When I create 3 widgets
115
- Then I should have 3 widgets
116
-
117
- Scenario:
118
- Then I should have 3 widgets
119
- """
120
- And I run the cukes
121
- Then the feature run should pass with:
122
- """
123
- 2 scenarios (2 passed)
124
- 3 steps (3 passed)
125
- """
@@ -1,48 +0,0 @@
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
- """