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.
- checksums.yaml +7 -0
- data/.github/ISSUE_TEMPLATE.md +52 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +42 -0
- data/.gitignore +3 -0
- data/.rspec +4 -1
- data/.rubocop.yml +68 -0
- data/.travis.yml +53 -26
- data/Appraisals +27 -63
- data/{History.md → CHANGELOG.md} +299 -19
- data/CONTRIBUTING.md +18 -27
- data/Gemfile +2 -4
- data/LICENSE +1 -1
- data/README.md +73 -29
- data/Rakefile +18 -14
- data/bin/install_geckodriver.sh +19 -0
- data/bin/install_webpacker.sh +9 -0
- data/config/cucumber.yml +5 -3
- data/cucumber-rails.gemspec +37 -25
- data/dev_tasks/cucumber.rake +3 -3
- data/dev_tasks/rspec.rake +3 -6
- data/dev_tasks/yard/default/layout/html/footer.erb +1 -1
- data/dev_tasks/yard/default/layout/html/layout.erb +5 -5
- data/dev_tasks/yard/default/layout/html/logo.erb +1 -1
- data/dev_tasks/yard/default/layout/html/setup.rb +6 -1
- data/dev_tasks/yard.rake +7 -14
- data/features/allow_rescue.feature +17 -12
- data/features/annotations.feature +20 -0
- data/features/capybara_javascript_drivers.feature +42 -32
- data/features/choose_javascript_database_strategy.feature +38 -57
- data/features/configuration.feature +48 -0
- data/features/database_cleaner.feature +20 -20
- data/features/disable_automatic_database_cleaning.feature +13 -19
- data/features/emulate_javascript.feature +65 -48
- data/features/install_cucumber_rails.feature +6 -5
- data/features/no_database.feature +8 -15
- data/features/raising_errors.feature +10 -4
- data/features/rerun_profile.feature +18 -8
- data/features/rest_api.feature +13 -13
- data/features/step_definitions/cucumber_rails_steps.rb +52 -66
- data/features/support/aruba.rb +5 -0
- data/features/support/cucumber_rails_helper.rb +85 -0
- data/features/support/env.rb +4 -35
- data/features/support/hooks.rb +8 -0
- data/gemfiles/rails_4_2.gemfile +10 -0
- data/gemfiles/rails_5_0.gemfile +10 -0
- data/gemfiles/rails_5_1.gemfile +10 -0
- data/gemfiles/rails_5_2.gemfile +10 -0
- data/gemfiles/rails_6_0.gemfile +9 -0
- data/lib/cucumber/rails/action_dispatch.rb +21 -0
- data/lib/cucumber/rails/application.rb +17 -8
- data/lib/cucumber/rails/capybara/javascript_emulation.rb +47 -39
- data/lib/cucumber/rails/capybara/select_dates_and_times.rb +8 -6
- data/lib/cucumber/rails/capybara.rb +2 -0
- data/lib/cucumber/rails/database.rb +36 -17
- data/lib/cucumber/rails/hooks/active_record.rb +14 -12
- data/lib/cucumber/rails/hooks/allow_rescue.rb +2 -0
- data/lib/cucumber/rails/hooks/database_cleaner.rb +6 -4
- data/lib/cucumber/rails/hooks/mail.rb +4 -4
- data/lib/cucumber/rails/hooks.rb +2 -0
- data/lib/cucumber/rails/rspec.rb +5 -3
- data/lib/cucumber/rails/world.rb +26 -9
- data/lib/cucumber/rails.rb +21 -18
- data/lib/generators/cucumber/{install/USAGE → USAGE} +2 -2
- data/lib/generators/cucumber/{install/install_generator.rb → install_generator.rb} +28 -15
- data/lib/generators/cucumber/{install/templates → templates}/config/cucumber.yml.erb +4 -3
- data/lib/generators/cucumber/{install/templates → templates}/script/cucumber +1 -0
- data/lib/generators/cucumber/{install/templates → templates}/support/_rails_each_run.rb.erb +4 -4
- data/lib/generators/cucumber/{install/templates → templates}/support/_rails_prefork.rb.erb +0 -0
- data/lib/generators/cucumber/{install/templates → templates}/support/capybara.rb +2 -0
- data/lib/generators/cucumber/{install/templates → templates}/support/edit_warning.txt +0 -0
- data/lib/generators/cucumber/{install/templates → templates}/support/rails.rb.erb +0 -0
- data/lib/generators/cucumber/{install/templates → templates}/support/rails_spork.rb.erb +2 -2
- data/lib/generators/cucumber/{install/templates → templates}/tasks/cucumber.rake.erb +19 -8
- data/spec/cucumber/rails/database_spec.rb +46 -33
- data/spec/generators/cucumber/install_generator_spec.rb +55 -0
- data/spec/spec_helper.rb +14 -2
- metadata +228 -142
- data/Gemfile.appraisal +0 -3
- data/features/step_definitions/mongo_steps.rb +0 -3
- data/features/support/bundler_pre_support.rb +0 -28
- data/features/support/fixtures/bundler-1.0.21.gem +0 -0
- data/features/support/fixtures/bundler-1.1.rc.gem +0 -0
- data/features/support/legacy_web_steps_support.rb +0 -290
- data/gemfiles/capybara_1_1.gemfile +0 -17
- data/gemfiles/rails_3_0.gemfile +0 -16
- data/gemfiles/rails_3_1.gemfile +0 -17
- data/gemfiles/rails_3_2.gemfile +0 -17
- data/gemfiles/rails_4_0.gemfile +0 -20
- data/lib/cucumber/rails/action_controller.rb +0 -12
- data/spec/generators/cucumber/install/install_generator_spec.rb +0 -47
@@ -3,69 +3,79 @@ 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
|
7
|
-
|
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
|
-
|
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
|
-
And I select "
|
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
|
-
And I should see "
|
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
|
-
|
44
|
+
And I run `bundle exec rake db:migrate`
|
37
45
|
And I run `bundle exec rake cucumber`
|
38
|
-
Then
|
46
|
+
Then the feature run should pass with:
|
39
47
|
"""
|
40
48
|
1 scenario (1 passed)
|
41
49
|
6 steps (6 passed)
|
42
50
|
"""
|
43
51
|
|
44
52
|
Scenario: Mixed DB access
|
45
|
-
|
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
|
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/
|
62
|
+
And I write to "features/step_definitions/create_appointment_steps.rb" with:
|
56
63
|
"""
|
57
|
-
Given
|
58
|
-
@appointment = Appointment.create!(:
|
64
|
+
Given('a random appointment') do
|
65
|
+
@appointment = Appointment.create!(name: 'Random appointment', when: DateTime.now)
|
59
66
|
end
|
60
67
|
|
61
|
-
Given
|
68
|
+
Given('I am viewing the appointment') do
|
62
69
|
visit appointment_path(@appointment)
|
63
70
|
end
|
64
|
-
"""
|
65
71
|
|
66
|
-
|
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
|
-
Then
|
78
|
+
Then the feature run should pass with:
|
69
79
|
"""
|
70
80
|
1 scenario (1 passed)
|
71
81
|
3 steps (3 passed)
|
@@ -1,9 +1,9 @@
|
|
1
1
|
Feature: Choose javascript database strategy
|
2
2
|
|
3
|
-
|
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
|
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
|
-
|
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
|
-
|
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
|
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
|
71
|
+
And I run the cukes
|
72
|
+
Then the feature run should pass with:
|
58
73
|
"""
|
59
|
-
|
60
|
-
|
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 it should pass with:
|
73
|
-
"""
|
74
|
-
3 scenarios (3 passed)
|
75
|
-
10 steps (10 passed)
|
76
|
-
"""
|
77
77
|
|
78
|
-
|
79
|
-
|
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
|
-
|
88
|
+
When I create 2 widgets
|
89
89
|
|
90
90
|
Scenario:
|
91
91
|
When I create 3 widgets
|
@@ -94,26 +94,17 @@ Feature: Choose javascript database strategy
|
|
94
94
|
Scenario:
|
95
95
|
Then I should have 2 widgets
|
96
96
|
"""
|
97
|
-
And I
|
97
|
+
And I run the cukes
|
98
|
+
Then the feature run should pass with:
|
98
99
|
"""
|
99
|
-
|
100
|
-
|
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
|
-
|
108
|
-
Then it should pass with:
|
109
|
-
"""
|
110
|
-
2 scenarios (2 passed)
|
111
|
-
5 steps (5 passed)
|
112
|
-
"""
|
103
|
+
|
113
104
|
Scenario: Set the strategy to truncation with an except option and run a javascript scenario.
|
114
|
-
|
105
|
+
When I append to "features/env.rb" with:
|
115
106
|
"""
|
116
|
-
|
107
|
+
Cucumber::Rails::Database.javascript_strategy = :truncation, { except: %w[widgets] }
|
117
108
|
"""
|
118
109
|
And I write to "features/widgets.feature" with:
|
119
110
|
"""
|
@@ -126,19 +117,9 @@ Feature: Choose javascript database strategy
|
|
126
117
|
Scenario:
|
127
118
|
Then I should have 3 widgets
|
128
119
|
"""
|
129
|
-
And I
|
120
|
+
And I run the cukes
|
121
|
+
Then the feature run should pass with:
|
130
122
|
"""
|
131
|
-
|
132
|
-
|
133
|
-
end
|
134
|
-
|
135
|
-
Then /should have (\d) widgets/ do |num|
|
136
|
-
Widget.count.should == num.to_i
|
137
|
-
end
|
123
|
+
2 scenarios (2 passed)
|
124
|
+
3 steps (3 passed)
|
138
125
|
"""
|
139
|
-
When I run the cukes
|
140
|
-
Then it should pass with:
|
141
|
-
"""
|
142
|
-
2 scenarios (2 passed)
|
143
|
-
3 steps (3 passed)
|
144
|
-
"""
|
@@ -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
|
+
"""
|
@@ -1,44 +1,44 @@
|
|
1
|
-
Feature:
|
1
|
+
Feature: Database Cleaner
|
2
2
|
|
3
3
|
Scenario: Create records in background
|
4
4
|
Given I have created a new Rails app and installed cucumber-rails
|
5
|
-
|
5
|
+
When I write to "features/widgets.feature" with:
|
6
6
|
"""
|
7
7
|
Feature: Create widgets
|
8
|
-
Background:
|
8
|
+
Background: 2 initial widgets
|
9
9
|
Given I have 2 widgets
|
10
|
-
|
11
|
-
Scenario: Add 3
|
10
|
+
|
11
|
+
Scenario: Add 3 widgets
|
12
12
|
When I create 3 more widgets
|
13
13
|
Then I should have 5 widgets
|
14
14
|
|
15
|
-
Scenario: Add 7
|
15
|
+
Scenario: Add 7 widgets
|
16
16
|
When I create 7 more widgets
|
17
17
|
Then I should have 9 widgets
|
18
18
|
"""
|
19
|
-
And I
|
19
|
+
And I run `rails generate model widget name:string`
|
20
20
|
And I write to "features/step_definitions/widget_steps.rb" with:
|
21
21
|
"""
|
22
|
-
Given
|
23
|
-
|
24
|
-
Widget.create! :
|
22
|
+
Given('I have {int} widgets') do |number|
|
23
|
+
number.times do |i|
|
24
|
+
Widget.create! name: "Widget #{Widget.count + i}"
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
When
|
29
|
-
|
30
|
-
Widget.create! :
|
28
|
+
When('I create {int} more widgets') do |number|
|
29
|
+
number.times do |i|
|
30
|
+
Widget.create! name: "Widget #{Widget.count + i}"
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
Then
|
35
|
-
Widget.count.
|
34
|
+
Then('I should have {int} widgets') do |number|
|
35
|
+
expect(Widget.count).to eq(number)
|
36
36
|
end
|
37
37
|
"""
|
38
38
|
And I run `bundle exec rake db:migrate`
|
39
39
|
And I run `bundle exec rake cucumber`
|
40
|
-
Then
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
40
|
+
Then the feature run should pass with:
|
41
|
+
"""
|
42
|
+
2 scenarios (2 passed)
|
43
|
+
6 steps (6 passed)
|
44
|
+
"""
|
@@ -12,7 +12,7 @@ Feature: Disable automatic database cleaning
|
|
12
12
|
|
13
13
|
Scenario: Disabling automatic cleaning
|
14
14
|
Given I have created a new Rails app and installed cucumber-rails
|
15
|
-
|
15
|
+
When I append to "features/env.rb" with:
|
16
16
|
"""
|
17
17
|
Cucumber::Rails::Database.autorun_database_cleaner = false
|
18
18
|
"""
|
@@ -27,29 +27,23 @@ Feature: Disable automatic database cleaning
|
|
27
27
|
When I create 5 widgets
|
28
28
|
Then I should have 8 widgets
|
29
29
|
"""
|
30
|
-
And I
|
30
|
+
And I run `rails generate model widget name:string`
|
31
31
|
And I write to "features/step_definitions/widget_steps.rb" with:
|
32
32
|
"""
|
33
|
-
|
34
|
-
|
35
|
-
Widget.create! :
|
33
|
+
When('I create {int} widgets') do |number|
|
34
|
+
number.times do |i|
|
35
|
+
Widget.create! name: "Widget #{Widget.count + i}"
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
|
40
|
-
|
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
|
39
|
+
Then('I should have {int} widgets') do |number|
|
40
|
+
expect(Widget.count).to eq(number)
|
47
41
|
end
|
48
|
-
|
42
|
+
"""
|
49
43
|
And I run `bundle exec rake db:migrate`
|
50
44
|
And I run `bundle exec rake cucumber`
|
51
|
-
Then
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
45
|
+
Then the feature run should pass with:
|
46
|
+
"""
|
47
|
+
2 scenarios (2 passed)
|
48
|
+
4 steps (4 passed)
|
49
|
+
"""
|
@@ -1,44 +1,53 @@
|
|
1
1
|
Feature: Emulate Javascript
|
2
2
|
|
3
|
-
|
3
|
+
Background:
|
4
4
|
Given I have created a new Rails app and installed cucumber-rails
|
5
|
-
And I
|
6
|
-
|
5
|
+
And I force selenium to run Firefox in headless mode
|
6
|
+
When I run `rails generate scaffold widget name:string`
|
7
|
+
And I write to "features/step_definitions/widget_steps.rb" with:
|
8
|
+
"""
|
9
|
+
Given('there is a widget named {string}') do |name|
|
10
|
+
FactoryBot.create(:widget, name: name)
|
11
|
+
end
|
12
|
+
|
13
|
+
When('I am on the widgets page') do
|
14
|
+
visit widgets_path
|
15
|
+
end
|
16
|
+
|
17
|
+
Then('I should see {string}') do |text|
|
18
|
+
expect(page).to have_content(text)
|
19
|
+
end
|
20
|
+
"""
|
21
|
+
And I write to "features/support/factories/widget.rb" with:
|
22
|
+
"""
|
23
|
+
FactoryBot.define do
|
24
|
+
factory :widget do
|
25
|
+
name { 'testwidget' }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
"""
|
29
|
+
|
30
|
+
Scenario: See a widget
|
31
|
+
When I write to "features/widgets.feature" with:
|
7
32
|
"""
|
8
33
|
@javascript
|
9
34
|
Feature: Widget inventory
|
10
35
|
Scenario: Delete a widget
|
11
36
|
Given there is a widget named "wrench"
|
12
|
-
|
37
|
+
And I am on the widgets page
|
13
38
|
Then I should see "wrench"
|
14
39
|
"""
|
15
|
-
And I
|
16
|
-
|
17
|
-
|
18
|
-
FactoryGirl.create(:widget, :name => name)
|
19
|
-
end
|
20
|
-
"""
|
21
|
-
And I write to "features/support/factories.rb" with:
|
40
|
+
And I run `bundle exec rake db:migrate`
|
41
|
+
And I run `bundle exec rake cucumber`
|
42
|
+
Then the feature run should pass with:
|
22
43
|
"""
|
23
|
-
|
24
|
-
|
25
|
-
name 'testwidget'
|
26
|
-
end
|
27
|
-
end
|
44
|
+
1 scenario (1 passed)
|
45
|
+
3 steps (3 passed)
|
28
46
|
"""
|
29
|
-
When I run `bundle exec rake db:migrate`
|
30
|
-
And I run `bundle exec rake cucumber`
|
31
|
-
Then it should pass with:
|
32
|
-
"""
|
33
|
-
1 scenario (1 passed)
|
34
|
-
3 steps (3 passed)
|
35
|
-
"""
|
36
47
|
|
37
48
|
Scenario: Pass on the CSRF token
|
38
|
-
|
39
|
-
And I
|
40
|
-
And I successfully run `sed -i -e 's/forgery_protection *= false/forgery_protection = true/' config/environments/test.rb`
|
41
|
-
And I successfully run `rails generate controller session establish`
|
49
|
+
When I run `sed -i -e 's/forgery_protection *= false/forgery_protection = true/' config/environments/test.rb`
|
50
|
+
And I run `rails generate controller session establish`
|
42
51
|
And I write to "app/controllers/session_controller.rb" with:
|
43
52
|
"""
|
44
53
|
class SessionController < ApplicationController
|
@@ -51,42 +60,50 @@ Feature: Emulate Javascript
|
|
51
60
|
"""
|
52
61
|
class ApplicationController < ActionController::Base
|
53
62
|
protect_from_forgery
|
54
|
-
|
55
|
-
|
63
|
+
|
64
|
+
before_action except: :establish do
|
65
|
+
render text: 'denied', status: :forbidden and return false unless session[:verified]
|
56
66
|
end
|
57
67
|
end
|
58
68
|
"""
|
59
|
-
And I write to "features/
|
69
|
+
And I write to "features/widgets.feature" with:
|
60
70
|
"""
|
61
71
|
Feature: Widget inventory
|
62
72
|
Scenario: Delete a widget
|
63
73
|
Given there is a widget named "wrench"
|
64
|
-
|
65
|
-
And I
|
74
|
+
And I am on the session establish page
|
75
|
+
And I am on the widgets page
|
66
76
|
Then I should see "wrench"
|
67
77
|
When I follow "Destroy"
|
68
78
|
Then I should not see "denied"
|
69
79
|
And I should be on the widgets page
|
70
80
|
And I should not see "wrench"
|
71
81
|
"""
|
72
|
-
And I
|
82
|
+
And I append to "features/step_definitions/widget_steps.rb" with:
|
83
|
+
# TODO: Remove the newline below (Required) once bug is fixed: https://github.com/cucumber/aruba/issues/662
|
73
84
|
"""
|
74
|
-
|
75
|
-
|
85
|
+
|
86
|
+
Given('I am on the session establish page') do
|
87
|
+
visit session_establish_path
|
76
88
|
end
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
89
|
+
|
90
|
+
When('I follow {string}') do |link|
|
91
|
+
click_link(link)
|
92
|
+
end
|
93
|
+
|
94
|
+
Then('I should not see {string}') do |text|
|
95
|
+
expect(page).not_to have_content(text)
|
96
|
+
end
|
97
|
+
|
98
|
+
Then('I should be on the widgets page') do
|
99
|
+
current_path = URI.parse(current_url).path
|
100
|
+
expect(current_path).to eq(widgets_path)
|
84
101
|
end
|
85
102
|
"""
|
86
|
-
|
103
|
+
And I run `bundle exec rake db:migrate`
|
87
104
|
And I run `bundle exec rake cucumber`
|
88
|
-
Then
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
105
|
+
Then the feature run should pass with:
|
106
|
+
"""
|
107
|
+
1 scenario (1 passed)
|
108
|
+
8 steps (8 passed)
|
109
|
+
"""
|
@@ -1,7 +1,7 @@
|
|
1
|
-
Feature: Rails
|
2
|
-
|
3
|
-
Cucumber-Rails should work on
|
4
|
-
of
|
1
|
+
Feature: Install Cucumber Rails
|
2
|
+
|
3
|
+
Cucumber-Rails should work on supported versions
|
4
|
+
of Ruby on Rails, with Capybara and DatabaseCleaner
|
5
5
|
|
6
6
|
Scenario: Install Cucumber-Rails
|
7
7
|
Given I have created a new Rails app and installed cucumber-rails
|
@@ -9,5 +9,6 @@ Feature: Rails
|
|
9
9
|
| config/cucumber.yml |
|
10
10
|
| script/cucumber |
|
11
11
|
| features/support/env.rb |
|
12
|
+
| features/step_definitions/.gitkeep |
|
12
13
|
| lib/tasks/cucumber.rake |
|
13
|
-
And the file "features/support/env.rb" should contain "require 'cucumber/rails'"
|
14
|
+
And the file "features/support/env.rb" should contain "require 'cucumber/rails'"
|
@@ -1,11 +1,11 @@
|
|
1
1
|
Feature: No Database
|
2
|
+
|
2
3
|
Allow Cucumber to work with a Rails app without a database
|
3
4
|
|
4
|
-
@fails-on-travis
|
5
5
|
Scenario: No ActiveRecord and DatabaseCleaner
|
6
6
|
Given I have created a new Rails app with no database and installed cucumber-rails
|
7
7
|
# Turn off ActiveRecord
|
8
|
-
|
8
|
+
When I write to "config/application.rb" with:
|
9
9
|
"""
|
10
10
|
require File.expand_path('../boot', __FILE__)
|
11
11
|
|
@@ -17,7 +17,7 @@ Feature: No Database
|
|
17
17
|
|
18
18
|
module TestApp
|
19
19
|
class Application < Rails::Application
|
20
|
-
config.encoding =
|
20
|
+
config.encoding = 'utf-8'
|
21
21
|
config.filter_parameters += [:password]
|
22
22
|
end
|
23
23
|
end
|
@@ -26,20 +26,13 @@ Feature: No Database
|
|
26
26
|
"""
|
27
27
|
require 'cucumber/rails'
|
28
28
|
"""
|
29
|
-
|
30
|
-
And I
|
31
|
-
"""
|
32
|
-
source 'http://rubygems.org'
|
33
|
-
gem 'rails'
|
34
|
-
gem "cucumber-rails", :group => :test, :path => "../../.."
|
35
|
-
gem "capybara", :group => :test
|
36
|
-
gem "rspec-rails", :group => :test
|
37
|
-
"""
|
29
|
+
And I remove the 'database_cleaner' gem from the Gemfile
|
30
|
+
And I remove the 'sqlite' gem from the Gemfile
|
38
31
|
And I write to "app/controllers/posts_controller.rb" with:
|
39
32
|
"""
|
40
33
|
class PostsController < ApplicationController
|
41
34
|
def index
|
42
|
-
raise
|
35
|
+
raise 'There is an error in index'
|
43
36
|
end
|
44
37
|
end
|
45
38
|
"""
|
@@ -53,11 +46,11 @@ Feature: No Database
|
|
53
46
|
"""
|
54
47
|
Feature: posts
|
55
48
|
Scenario: See them
|
56
|
-
When I
|
49
|
+
When I view the posts
|
57
50
|
"""
|
58
51
|
And I write to "features/step_definitions/posts_steps.rb" with:
|
59
52
|
"""
|
60
|
-
When
|
53
|
+
When('I view the posts') do
|
61
54
|
visit '/posts'
|
62
55
|
end
|
63
56
|
"""
|