rspec-rails 2.11.4 → 2.12.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 (55) hide show
  1. data/Capybara.md +2 -2
  2. data/Changelog.md +25 -1
  3. data/README.md +61 -25
  4. data/features/controller_specs/anonymous_controller.feature +25 -25
  5. data/features/controller_specs/bypass_rescue.feature +4 -4
  6. data/features/controller_specs/controller_spec.feature +4 -4
  7. data/features/controller_specs/isolation_from_views.feature +13 -13
  8. data/features/controller_specs/render_views.feature +11 -11
  9. data/features/feature_specs/feature_spec.feature +34 -0
  10. data/features/helper_specs/helper_spec.feature +10 -10
  11. data/features/mailer_specs/url_helpers.feature +7 -7
  12. data/features/matchers/new_record_matcher.feature +20 -7
  13. data/features/matchers/redirect_to_matcher.feature +6 -6
  14. data/features/matchers/relation_match_array.feature +8 -6
  15. data/features/matchers/render_template_matcher.feature +25 -4
  16. data/features/mocks/mock_model.feature +21 -21
  17. data/features/mocks/stub_model.feature +8 -8
  18. data/features/model_specs/errors_on.feature +25 -7
  19. data/features/model_specs/transactional_examples.feature +13 -13
  20. data/features/request_specs/request_spec.feature +8 -8
  21. data/features/routing_specs/be_routable_matcher.feature +10 -10
  22. data/features/routing_specs/named_routes.feature +3 -3
  23. data/features/routing_specs/route_to_matcher.feature +17 -17
  24. data/features/view_specs/inferred_controller_path.feature +7 -6
  25. data/features/view_specs/stub_template.feature +5 -5
  26. data/features/view_specs/view_spec.feature +50 -18
  27. data/lib/autotest/rails_rspec2.rb +1 -1
  28. data/lib/generators/rspec.rb +6 -0
  29. data/lib/generators/rspec/controller/templates/controller_spec.rb +2 -0
  30. data/lib/generators/rspec/helper/templates/helper_spec.rb +2 -0
  31. data/lib/generators/rspec/mailer/templates/mailer_spec.rb +2 -0
  32. data/lib/generators/rspec/model/templates/model_spec.rb +2 -0
  33. data/lib/generators/rspec/observer/templates/observer_spec.rb +2 -0
  34. data/lib/generators/rspec/scaffold/scaffold_generator.rb +37 -3
  35. data/lib/generators/rspec/scaffold/templates/controller_spec.rb +9 -7
  36. data/lib/generators/rspec/scaffold/templates/routing_spec.rb +2 -0
  37. data/lib/rspec/rails/example.rb +5 -1
  38. data/lib/rspec/rails/example/feature_example_group.rb +30 -0
  39. data/lib/rspec/rails/example/view_example_group.rb +23 -12
  40. data/lib/rspec/rails/extensions.rb +1 -0
  41. data/lib/rspec/rails/extensions/active_record/base.rb +5 -3
  42. data/lib/rspec/rails/extensions/active_record/proxy.rb +17 -0
  43. data/lib/rspec/rails/matchers/be_new_record.rb +8 -0
  44. data/lib/rspec/rails/tasks/rspec.rake +1 -2
  45. data/lib/rspec/rails/vendor/capybara.rb +2 -8
  46. data/lib/rspec/rails/version.rb +1 -1
  47. data/spec/autotest/rails_rspec2_spec.rb +4 -4
  48. data/spec/generators/rspec/model/model_generator_spec.rb +1 -1
  49. data/spec/generators/rspec/scaffold/scaffold_generator_spec.rb +8 -0
  50. data/spec/rspec/rails/example/feature_example_group_spec.rb +56 -0
  51. data/spec/rspec/rails/example/view_example_group_spec.rb +7 -1
  52. data/spec/rspec/rails/matchers/be_new_record_spec.rb +16 -2
  53. data/spec/rspec/rails/matchers/has_spec.rb +29 -0
  54. data/spec/rspec/rails/matchers/relation_match_array_spec.rb +18 -7
  55. metadata +66 -10
@@ -4,13 +4,13 @@ Feature: named routes
4
4
 
5
5
  Scenario: access named route
6
6
  Given a file named "spec/routing/widget_routes_spec.rb" with:
7
- """
7
+ """ruby
8
8
  require "spec_helper"
9
9
 
10
10
  describe "routes to the widgets controller" do
11
11
  it "routes a named route" do
