cucumber-rails 1.8.0 → 2.0.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.
- checksums.yaml +4 -4
- data/.rspec +4 -1
- data/.rubocop.yml +0 -3
- data/Appraisals +4 -4
- data/CHANGELOG.md +22 -2
- data/README.md +28 -9
- data/cucumber-rails.gemspec +2 -2
- data/features/annotations.feature +7 -9
- data/features/capybara_javascript_drivers.feature +29 -9
- data/features/configuration.feature +48 -0
- data/features/database_cleaner.feature +4 -4
- data/features/emulate_javascript.feature +44 -29
- data/features/install_cucumber_rails.feature +4 -4
- data/features/no_database.feature +1 -0
- data/features/raising_errors.feature +8 -2
- data/features/rerun_profile.feature +1 -0
- data/features/rest_api.feature +2 -2
- data/features/step_definitions/cucumber_rails_steps.rb +13 -16
- data/features/support/cucumber_rails_helper.rb +0 -4
- data/features/support/env.rb +1 -9
- data/features/support/hooks.rb +8 -0
- data/gemfiles/rails_5_1.gemfile +1 -1
- data/gemfiles/rails_5_2.gemfile +1 -1
- data/gemfiles/rails_6_0.gemfile +2 -2
- data/lib/cucumber/rails/world.rb +12 -1
- data/spec/cucumber/rails/database_spec.rb +8 -8
- data/spec/generators/cucumber/install_generator_spec.rb +1 -3
- data/spec/spec_helper.rb +1 -1
- metadata +14 -32
- data/features/support/legacy_web_steps_support.rb +0 -289
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aea01cd8d17a13c8f43f785981239c8aeb28202591bce35bedeee997ac2c25ea
|
4
|
+
data.tar.gz: f021c09f4793b9e179f80214d6572498645fd65a007a5e17121a91a73effc3a4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b90e398bf55e9bb8d3f5eb267bd981ba16929f16c2be420829da9498ba4c077f9ba37652a6744ac57a1a96653b2bccf1d0bc57b40aa1700a89725dfd9a95179c
|
7
|
+
data.tar.gz: 80ee71f600ddff221964012001529345b769503f12b9124257ddca788e8a27e132c62a71a712b80f1d4bd7b314ddfad7c32a741a314fac386d9fad7bb0c0c3f8
|
data/.rspec
CHANGED
data/.rubocop.yml
CHANGED
@@ -7,9 +7,6 @@ require:
|
|
7
7
|
AllCops:
|
8
8
|
TargetRubyVersion: 2.3
|
9
9
|
Exclude:
|
10
|
-
# This file is something which we aren't advising people to use
|
11
|
-
# Probably need to consider deleting this fully at some point
|
12
|
-
- 'features/support/legacy_web_steps_support.rb'
|
13
10
|
# These are auto-generated from a load of features that we
|
14
11
|
# don't have direct control over
|
15
12
|
- 'tmp/**/*'
|
data/Appraisals
CHANGED
@@ -17,19 +17,19 @@ end
|
|
17
17
|
appraise 'rails_5_1' do
|
18
18
|
gem 'capybara', '< 3.16.0', platform: :mri_23
|
19
19
|
gem 'nokogiri', '< 1.9.1', platform: :mri_23
|
20
|
-
gem 'railties', '~> 5.1.
|
20
|
+
gem 'railties', '~> 5.1.7'
|
21
21
|
gem 'sqlite3', '~> 1.3.13'
|
22
22
|
end
|
23
23
|
|
24
24
|
appraise 'rails_5_2' do
|
25
25
|
gem 'capybara', '< 3.16.0', platform: :mri_23
|
26
26
|
gem 'nokogiri', '< 1.9.1', platform: :mri_23
|
27
|
-
gem 'railties', '~> 5.2.
|
27
|
+
gem 'railties', '~> 5.2.0'
|
28
28
|
gem 'sqlite3', '~> 1.3.13'
|
29
29
|
end
|
30
30
|
|
31
31
|
appraise 'rails_6_0' do
|
32
|
-
gem 'railties', '~> 6.0.0
|
33
|
-
gem 'rails', '~> 6.0.0
|
32
|
+
gem 'railties', '~> 6.0.0'
|
33
|
+
gem 'rails', '~> 6.0.0'
|
34
34
|
gem 'sqlite3', '~> 1.4'
|
35
35
|
end
|
data/CHANGELOG.md
CHANGED
@@ -1,15 +1,35 @@
|
|
1
1
|
Please see [CONTRIBUTING.md](https://github.com/cucumber/cucumber/blob/master/CONTRIBUTING.md) on how to contribute to Cucumber.
|
2
2
|
|
3
|
-
## [master](https://github.com/cucumber/cucumber-rails/compare/
|
3
|
+
## [master](https://github.com/cucumber/cucumber-rails/compare/v2.0.0...master) (Not yet released)
|
4
|
+
|
5
|
+
### New Features
|
6
|
+
|
7
|
+
*
|
4
8
|
|
5
9
|
### Changed
|
6
10
|
|
7
11
|
*
|
8
|
-
|
12
|
+
|
9
13
|
### Fixed
|
10
14
|
|
11
15
|
*
|
12
16
|
|
17
|
+
## [v2.0.0](https://github.com/cucumber/cucumber-rails/compare/v1.8.0...v2.0.0) (Not yet released)
|
18
|
+
|
19
|
+
### New Features
|
20
|
+
|
21
|
+
* New functionality allows users to Configure whether `Rack::Test` methods get auto-mixed in
|
22
|
+
* Setting `ENV['CR_REMOVE_RACK_TEST_HELPERS] = "true"` will remove these methods from the `World`
|
23
|
+
([#440](https://github.com/cucumber/cucumber-rails/pull/440) [luke-hill])
|
24
|
+
|
25
|
+
### Changed
|
26
|
+
|
27
|
+
* **Breaking change:** `web_steps` have been completely removed from cucumber-rails
|
28
|
+
([#437](https://github.com/cucumber/cucumber-rails/pull/437) [luke-hill])
|
29
|
+
|
30
|
+
* Altered some branching logic in tests designed to cater for old ruby/rails versions
|
31
|
+
([#433](https://github.com/cucumber/cucumber-rails/pull/433) [luke-hill])
|
32
|
+
|
13
33
|
## [v1.8.0](https://github.com/cucumber/cucumber-rails/compare/v1.7.0..v1.8.0) (2019-08-06)
|
14
34
|
|
15
35
|
### Changed
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
[](https://codeclimate.com/github/cucumber/cucumber-rails)
|
6
6
|
[](https://www.codetriage.com/cucumber/cucumber-rails)
|
7
7
|
|
8
|
-
Cucumber-Rails brings Cucumber to Rails 4.2,
|
8
|
+
Cucumber-Rails brings Cucumber to Rails 4.2, 5.x and 6.x.
|
9
9
|
|
10
10
|
## Installation
|
11
11
|
|
@@ -43,7 +43,8 @@ Without Rake:
|
|
43
43
|
|
44
44
|
## Configuration options
|
45
45
|
|
46
|
-
By default, cucumber-rails runs `DatabaseCleaner.start` and `DatabaseCleaner.clean`
|
46
|
+
By default, cucumber-rails runs `DatabaseCleaner.start` and `DatabaseCleaner.clean`
|
47
|
+
before and after your scenarios. You can disable this behaviour like so:
|
47
48
|
|
48
49
|
```ruby
|
49
50
|
# features/support/env.rb
|
@@ -51,6 +52,12 @@ By default, cucumber-rails runs `DatabaseCleaner.start` and `DatabaseCleaner.cle
|
|
51
52
|
Cucumber::Rails::Database.autorun_database_cleaner = false
|
52
53
|
```
|
53
54
|
|
55
|
+
By default, cucumber-rails will auto mix-in the helpers from `Rack::Test` into your default Cucumber World instance. You can prevent this behaviour like so:
|
56
|
+
```ruby
|
57
|
+
# features/support/env.rb
|
58
|
+
ENV['CR_REMOVE_RACK_TEST_HELPERS'] = 'true'
|
59
|
+
```
|
60
|
+
|
54
61
|
## Upgrading from a previous version
|
55
62
|
|
56
63
|
When upgrading from a previous version it is recommended that you rerun:
|
@@ -59,14 +66,20 @@ When upgrading from a previous version it is recommended that you rerun:
|
|
59
66
|
|
60
67
|
## Bugs and feature requests
|
61
68
|
|
62
|
-
The *only* way to have a bug fixed or a new feature accepted is to describe it with a
|
69
|
+
The *only* way to have a bug fixed or a new feature accepted is to describe it with a
|
70
|
+
Cucumber feature. Let's say you think you have found a bug in the cucumber:install generator.
|
71
|
+
Fork this project, clone it to your workstation and check out a branch with a descriptive name:
|
63
72
|
|
64
73
|
git clone git@github.com:you/cucumber-rails.git
|
65
74
|
git checkout -b bugfix/generator-fails-on-ruby-25
|
66
75
|
|
67
|
-
Start by making sure you can run the existing features. Now, create a feature that demonstrates
|
76
|
+
Start by making sure you can run the existing features. Now, create a feature that demonstrates
|
77
|
+
what's wrong. See the existing features for examples. When you have a failing feature that
|
78
|
+
reproduces the bug, commit, push and send a pull request. Someone from the Cucumber-Rails team
|
79
|
+
will review it and hopefully create a fix.
|
68
80
|
|
69
|
-
If you know how to fix the bug yourself, make a second commit (after committing the failing
|
81
|
+
If you know how to fix the bug yourself, make a second commit (after committing the failing
|
82
|
+
feature) before you send the pull request.
|
70
83
|
|
71
84
|
### Setting up your environment
|
72
85
|
|
@@ -85,7 +98,10 @@ With all dependencies installed, all specs and features should pass:
|
|
85
98
|
|
86
99
|
### Running Appraisal suite
|
87
100
|
|
88
|
-
In order to test against multiple versions of key dependencies, the [Appraisal](https://github.com/thoughtbot/appraisal)
|
101
|
+
In order to test against multiple versions of key dependencies, the [Appraisal](https://github.com/thoughtbot/appraisal)
|
102
|
+
gem is used to generate multiple gemfiles, stored in the `gemfiles/` directory.
|
103
|
+
Normally these will only run on Travis; however, if you want to run the full test suite against
|
104
|
+
all gemfiles, run the following commands:
|
89
105
|
|
90
106
|
[bundle exec] appraisal install
|
91
107
|
[bundle exec] appraisal rake test
|
@@ -94,11 +110,13 @@ To run the suite against a named gemfile, use the following:
|
|
94
110
|
|
95
111
|
[bundle exec] appraisal rails_4_2 rake test
|
96
112
|
|
97
|
-
To remove and rebuild the different gemfiles (for example, to update a rails version or its
|
113
|
+
To remove and rebuild the different gemfiles (for example, to update a rails version or its
|
114
|
+
dependencies), use the following:
|
98
115
|
|
99
116
|
[bundle exec] appraisal update
|
100
117
|
|
101
|
-
If you've changed versions of the dependencies, you may find it helpful to forcefully clean
|
118
|
+
If you've changed versions of the dependencies, you may find it helpful to forcefully clean
|
119
|
+
each appraisal's gem lock file in `gemfiles/`. You can do this using:
|
102
120
|
|
103
121
|
[bundle exec] rake clean
|
104
122
|
|
@@ -108,7 +126,8 @@ To support the multiple-gemfile testing, when adding a new dependency the follow
|
|
108
126
|
|
109
127
|
1. If it's a runtime dependency of the gem, add it to the gemspec
|
110
128
|
2. If it's a primary development dependency, add it to the gemspec
|
111
|
-
3. If it's a dependency of a generated rails app in a test, add it to [the helper] that
|
129
|
+
3. If it's a dependency of a generated rails app in a test, add it to [the helper] that
|
130
|
+
modifies the `Gemfile`.
|
112
131
|
|
113
132
|
For example, rspec is a primary development dependency, so it lives in the gemspec.
|
114
133
|
|
data/cucumber-rails.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift File.expand_path('lib', __dir__)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = 'cucumber-rails'
|
7
|
-
s.version = '
|
7
|
+
s.version = '2.0.0'
|
8
8
|
s.authors = ['Aslak Hellesøy', 'Dennis Blöte', 'Rob Holland']
|
9
9
|
s.description = 'Cucumber Generator and Runtime for Rails'
|
10
10
|
s.summary = "#{s.name}-#{s.version}"
|
@@ -21,8 +21,8 @@ Gem::Specification.new do |s|
|
|
21
21
|
|
22
22
|
# Main development dependencies
|
23
23
|
s.add_development_dependency('ammeter', '>= 1.1.4')
|
24
|
-
s.add_development_dependency('appraisal', '~> 2.2')
|
25
24
|
s.add_development_dependency('aruba', '~> 0.14.4')
|
25
|
+
s.add_development_dependency('appraisal', '~> 2.2')
|
26
26
|
s.add_development_dependency('bundler', '>= 1.17')
|
27
27
|
s.add_development_dependency('rails', ['>= 4.2', '< 7'])
|
28
28
|
s.add_development_dependency('rake', '>= 12.0')
|
@@ -1,22 +1,20 @@
|
|
1
1
|
Feature: Annotations
|
2
2
|
|
3
|
-
|
3
|
+
In order to track my development progress
|
4
4
|
As a developer
|
5
5
|
I should be able to list annotations in my features
|
6
6
|
|
7
|
-
|
7
|
+
Scenario: See annotations in feature file
|
8
8
|
Given I have created a new Rails app with no database and installed cucumber-rails
|
9
|
-
When I write to "features/
|
9
|
+
When I write to "features/products.feature" with:
|
10
10
|
"""
|
11
|
-
Feature:
|
12
|
-
Scenario:
|
11
|
+
Feature: Products
|
12
|
+
Scenario: Test a Product
|
13
13
|
# TODO: When I go to the products page
|
14
14
|
"""
|
15
|
-
|
16
|
-
Scenario: See annotations in .feature file
|
17
15
|
When I run `bundle exec rake notes`
|
18
16
|
Then it should pass with:
|
19
17
|
"""
|
20
|
-
features/
|
21
|
-
* [
|
18
|
+
features/products.feature:
|
19
|
+
* [3] [TODO] When I go to the products page
|
22
20
|
"""
|
@@ -5,12 +5,6 @@ Feature: Capybara Javascript Drivers
|
|
5
5
|
Given I have created a new Rails app and installed cucumber-rails
|
6
6
|
And I force selenium to run Firefox in headless mode
|
7
7
|
When I run `bundle exec rails g scaffold appointment name:string when:datetime`
|
8
|
-
And I write to "features/step_definitions/date_time_steps.rb" with:
|
9
|
-
"""
|
10
|
-
When('I select {string} as the {string} date and time') do |datetime, selector|
|
11
|
-
select_datetime(datetime, from: selector)
|
12
|
-
end
|
13
|
-
"""
|
14
8
|
|
15
9
|
Scenario: Use a particular driver
|
16
10
|
When I write to "features/create_appointment.feature" with:
|
@@ -25,6 +19,28 @@ Feature: Capybara Javascript Drivers
|
|
25
19
|
Then I should see "Norway's constitution"
|
26
20
|
And I should see "2015-02-20 15:10:00 UTC"
|
27
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
|
+
"""
|
28
44
|
And I run `bundle exec rake db:migrate`
|
29
45
|
And I run `bundle exec rake cucumber`
|
30
46
|
Then the feature run should pass with:
|
@@ -40,18 +56,22 @@ Feature: Capybara Javascript Drivers
|
|
40
56
|
Feature: Create appointments
|
41
57
|
Scenario: Visit the Constitution on May 17
|
42
58
|
Given a random appointment
|
43
|
-
And I am viewing
|
59
|
+
And I am viewing the appointment
|
44
60
|
Then I should see "Random appointment"
|
45
61
|
"""
|
46
|
-
And I write to "features/step_definitions/
|
62
|
+
And I write to "features/step_definitions/create_appointment_steps.rb" with:
|
47
63
|
"""
|
48
64
|
Given('a random appointment') do
|
49
65
|
@appointment = Appointment.create!(name: 'Random appointment', when: DateTime.now)
|
50
66
|
end
|
51
67
|
|
52
|
-
Given('I am viewing
|
68
|
+
Given('I am viewing the appointment') do
|
53
69
|
visit appointment_path(@appointment)
|
54
70
|
end
|
71
|
+
|
72
|
+
Then('I should see {string}') do |text|
|
73
|
+
expect(page).to have_content(text)
|
74
|
+
end
|
55
75
|
"""
|
56
76
|
And I run `bundle exec rake db:migrate`
|
57
77
|
And I run `bundle exec rake cucumber`
|
@@ -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,18 +1,18 @@
|
|
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
10
|
|
11
|
-
Scenario: Add 3
|
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
|
"""
|
@@ -1,25 +1,24 @@
|
|
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
5
|
And I force selenium to run Firefox in headless mode
|
6
6
|
When I run `rails generate scaffold widget name:string`
|
7
|
-
And I write to "features/
|
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
|
-
"""
|
7
|
+
And I write to "features/step_definitions/widget_steps.rb" with:
|
8
|
+
"""
|
18
9
|
Given('there is a widget named {string}') do |name|
|
19
10
|
FactoryBot.create(:widget, name: name)
|
20
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
|
21
20
|
"""
|
22
|
-
And I write to "features/support/factories.rb" with:
|
21
|
+
And I write to "features/support/factories/widget.rb" with:
|
23
22
|
"""
|
24
23
|
FactoryBot.define do
|
25
24
|
factory :widget do
|
@@ -27,6 +26,17 @@ Feature: Emulate Javascript
|
|
27
26
|
end
|
28
27
|
end
|
29
28
|
"""
|
29
|
+
|
30
|
+
Scenario: See a widget
|
31
|
+
When I write to "features/widgets.feature" with:
|
32
|
+
"""
|
33
|
+
@javascript
|
34
|
+
Feature: Widget inventory
|
35
|
+
Scenario: Delete a widget
|
36
|
+
Given there is a widget named "wrench"
|
37
|
+
And I am on the widgets page
|
38
|
+
Then I should see "wrench"
|
39
|
+
"""
|
30
40
|
And I run `bundle exec rake db:migrate`
|
31
41
|
And I run `bundle exec rake cucumber`
|
32
42
|
Then the feature run should pass with:
|
@@ -36,9 +46,7 @@ Feature: Emulate Javascript
|
|
36
46
|
"""
|
37
47
|
|
38
48
|
Scenario: Pass on the CSRF token
|
39
|
-
|
40
|
-
When 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`
|
49
|
+
When I run `sed -i -e 's/forgery_protection *= false/forgery_protection = true/' config/environments/test.rb`
|
42
50
|
And I run `rails generate controller session establish`
|
43
51
|
And I write to "app/controllers/session_controller.rb" with:
|
44
52
|
"""
|
@@ -58,31 +66,38 @@ Feature: Emulate Javascript
|
|
58
66
|
end
|
59
67
|
end
|
60
68
|
"""
|
61
|
-
And I write to "features/
|
69
|
+
And I write to "features/widgets.feature" with:
|
62
70
|
"""
|
63
71
|
Feature: Widget inventory
|
64
72
|
Scenario: Delete a widget
|
65
73
|
Given there is a widget named "wrench"
|
66
|
-
|
67
|
-
And I
|
74
|
+
And I am on the session establish page
|
75
|
+
And I am on the widgets page
|
68
76
|
Then I should see "wrench"
|
69
77
|
When I follow "Destroy"
|
70
78
|
Then I should not see "denied"
|
71
79
|
And I should be on the widgets page
|
72
80
|
And I should not see "wrench"
|
73
81
|
"""
|
74
|
-
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
|
75
84
|
"""
|
76
|
-
|
77
|
-
|
85
|
+
|
86
|
+
Given('I am on the session establish page') do
|
87
|
+
visit session_establish_path
|
78
88
|
end
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
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)
|
86
101
|
end
|
87
102
|
"""
|
88
103
|
And I run `bundle exec rake db:migrate`
|
@@ -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
|
@@ -2,11 +2,17 @@ Feature: Raise Errors
|
|
2
2
|
|
3
3
|
Scenario: Raise error for undefined route
|
4
4
|
Given I have created a new Rails app with no database and installed cucumber-rails
|
5
|
-
When I write to "features/
|
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
|
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:
|
data/features/rest_api.feature
CHANGED
@@ -28,13 +28,13 @@ Feature: REST API
|
|
28
28
|
}
|
29
29
|
\"\"\"
|
30
30
|
"""
|
31
|
-
And I write to "features/step_definitions/
|
31
|
+
And I write to "features/step_definitions/post_steps.rb" with:
|
32
32
|
"""
|
33
33
|
When('the client requests GET /{word}') do |path|
|
34
34
|
get(path)
|
35
35
|
end
|
36
36
|
|
37
|
-
Then(
|
37
|
+
Then('the response should be JSON:') do |json|
|
38
38
|
expect(JSON.parse(last_response.body)).to eq(JSON.parse(json))
|
39
39
|
end
|
40
40
|
"""
|
@@ -3,20 +3,17 @@
|
|
3
3
|
Given('I have created a new Rails app and installed cucumber-rails, accidentally outside of the test group in my Gemfile') do
|
4
4
|
rails_new
|
5
5
|
install_cucumber_rails :not_in_test_group
|
6
|
-
create_web_steps
|
7
6
|
end
|
8
7
|
|
9
8
|
Given('I have created a new Rails app and installed cucumber-rails') do
|
10
9
|
rails_new
|
11
10
|
install_cucumber_rails
|
12
|
-
create_web_steps
|
13
11
|
end
|
14
12
|
|
15
13
|
Given('I have created a new Rails app with no database and installed cucumber-rails') do
|
16
14
|
rails_new args: '--skip-active-record'
|
17
15
|
install_cucumber_rails :no_database_cleaner, :no_factory_bot
|
18
16
|
overwrite_file('features/support/env.rb', "require 'cucumber/rails'\n")
|
19
|
-
create_web_steps
|
20
17
|
end
|
21
18
|
|
22
19
|
Given('I have a {string} ActiveRecord model object') do |name|
|
@@ -24,6 +21,19 @@ Given('I have a {string} ActiveRecord model object') do |name|
|
|
24
21
|
run_command_and_stop('bundle exec rake db:migrate RAILS_ENV=test')
|
25
22
|
end
|
26
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 line =~ /gem ["|']#{gem_name}["|'].*/
|
30
|
+
|
31
|
+
new_content << line
|
32
|
+
end
|
33
|
+
|
34
|
+
overwrite_file('Gemfile', new_content.join("\r\n"))
|
35
|
+
end
|
36
|
+
|
27
37
|
Given('I force selenium to run Firefox in headless mode') do
|
28
38
|
selenium_config = %{
|
29
39
|
Capybara.register_driver :selenium do |app|
|
@@ -57,16 +67,3 @@ Then(/^the feature run should pass with:$/) do |string|
|
|
57
67
|
step 'the exit status should be 0'
|
58
68
|
step 'the output should contain:', string
|
59
69
|
end
|
60
|
-
|
61
|
-
Given('I remove the {string} gem from the Gemfile') do |gem_name|
|
62
|
-
content = File.open(expand_path('Gemfile'), 'r').readlines
|
63
|
-
new_content = []
|
64
|
-
|
65
|
-
content.each do |line|
|
66
|
-
next if line =~ /gem ["|']#{gem_name}["|'].*/
|
67
|
-
|
68
|
-
new_content << line
|
69
|
-
end
|
70
|
-
|
71
|
-
overwrite_file('Gemfile', new_content.join("\r\n"))
|
72
|
-
end
|
data/features/support/env.rb
CHANGED
@@ -1,14 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
|
4
|
-
|
5
|
-
require 'bundler/setup'
|
4
|
+
|
6
5
|
require 'rspec/expectations'
|
7
6
|
require 'aruba/cucumber'
|
8
|
-
|
9
|
-
After do |scenario|
|
10
|
-
if scenario.failed?
|
11
|
-
puts last_command_stopped.stdout
|
12
|
-
puts last_command_stopped.stderr
|
13
|
-
end
|
14
|
-
end
|
data/gemfiles/rails_5_1.gemfile
CHANGED
data/gemfiles/rails_5_2.gemfile
CHANGED
data/gemfiles/rails_6_0.gemfile
CHANGED
data/lib/cucumber/rails/world.rb
CHANGED
@@ -7,10 +7,21 @@ rescue LoadError
|
|
7
7
|
# Test Unit not found
|
8
8
|
end
|
9
9
|
|
10
|
+
module Cucumber
|
11
|
+
module Rails
|
12
|
+
class << self
|
13
|
+
def include_rack_test_helpers?
|
14
|
+
# Using ActiveModel Boolean casting here will give false positives more often than not!
|
15
|
+
!ENV['CR_REMOVE_RACK_TEST_HELPERS']&.casecmp('true')&.zero?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
10
21
|
module Cucumber
|
11
22
|
module Rails
|
12
23
|
class World < ActionDispatch::IntegrationTest
|
13
|
-
include Rack::Test::Methods
|
24
|
+
include Rack::Test::Methods if Cucumber::Rails.include_rack_test_helpers?
|
14
25
|
include ActiveSupport::Testing::SetupAndTeardown if ActiveSupport::Testing.const_defined?('SetupAndTeardown')
|
15
26
|
|
16
27
|
def initialize
|
@@ -11,10 +11,10 @@ describe Cucumber::Rails::Database do
|
|
11
11
|
it 'forwards events to the selected strategy' do
|
12
12
|
described_class.javascript_strategy = :truncation
|
13
13
|
|
14
|
-
expect(strategy).to receive(:before_non_js)
|
14
|
+
expect(strategy).to receive(:before_non_js)
|
15
15
|
described_class.before_non_js
|
16
16
|
|
17
|
-
expect(strategy).to receive(:before_js)
|
17
|
+
expect(strategy).to receive(:before_js)
|
18
18
|
described_class.before_js
|
19
19
|
end
|
20
20
|
|
@@ -23,7 +23,7 @@ describe Cucumber::Rails::Database do
|
|
23
23
|
.to raise_error(Cucumber::Rails::Database::InvalidStrategy)
|
24
24
|
end
|
25
25
|
|
26
|
-
|
26
|
+
context 'using a custom strategy' do
|
27
27
|
let(:strategy_type) { ValidStrategy }
|
28
28
|
|
29
29
|
class ValidStrategy
|
@@ -38,23 +38,23 @@ describe Cucumber::Rails::Database do
|
|
38
38
|
|
39
39
|
class InvalidStrategy; end
|
40
40
|
|
41
|
-
it 'raises an error if the strategy
|
41
|
+
it 'raises an error if the strategy does not have a valid interface' do
|
42
42
|
expect { described_class.javascript_strategy = InvalidStrategy }
|
43
43
|
.to raise_error(ArgumentError)
|
44
44
|
end
|
45
45
|
|
46
|
-
it 'accepts
|
46
|
+
it 'accepts the strategy if it has a valid interface' do
|
47
47
|
expect { described_class.javascript_strategy = ValidStrategy }
|
48
48
|
.not_to raise_error
|
49
49
|
end
|
50
50
|
|
51
|
-
it 'forwards events to
|
51
|
+
it 'forwards events to the strategy' do
|
52
52
|
described_class.javascript_strategy = ValidStrategy
|
53
53
|
|
54
|
-
expect(strategy).to receive(:before_non_js)
|
54
|
+
expect(strategy).to receive(:before_non_js)
|
55
55
|
described_class.before_non_js
|
56
56
|
|
57
|
-
expect(strategy).to receive(:before_js)
|
57
|
+
expect(strategy).to receive(:before_js)
|
58
58
|
described_class.before_js
|
59
59
|
end
|
60
60
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
3
|
# Generators are not automatically loaded by Rails
|
6
4
|
require 'generators/cucumber/install_generator'
|
7
5
|
|
@@ -15,7 +13,7 @@ describe Cucumber::InstallGenerator do
|
|
15
13
|
'# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.'
|
16
14
|
end
|
17
15
|
|
18
|
-
|
16
|
+
context 'without arguments' do
|
19
17
|
before { run_generator }
|
20
18
|
|
21
19
|
describe 'config/cucumber.yml' do
|
data/spec/spec_helper.rb
CHANGED
@@ -7,7 +7,7 @@ ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
|
|
7
7
|
|
8
8
|
module CucumberRails
|
9
9
|
class Application < ::Rails::Application
|
10
|
-
config.secret_key_base = 'ASecretString'
|
10
|
+
config.secret_key_base = 'ASecretString'
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cucumber-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aslak Hellesøy
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2019-
|
13
|
+
date: 2019-11-01 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: capybara
|
@@ -121,33 +121,33 @@ dependencies:
|
|
121
121
|
- !ruby/object:Gem::Version
|
122
122
|
version: 1.1.4
|
123
123
|
- !ruby/object:Gem::Dependency
|
124
|
-
name:
|
124
|
+
name: aruba
|
125
125
|
requirement: !ruby/object:Gem::Requirement
|
126
126
|
requirements:
|
127
127
|
- - "~>"
|
128
128
|
- !ruby/object:Gem::Version
|
129
|
-
version:
|
129
|
+
version: 0.14.4
|
130
130
|
type: :development
|
131
131
|
prerelease: false
|
132
132
|
version_requirements: !ruby/object:Gem::Requirement
|
133
133
|
requirements:
|
134
134
|
- - "~>"
|
135
135
|
- !ruby/object:Gem::Version
|
136
|
-
version:
|
136
|
+
version: 0.14.4
|
137
137
|
- !ruby/object:Gem::Dependency
|
138
|
-
name:
|
138
|
+
name: appraisal
|
139
139
|
requirement: !ruby/object:Gem::Requirement
|
140
140
|
requirements:
|
141
141
|
- - "~>"
|
142
142
|
- !ruby/object:Gem::Version
|
143
|
-
version:
|
143
|
+
version: '2.2'
|
144
144
|
type: :development
|
145
145
|
prerelease: false
|
146
146
|
version_requirements: !ruby/object:Gem::Requirement
|
147
147
|
requirements:
|
148
148
|
- - "~>"
|
149
149
|
- !ruby/object:Gem::Version
|
150
|
-
version:
|
150
|
+
version: '2.2'
|
151
151
|
- !ruby/object:Gem::Dependency
|
152
152
|
name: bundler
|
153
153
|
requirement: !ruby/object:Gem::Requirement
|
@@ -332,6 +332,7 @@ files:
|
|
332
332
|
- features/annotations.feature
|
333
333
|
- features/capybara_javascript_drivers.feature
|
334
334
|
- features/choose_javascript_database_strategy.feature
|
335
|
+
- features/configuration.feature
|
335
336
|
- features/database_cleaner.feature
|
336
337
|
- features/disable_automatic_database_cleaning.feature
|
337
338
|
- features/emulate_javascript.feature
|
@@ -344,7 +345,7 @@ files:
|
|
344
345
|
- features/support/aruba.rb
|
345
346
|
- features/support/cucumber_rails_helper.rb
|
346
347
|
- features/support/env.rb
|
347
|
-
- features/support/
|
348
|
+
- features/support/hooks.rb
|
348
349
|
- gemfiles/rails_4_2.gemfile
|
349
350
|
- gemfiles/rails_5_0.gemfile
|
350
351
|
- gemfiles/rails_5_1.gemfile
|
@@ -397,28 +398,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
397
398
|
- !ruby/object:Gem::Version
|
398
399
|
version: '0'
|
399
400
|
requirements: []
|
400
|
-
|
401
|
+
rubyforge_project:
|
402
|
+
rubygems_version: 2.7.9
|
401
403
|
signing_key:
|
402
404
|
specification_version: 4
|
403
|
-
summary: cucumber-rails-
|
404
|
-
test_files:
|
405
|
-
- features/allow_rescue.feature
|
406
|
-
- features/annotations.feature
|
407
|
-
- features/capybara_javascript_drivers.feature
|
408
|
-
- features/choose_javascript_database_strategy.feature
|
409
|
-
- features/database_cleaner.feature
|
410
|
-
- features/disable_automatic_database_cleaning.feature
|
411
|
-
- features/emulate_javascript.feature
|
412
|
-
- features/install_cucumber_rails.feature
|
413
|
-
- features/no_database.feature
|
414
|
-
- features/raising_errors.feature
|
415
|
-
- features/rerun_profile.feature
|
416
|
-
- features/rest_api.feature
|
417
|
-
- features/step_definitions/cucumber_rails_steps.rb
|
418
|
-
- features/support/aruba.rb
|
419
|
-
- features/support/cucumber_rails_helper.rb
|
420
|
-
- features/support/env.rb
|
421
|
-
- features/support/legacy_web_steps_support.rb
|
422
|
-
- spec/cucumber/rails/database_spec.rb
|
423
|
-
- spec/generators/cucumber/install_generator_spec.rb
|
424
|
-
- spec/spec_helper.rb
|
405
|
+
summary: cucumber-rails-2.0.0
|
406
|
+
test_files: []
|
@@ -1,289 +0,0 @@
|
|
1
|
-
module WebSteps
|
2
|
-
def create_web_steps
|
3
|
-
write_file('features/step_definitions/web_steps.rb', <<-EOF)
|
4
|
-
# web_steps.rb used to be in Cucumber-Rails, but was removed in 1.1.0. We're still using them in the tests because
|
5
|
-
# the tests were written while we still thought web_steps.rb was a good idea. We don't think so anymore:
|
6
|
-
#
|
7
|
-
# http://groups.google.com/group/cukes/browse_thread/thread/26f80b93c94f2952
|
8
|
-
# https://github.com/cucumber/cucumber-rails/issues/174
|
9
|
-
# http://benmabey.com/2008/05/19/imperative-vs-declarative-scenarios-in-user-stories.html
|
10
|
-
# http://dannorth.net/2011/01/31/whose-domain-is-it-anyway/
|
11
|
-
# http://elabs.se/blog/15-you-re-cuking-it-wrong
|
12
|
-
#
|
13
|
-
# I'm sure someone will find this and paste it into their own projects. Go ahead. It's a bad idea.
|
14
|
-
# You have been warned.
|
15
|
-
#
|
16
|
-
# Aslak
|
17
|
-
|
18
|
-
require 'uri'
|
19
|
-
require 'cgi'
|
20
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths"))
|
21
|
-
|
22
|
-
module WithinHelpers
|
23
|
-
def with_scope(locator)
|
24
|
-
locator ? within(*selector_for(locator)) { yield } : yield
|
25
|
-
end
|
26
|
-
end
|
27
|
-
World(WithinHelpers)
|
28
|
-
|
29
|
-
# Single-line step scoper
|
30
|
-
When /^(.*) within (.*[^:])$/ do |step, parent|
|
31
|
-
with_scope(parent) { When step }
|
32
|
-
end
|
33
|
-
|
34
|
-
# Multi-line step scoper
|
35
|
-
When /^(.*) within (.*[^:]):$/ do |step, parent, table_or_string|
|
36
|
-
with_scope(parent) { When "\#{step}:", table_or_string }
|
37
|
-
end
|
38
|
-
|
39
|
-
Given /^(?:|I )am on (.+)$/ do |page_name|
|
40
|
-
visit path_to(page_name)
|
41
|
-
end
|
42
|
-
|
43
|
-
When /^(?:|I )go to (.+)$/ do |page_name|
|
44
|
-
visit path_to(page_name)
|
45
|
-
end
|
46
|
-
|
47
|
-
When /^(?:|I )press "([^"]*)"$/ do |button|
|
48
|
-
click_button(button)
|
49
|
-
end
|
50
|
-
|
51
|
-
When /^(?:|I )follow "([^"]*)"$/ do |link|
|
52
|
-
click_link(link)
|
53
|
-
end
|
54
|
-
|
55
|
-
When /^(?:|I )fill in "([^"]*)" with "([^"]*)"$/ do |field, value|
|
56
|
-
fill_in(field, with: value)
|
57
|
-
end
|
58
|
-
|
59
|
-
When /^(?:|I )fill in "([^"]*)" for "([^"]*)"$/ do |value, field|
|
60
|
-
fill_in(field, with: value)
|
61
|
-
end
|
62
|
-
|
63
|
-
# Use this to fill in an entire form with data from a table. Example:
|
64
|
-
#
|
65
|
-
# When I fill in the following:
|
66
|
-
# | Account Number | 5002 |
|
67
|
-
# | Expiry date | 2009-11-01 |
|
68
|
-
# | Note | Nice guy |
|
69
|
-
# | Wants Email? | |
|
70
|
-
#
|
71
|
-
# TODO: Add support for checkbox, select or option
|
72
|
-
# based on naming conventions.
|
73
|
-
#
|
74
|
-
When /^(?:|I )fill in the following:$/ do |fields|
|
75
|
-
fields.rows_hash.each do |name, value|
|
76
|
-
When %{I fill in "\#{name}" with "\#{value}"}
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
When /^(?:|I )select "([^"]*)" from "([^"]*)"$/ do |value, field|
|
81
|
-
select(value, from: field)
|
82
|
-
end
|
83
|
-
|
84
|
-
When /^(?:|I )check "([^"]*)"$/ do |field|
|
85
|
-
check(field)
|
86
|
-
end
|
87
|
-
|
88
|
-
When /^(?:|I )uncheck "([^"]*)"$/ do |field|
|
89
|
-
uncheck(field)
|
90
|
-
end
|
91
|
-
|
92
|
-
When /^(?:|I )choose "([^"]*)"$/ do |field|
|
93
|
-
choose(field)
|
94
|
-
end
|
95
|
-
|
96
|
-
When /^(?:|I )attach the file "([^"]*)" to "([^"]*)"$/ do |path, field|
|
97
|
-
attach_file(field, File.expand_path(path))
|
98
|
-
end
|
99
|
-
|
100
|
-
Then /^(?:|I )should see "([^"]*)"$/ do |text|
|
101
|
-
if page.respond_to? :should
|
102
|
-
page.should have_content(text)
|
103
|
-
else
|
104
|
-
assert page.has_content?(text)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
Then /^(?:|I )should see \\/([^\\/]*)\\/$/ do |regexp|
|
109
|
-
regexp = Regexp.new(regexp)
|
110
|
-
|
111
|
-
if page.respond_to? :should
|
112
|
-
page.should have_xpath('//*', text: regexp)
|
113
|
-
else
|
114
|
-
assert page.has_xpath?('//*', text: regexp)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
Then /^(?:|I )should not see "([^"]*)"$/ do |text|
|
119
|
-
if page.respond_to? :should
|
120
|
-
page.should have_no_content(text)
|
121
|
-
else
|
122
|
-
assert page.has_no_content?(text)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
Then /^(?:|I )should not see \\/([^\\/]*)\\/$/ do |regexp|
|
127
|
-
regexp = Regexp.new(regexp)
|
128
|
-
|
129
|
-
if page.respond_to? :should
|
130
|
-
page.should have_no_xpath('//*', text: regexp)
|
131
|
-
else
|
132
|
-
assert page.has_no_xpath?('//*', text: regexp)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
Then /^the "([^"]*)" field(?: within (.*))? should contain "([^"]*)"$/ do |field, parent, value|
|
137
|
-
with_scope(parent) do
|
138
|
-
field = find_field(field)
|
139
|
-
field_value = (field.tag_name == 'textarea') ? field.text : field.value
|
140
|
-
if field_value.respond_to? :should
|
141
|
-
field_value.should =~ /\#{value}/
|
142
|
-
else
|
143
|
-
assert_match(/\#{value}/, field_value)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
Then /^the "([^"]*)" field(?: within (.*))? should not contain "([^"]*)"$/ do |field, parent, value|
|
149
|
-
with_scope(parent) do
|
150
|
-
field = find_field(field)
|
151
|
-
field_value = (field.tag_name == 'textarea') ? field.text : field.value
|
152
|
-
if field_value.respond_to? :should_not
|
153
|
-
field_value.should_not =~ /\#{value}/
|
154
|
-
else
|
155
|
-
assert_no_match(/\#{value}/, field_value)
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
Then /^the "([^"]*)" field should have the error "([^"]*)"$/ do |field, error_message|
|
161
|
-
element = find_field(field)
|
162
|
-
classes = element.find(:xpath, '..')[:class].split(' ')
|
163
|
-
|
164
|
-
form_for_input = element.find(:xpath, 'ancestor::form[1]')
|
165
|
-
using_formtastic = form_for_input[:class].include?('formtastic')
|
166
|
-
error_class = using_formtastic ? 'error' : 'field_with_errors'
|
167
|
-
|
168
|
-
if classes.respond_to? :should
|
169
|
-
classes.should include(error_class)
|
170
|
-
else
|
171
|
-
assert classes.include?(error_class)
|
172
|
-
end
|
173
|
-
|
174
|
-
if page.respond_to?(:should)
|
175
|
-
if using_formtastic
|
176
|
-
error_paragraph = element.find(:xpath, '../*[@class="inline-errors"][1]')
|
177
|
-
error_paragraph.should have_content(error_message)
|
178
|
-
else
|
179
|
-
page.should have_content("\#{field.titlecase} \#{error_message}")
|
180
|
-
end
|
181
|
-
else
|
182
|
-
if using_formtastic
|
183
|
-
error_paragraph = element.find(:xpath, '../*[@class="inline-errors"][1]')
|
184
|
-
assert error_paragraph.has_content?(error_message)
|
185
|
-
else
|
186
|
-
assert page.has_content?("\#{field.titlecase} \#{error_message}")
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
Then /^the "([^"]*)" field should have no error$/ do |field|
|
192
|
-
element = find_field(field)
|
193
|
-
classes = element.find(:xpath, '..')[:class].split(' ')
|
194
|
-
if classes.respond_to? :should
|
195
|
-
classes.should_not include('field_with_errors')
|
196
|
-
classes.should_not include('error')
|
197
|
-
else
|
198
|
-
assert !classes.include?('field_with_errors')
|
199
|
-
assert !classes.include?('error')
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
Then /^the "([^"]*)" checkbox(?: within (.*))? should be checked$/ do |label, parent|
|
204
|
-
with_scope(parent) do
|
205
|
-
field_checked = find_field(label)['checked']
|
206
|
-
if field_checked.respond_to? :should
|
207
|
-
field_checked.should be_true
|
208
|
-
else
|
209
|
-
assert field_checked
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
Then /^the "([^"]*)" checkbox(?: within (.*))? should not be checked$/ do |label, parent|
|
215
|
-
with_scope(parent) do
|
216
|
-
field_checked = find_field(label)['checked']
|
217
|
-
if field_checked.respond_to? :should
|
218
|
-
field_checked.should be_false
|
219
|
-
else
|
220
|
-
assert !field_checked
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
|
-
Then /^(?:|I )should be on (.+)$/ do |page_name|
|
226
|
-
current_path = URI.parse(current_url).path
|
227
|
-
if current_path.respond_to? :should
|
228
|
-
current_path.should == path_to(page_name)
|
229
|
-
else
|
230
|
-
assert_equal path_to(page_name), current_path
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
Then /^(?:|I )should have the following query string:$/ do |expected_pairs|
|
235
|
-
query = URI.parse(current_url).query
|
236
|
-
actual_params = query ? CGI.parse(query) : {}
|
237
|
-
expected_params = {}
|
238
|
-
expected_pairs.rows_hash.each_pair{|k,v| expected_params[k] = v.split(',')}
|
239
|
-
|
240
|
-
if actual_params.respond_to? :should
|
241
|
-
actual_params.should == expected_params
|
242
|
-
else
|
243
|
-
assert_equal expected_params, actual_params
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
|
-
Then /^show me the page$/ do
|
248
|
-
save_and_open_page
|
249
|
-
end
|
250
|
-
EOF
|
251
|
-
|
252
|
-
write_file('features/support/paths.rb', <<-EOF)
|
253
|
-
module NavigationHelpers
|
254
|
-
# Maps a name to a path. Used by the
|
255
|
-
#
|
256
|
-
# When /^I go to (.+)$/ do |page_name|
|
257
|
-
#
|
258
|
-
# step definition in web_steps.rb
|
259
|
-
#
|
260
|
-
def path_to(page_name)
|
261
|
-
case page_name
|
262
|
-
|
263
|
-
when /^the home\s?page$/
|
264
|
-
'/'
|
265
|
-
|
266
|
-
# Add more mappings here.
|
267
|
-
# Here is an example that pulls values out of the Regexp:
|
268
|
-
#
|
269
|
-
# when /^(.*)'s profile page$/i
|
270
|
-
# user_profile_path(User.find_by_login($1))
|
271
|
-
|
272
|
-
else
|
273
|
-
begin
|
274
|
-
page_name =~ /^the (.*) page$/
|
275
|
-
path_components = $1.split(/\s+/)
|
276
|
-
self.send(path_components.push('path').join('_').to_sym)
|
277
|
-
rescue NoMethodError, ArgumentError
|
278
|
-
raise "Can't find mapping from \"\#{page_name}\" to a path.\\n" +
|
279
|
-
"Now, go and add a mapping in \#{__FILE__}"
|
280
|
-
end
|
281
|
-
end
|
282
|
-
end
|
283
|
-
end
|
284
|
-
|
285
|
-
World(NavigationHelpers)
|
286
|
-
EOF
|
287
|
-
end
|
288
|
-
end
|
289
|
-
World(WebSteps)
|