12
- {:get => new_widget_path}.
13
- should route_to(:controller => "widgets", :action => "new")
12
+ expect(:get => new_widget_path).
13
+ to route_to(:controller => "widgets", :action => "new")
14
14
  end
15
15
  end
16
16
  """
@@ -4,21 +4,21 @@ Feature: route_to matcher
4
4
  It is most valuable when specifying routes other than standard RESTful
5
5
  routes.
6
6
 
7
- get("/").should route_to("welcome#index") # new in 2.6.0
7
+ expect(get("/")).to route_to("welcome#index") # new in 2.6.0
8
8
 
9
9
  or
10
10
 
11
- { :get => "/" }.should route_to(:controller => "welcome")
11
+ expect(:get => "/").to route_to(:controller => "welcome")
12
12
 
13
13
  Scenario: passing route spec with shortcut syntax
14
14
  Given a file named "spec/routing/widgets_routing_spec.rb" with:
15
- """
15
+ """ruby
16
16
  require "spec_helper"
17
17
 
18
18
  describe "routes for Widgets" do
19
19
  it "routes /widgets to the widgets controller" do
20
- get("/widgets").
21
- should route_to("widgets#index")
20
+ expect(get("/widgets")).
21
+ to route_to("widgets#index")
22
22
  end
23
23
  end
24
24
  """
@@ -28,13 +28,13 @@ Feature: route_to matcher
28
28
 
29
29
  Scenario: passing route spec with verbose syntax
30
30
  Given a file named "spec/routing/widgets_routing_spec.rb" with:
31
- """
31
+ """ruby
32
32
  require "spec_helper"
33
33
 
34
34
  describe "routes for Widgets" do
35
35
  it "routes /widgets to the widgets controller" do
36
- { :get => "/widgets" }.
37
- should route_to(:controller => "widgets", :action => "index")
36
+ expect(:get => "/widgets").
37
+ to route_to(:controller => "widgets", :action => "index")
38
38
  end
39
39
  end
40
40
  """
@@ -44,12 +44,12 @@ Feature: route_to matcher
44
44
 
45
45
  Scenario: route spec for a route that doesn't exist (fails)
46
46
  Given a file named "spec/routing/widgets_routing_spec.rb" with:
47
- """
47
+ """ruby
48
48
  require "spec_helper"
49
49
 
50
50
  describe "routes for Widgets" do
51
51
  it "routes /widgets/foo to the /foo action" do
52
- get("/widgets/foo").should route_to("widgets#foo")
52
+ expect(get("/widgets/foo")).to route_to("widgets#foo")
53
53
  end
54
54
  end
55
55
  """
@@ -59,13 +59,13 @@ Feature: route_to matcher
59
59
 
60
60
  Scenario: route spec for a namespaced route with shortcut specifier
61
61
  Given a file named "spec/routing/admin_routing_spec.rb" with:
62
- """
62
+ """ruby
63
63
  require "spec_helper"
64
64
 
65
65
  describe "routes for Widgets" do
66
66
  it "routes /admin/accounts to the admin/accounts controller" do
67
- get("/admin/accounts").
68
- should route_to("admin/accounts#index")
67
+ expect(get("/admin/accounts")).
68
+ to route_to("admin/accounts#index")
69
69
  end
70
70
  end
71
71
  """
@@ -75,16 +75,16 @@ Feature: route_to matcher
75
75
 
76
76
  Scenario: route spec for a namespaced route with verbose specifier
77
77
  Given a file named "spec/routing/admin_routing_spec.rb" with:
78
- """
78
+ """ruby
79
79
  require "spec_helper"
80
80
 
81
81
  describe "routes for Widgets" do
82
82
  it "routes /admin/accounts to the admin/accounts controller" do
83
- get("/admin/accounts").
84
- should route_to(:controller => "admin/accounts", :action => "index")
83
+ expect(get("/admin/accounts")).
84
+ to route_to(:controller => "admin/accounts", :action => "index")
85
85
  end
86
86
  end
87
87
  """
88
88
 
89
89
  When I run `rspec spec/routing/admin_routing_spec.rb`
90
- Then the examples should all pass
90
+ Then the examples should all pass
@@ -2,12 +2,13 @@ Feature: view spec infers controller path and action
2
2
 
3
3
  Scenario: infer controller path
4
4
  Given a file named "spec/views/widgets/new.html.erb_spec.rb" with:
5
- """
5
+ """ruby
6
6
  require "spec_helper"
7
7
 
8
8
  describe "widgets/new" do
9
9
  it "infers the controller path" do
10
- controller.request.path_parameters[:controller].should eq("widgets")
10
+ expect(controller.request.path_parameters[:controller]).to eq("widgets")
11
+ expect(controller.controller_path).to eq("widgets")
11
12
  end
12
13
  end
13
14
  """
@@ -16,12 +17,12 @@ Feature: view spec infers controller path and action
16
17
 
17
18
  Scenario: infer action
18
19
  Given a file named "spec/views/widgets/new.html.erb_spec.rb" with:
19
- """
20
+ """ruby
20
21
  require "spec_helper"
21
22
 
22
23
  describe "widgets/new" do
23
24
  it "infers the controller path" do
24
- controller.request.path_parameters[:action].should eq("new")
25
+ expect(controller.request.path_parameters[:action]).to eq("new")
25
26
  end
26
27
  end
27
28
  """
@@ -30,12 +31,12 @@ Feature: view spec infers controller path and action
30
31
 
31
32
  Scenario: do not infer action in a partial
32
33
  Given a file named "spec/views/widgets/_form.html.erb_spec.rb" with:
33
- """
34
+ """ruby
34
35
  require "spec_helper"
35
36
 
36
37
  describe "widgets/_form" do
37
38
  it "includes a link to new" do
38
- controller.request.path_parameters[:action].should be_nil
39
+ expect(controller.request.path_parameters[:action]).to be_nil
39
40
  end
40
41
  end
41
42
  """
@@ -5,7 +5,7 @@ Feature: stub template
5
5
 
6
6
  Scenario: stub template that does not exist
7
7
  Given a file named "spec/views/gadgets/list.html.erb_spec.rb" with:
8
- """
8
+ """ruby
9
9
  require "spec_helper"
10
10
 
11
11
  describe "gadgets/list" do
@@ -16,8 +16,8 @@ Feature: stub template
16
16
  ])
17
17
  stub_template "gadgets/_gadget.html.erb" => "<%= gadget.name %><br/>"
18
18
  render
19
- rendered.should =~ /First/
20
- rendered.should =~ /Second/
19
+ expect(rendered).to match /First/
20
+ expect(rendered).to match /Second/
21
21
  end
22
22
  end
23
23
  """
@@ -31,7 +31,7 @@ Feature: stub template
31
31
 
32
32
  Scenario: stub template that exists
33
33
  Given a file named "spec/views/gadgets/edit.html.erb_spec.rb" with:
34
- """
34
+ """ruby
35
35
  require "spec_helper"
36
36
 
37
37
  describe "gadgets/edit" do
@@ -42,7 +42,7 @@ Feature: stub template
42
42
  it "renders the form partial" do
43
43
  stub_template "gadgets/_form.html.erb" => "This content"
44
44
  render
45
- rendered.should =~ /This content/
45
+ expect(rendered).to match /This content/
46
46
  end
47
47
  end
48
48
  """
@@ -4,7 +4,7 @@ Feature: view spec
4
4
 
5
5
  Scenario: passing spec that renders the described view file
6
6
  Given a file named "spec/views/widgets/index.html.erb_spec.rb" with:
7
- """
7
+ """ruby
8
8
  require "spec_helper"
9
9
 
10
10
  describe "widgets/index" do
@@ -16,8 +16,8 @@ Feature: view spec
16
16
 
17
17
  render
18
18
 
19
- rendered.should =~ /slicer/
20
- rendered.should =~ /dicer/
19
+ expect(rendered).to match /slicer/
20
+ expect(rendered).to match /dicer/
21
21
  end
22
22
  end
23
23
  """
@@ -26,7 +26,7 @@ Feature: view spec
26
26
 
27
27
  Scenario: passing spec with before and nesting
28
28
  Given a file named "spec/views/widgets/index.html.erb_spec.rb" with:
29
- """
29
+ """ruby
30
30
  require "spec_helper"
31
31
 
32
32
  describe "widgets/index" do
@@ -42,8 +42,8 @@ Feature: view spec
42
42
  it "displays both widgets" do
43
43
  render
44
44
 
45
- rendered.should =~ /slicer/
46
- rendered.should =~ /dicer/
45
+ expect(rendered).to match /slicer/
46
+ expect(rendered).to match /dicer/
47
47
  end
48
48
  end
49
49
  end
@@ -53,7 +53,7 @@ Feature: view spec
53
53
 
54
54
  Scenario: passing spec with explicit template rendering
55
55
  Given a file named "spec/views/widgets/widget.html.erb_spec.rb" with:
56
- """
56
+ """ruby
57
57
  require "spec_helper"
58
58
 
59
59
  describe "rendering the widget template" do
@@ -62,7 +62,7 @@ Feature: view spec
62
62
 
63
63
  render :template => "widgets/widget.html.erb"
64
64
 
65
- rendered.should =~ /slicer/
65
+ expect(rendered).to match /slicer/
66
66
  end
67
67
  end
68
68
  """
@@ -73,9 +73,41 @@ Feature: view spec
73
73
  When I run `rspec spec/views`
74
74
  Then the examples should all pass
75
75
 
76
+ Scenario: passing spec with a description that includes the format and handler
77
+ Given a file named "spec/views/widgets/widget.xml.erb_spec.rb" with:
78
+ """ruby
79
+ require "spec_helper"
80
+
81
+ describe "widgets/widget.html.erb" do
82
+ it "renders the HTML template" do
83
+ render
84
+
85
+ expect(rendered).to match /HTML/
86
+ end
87
+ end
88
+
89
+ describe "widgets/widget.xml.erb" do
90
+ it "renders the XML template" do
91
+ render
92
+
93
+ expect(rendered).to match /XML/
94
+ end
95
+ end
96
+ """
97
+ And a file named "app/views/widgets/widget.html.erb" with:
98
+ """
99
+ HTML
100
+ """
101
+ And a file named "app/views/widgets/widget.xml.erb" with:
102
+ """
103
+ XML
104
+ """
105
+ When I run `rspec spec/views`
106
+ Then the examples should all pass
107
+
76
108
  Scenario: passing spec with rendering of locals in a partial
77
109
  Given a file named "spec/views/widgets/_widget.html.erb_spec.rb" with:
78
- """
110
+ """ruby
79
111
  require "spec_helper"
80
112
 
81
113
  describe "rendering locals in a partial" do
@@ -84,7 +116,7 @@ Feature: view spec
84
116
 
85
117
  render :partial => "widgets/widget.html.erb", :locals => {:widget => widget}
86
118
 
87
- rendered.should =~ /slicer/
119
+ expect(rendered).to match /slicer/
88
120
  end
89
121
  end
90
122
  """
@@ -97,7 +129,7 @@ Feature: view spec
97
129
 
98
130
  Scenario: passing spec with rendering of locals in an implicit partial
99
131
  Given a file named "spec/views/widgets/_widget.html.erb_spec.rb" with:
100
- """
132
+ """ruby
101
133
  require "spec_helper"
102
134
 
103
135
  describe "rendering locals in a partial" do
@@ -106,7 +138,7 @@ Feature: view spec
106
138
 
107
139
  render "widgets/widget", :widget => widget
108
140
 
109
- rendered.should =~ /slicer/
141
+ expect(rendered).to match /slicer/
110
142
  end
111
143
  end
112
144
  """
@@ -119,7 +151,7 @@ Feature: view spec
119
151
 
120
152
  Scenario: passing spec with rendering of text
121
153
  Given a file named "spec/views/widgets/direct.html.erb_spec.rb" with:
122
- """
154
+ """ruby
123
155
  require "spec_helper"
124
156
 
125
157
  describe "rendering text directly" do
@@ -127,7 +159,7 @@ Feature: view spec
127
159
 
128
160
  render :text => "This is directly rendered"
129
161
 
130
- rendered.should =~ /directly rendered/
162
+ expect(rendered).to match /directly rendered/
131
163
  end
132
164
  end
133
165
  """
@@ -142,7 +174,7 @@ Feature: view spec
142
174
  <%- end %>
143
175
  """
144
176
  And a file named "spec/views/secrets/index.html.erb_spec.rb" with:
145
- """
177
+ """ruby
146
178
  require 'spec_helper'
147
179
 
148
180
  describe 'secrets/index' do
@@ -152,7 +184,7 @@ Feature: view spec
152
184
 
153
185
  it 'checks for admin access' do
154
186
  render
155
- rendered.should =~ /Secret admin area/
187
+ expect(rendered).to match /Secret admin area/
156
188
  end
157
189
  end
158
190
  """
@@ -161,12 +193,12 @@ Feature: view spec
161
193
 
162
194
  Scenario: request.path_parameters should match Rails by using symbols for keys
163
195
  Given a file named "spec/views/widgets/index.html.erb_spec.rb" with:
164
- """
196
+ """ruby
165
197
  require "spec_helper"
166
198
 
167
199
  describe "controller.request.path_parameters" do
168
200
  it "matches the Rails environment by using symbols for keys" do
169
- [:controller, :action].each { |k| controller.request.path_parameters.keys.should include(k) }
201
+ [:controller, :action].each { |k| expect(controller.request.path_parameters.keys).to include(k) }
170
202
  end
171
203
  end
172
204
  """
@@ -33,7 +33,7 @@ class Autotest::RailsRspec2 < Autotest::Rspec2
33
33
  end
34
34
 
35
35
  def setup_rails_rspec2_mappings
36
- %w{config/ coverage/ db/ doc/ log/ public/ script/ tmp/ vendor/rails vendor/plugins vendor/gems}.each do |exception|
36
+ %w{coverage/ db/ doc/ log/ public/ script/ tmp/ vendor/rails vendor/plugins vendor/gems}.each do |exception|
37
37
  add_exception(/^([\.\/]*)?#{exception}/)
38
38
  end
39
39
 
@@ -6,6 +6,12 @@ module Rspec
6
6
  def self.source_root
7
7
  @_rspec_source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'rspec', generator_name, 'templates'))
8
8
  end
9
+
10
+ if ::Rails.version < '3.1'
11
+ def module_namespacing
12
+ yield if block_given?
13
+ end
14
+ end
9
15
  end
10
16
  end
11
17
  end
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
+ <% module_namespacing do -%>
3
4
  describe <%= class_name %>Controller do
4
5
 
5
6
  <% for action in actions -%>
@@ -12,3 +13,4 @@ describe <%= class_name %>Controller do
12
13
 
13
14
  <% end -%>
14
15
  end
16
+ <% end -%>
@@ -10,6 +10,8 @@ require 'spec_helper'
10
10
  # end
11
11
  # end
12
12
  # end
13
+ <% module_namespacing do -%>
13
14
  describe <%= class_name %>Helper do
14
15
  pending "add some examples to (or delete) #{__FILE__}"
15
16
  end
17
+ <% end -%>
@@ -1,5 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
+ <% module_namespacing do -%>
3
4
  describe <%= class_name %> do
4
5
  <% for action in actions -%>
5
6
  describe "<%= action %>" do
@@ -21,3 +22,4 @@ describe <%= class_name %> do
21
22
  pending "add some examples to (or delete) #{__FILE__}"
22
23
  <% end -%>
23
24
  end
25
+ <% end -%>
@@ -1,5 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
+ <% module_namespacing do -%>
3
4
  describe <%= class_name %> do
4
5
  pending "add some examples to (or delete) #{__FILE__}"
5
6
  end
7
+ <% end -%>
@@ -1,5 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
+ <% module_namespacing do -%>
3
4
  describe <%= class_name %>Observer do
4
5
  pending "add some examples to (or delete) #{__FILE__}"
5
6
  end
7
+ <% end -%>
@@ -57,8 +57,42 @@ module Rspec
57
57
  File.join("spec/views", controller_file_path, "#{view}.html.#{options[:template_engine]}_spec.rb")
58
58
  end
59
59
 
60
- def params
61
- "{'these' => 'params'}"
60
+ def example_valid_attributes
61
+ # Only take the first attribute so this hash does not become unweildy and large in the
62
+ # generated controller spec. It is the responsibility of the user to keep the the valid
63
+ # attributes method up-to-date as they add validations.
64
+ @example_valid_attributes ||=
65
+ if attributes.any?
66
+ { attributes.first.name => attributes.first.default.to_s }
67
+ else
68
+ { }
69
+ end
70
+ end
71
+
72
+ def example_invalid_attributes
73
+ @example_invalid_attributes ||=
74
+ if attributes.any?
75
+ { attributes.first.name => "invalid value" }
76
+ else
77
+ { }
78
+ end
79
+ end
80
+
81
+ def example_params_for_update
82
+ @example_params_for_update ||=
83
+ if example_valid_attributes.any?
84
+ example_valid_attributes
85
+ else
86
+ { "these" => "params" }
87
+ end
88
+ end
89
+
90
+ def formatted_hash(hash)
91
+ formatted = hash.inspect
92
+ formatted.gsub!("{", "{ ")
93
+ formatted.gsub!("}", " }")
94
+ formatted.gsub!("=>", " => ")
95
+ formatted
62
96
  end
63
97
 
64
98
  # support for namespaced-resources
@@ -73,7 +107,7 @@ module Rspec
73
107
 
74
108
  def ns_parts
75
109
  @ns_parts ||= begin
76
- matches = ARGV[0].to_s.match(/\A(\w+)\/(\w+)/)
110
+ matches = ARGV[0].to_s.match(/\A(\w+)(?:\/|::)(\w+)/)
77
111
  matches ? [matches[1], matches[2]] : []
78
112
  end
79
113
  end