richzhou-rspec-rails 1.3.4

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 (170) hide show
  1. data/.document +7 -0
  2. data/.gitignore +8 -0
  3. data/Contribute.rdoc +4 -0
  4. data/Gemfile +4 -0
  5. data/History.rdoc +321 -0
  6. data/License.txt +33 -0
  7. data/Manifest.txt +165 -0
  8. data/README.rdoc +48 -0
  9. data/Rakefile +12 -0
  10. data/TODO.txt +17 -0
  11. data/Upgrade.rdoc +148 -0
  12. data/generators/integration_spec/integration_spec_generator.rb +10 -0
  13. data/generators/integration_spec/templates/integration_spec.rb +4 -0
  14. data/generators/rspec/CHANGES +1 -0
  15. data/generators/rspec/rspec_generator.rb +72 -0
  16. data/generators/rspec/templates/previous_failures.txt +0 -0
  17. data/generators/rspec/templates/rcov.opts +2 -0
  18. data/generators/rspec/templates/rspec.rake +146 -0
  19. data/generators/rspec/templates/script/autospec +6 -0
  20. data/generators/rspec/templates/script/spec +10 -0
  21. data/generators/rspec/templates/spec.opts +4 -0
  22. data/generators/rspec/templates/spec_helper.rb +54 -0
  23. data/generators/rspec_controller/USAGE +33 -0
  24. data/generators/rspec_controller/rspec_controller_generator.rb +47 -0
  25. data/generators/rspec_controller/templates/controller_spec.rb +25 -0
  26. data/generators/rspec_controller/templates/helper_spec.rb +11 -0
  27. data/generators/rspec_controller/templates/view_spec.rb +12 -0
  28. data/generators/rspec_default_values.rb +28 -0
  29. data/generators/rspec_model/USAGE +18 -0
  30. data/generators/rspec_model/rspec_model_generator.rb +35 -0
  31. data/generators/rspec_model/templates/model_spec.rb +13 -0
  32. data/generators/rspec_scaffold/rspec_scaffold_generator.rb +154 -0
  33. data/generators/rspec_scaffold/templates/controller_spec.rb +131 -0
  34. data/generators/rspec_scaffold/templates/edit_erb_spec.rb +25 -0
  35. data/generators/rspec_scaffold/templates/helper_spec.rb +11 -0
  36. data/generators/rspec_scaffold/templates/index_erb_spec.rb +27 -0
  37. data/generators/rspec_scaffold/templates/new_erb_spec.rb +25 -0
  38. data/generators/rspec_scaffold/templates/routing_spec.rb +33 -0
  39. data/generators/rspec_scaffold/templates/show_erb_spec.rb +22 -0
  40. data/init.rb +9 -0
  41. data/lib/autotest/discover.rb +5 -0
  42. data/lib/autotest/rails_rspec.rb +76 -0
  43. data/lib/spec/rails.rb +26 -0
  44. data/lib/spec/rails/example.rb +48 -0
  45. data/lib/spec/rails/example/assigns_hash_proxy.rb +39 -0
  46. data/lib/spec/rails/example/controller_example_group.rb +285 -0
  47. data/lib/spec/rails/example/cookies_proxy.rb +29 -0
  48. data/lib/spec/rails/example/functional_example_group.rb +106 -0
  49. data/lib/spec/rails/example/helper_example_group.rb +153 -0
  50. data/lib/spec/rails/example/integration_example_group.rb +16 -0
  51. data/lib/spec/rails/example/model_example_group.rb +15 -0
  52. data/lib/spec/rails/example/render_observer.rb +82 -0
  53. data/lib/spec/rails/example/routing_example_group.rb +16 -0
  54. data/lib/spec/rails/example/routing_helpers.rb +66 -0
  55. data/lib/spec/rails/example/view_example_group.rb +203 -0
  56. data/lib/spec/rails/extensions.rb +11 -0
  57. data/lib/spec/rails/extensions/action_controller/rescue.rb +42 -0
  58. data/lib/spec/rails/extensions/action_controller/test_case.rb +16 -0
  59. data/lib/spec/rails/extensions/action_controller/test_response.rb +21 -0
  60. data/lib/spec/rails/extensions/action_view/base.rb +35 -0
  61. data/lib/spec/rails/extensions/active_record/base.rb +45 -0
  62. data/lib/spec/rails/extensions/active_support/test_case.rb +7 -0
  63. data/lib/spec/rails/extensions/spec/matchers/have.rb +23 -0
  64. data/lib/spec/rails/extensions/spec/runner/configuration.rb +45 -0
  65. data/lib/spec/rails/interop/testcase.rb +14 -0
  66. data/lib/spec/rails/matchers.rb +32 -0
  67. data/lib/spec/rails/matchers/ar_be_valid.rb +27 -0
  68. data/lib/spec/rails/matchers/assert_select.rb +180 -0
  69. data/lib/spec/rails/matchers/change.rb +13 -0
  70. data/lib/spec/rails/matchers/have_text.rb +57 -0
  71. data/lib/spec/rails/matchers/include_text.rb +54 -0
  72. data/lib/spec/rails/matchers/redirect_to.rb +126 -0
  73. data/lib/spec/rails/matchers/render_template.rb +129 -0
  74. data/lib/spec/rails/matchers/route_to.rb +149 -0
  75. data/lib/spec/rails/mocks.rb +140 -0
  76. data/lib/spec/rails/version.rb +16 -0
  77. data/rspec-rails.gemspec +25 -0
  78. data/spec/autotest/mappings_spec.rb +86 -0
  79. data/spec/rails_suite.rb +7 -0
  80. data/spec/resources/controllers/action_view_base_spec_controller.rb +2 -0
  81. data/spec/resources/controllers/application.rb +9 -0
  82. data/spec/resources/controllers/controller_spec_controller.rb +127 -0
  83. data/spec/resources/controllers/example.txt +1 -0
  84. data/spec/resources/controllers/redirect_spec_controller.rb +70 -0
  85. data/spec/resources/controllers/render_spec_controller.rb +34 -0
  86. data/spec/resources/controllers/rjs_spec_controller.rb +58 -0
  87. data/spec/resources/helpers/addition_helper.rb +5 -0
  88. data/spec/resources/helpers/explicit_helper.rb +46 -0
  89. data/spec/resources/helpers/more_explicit_helper.rb +5 -0
  90. data/spec/resources/helpers/plugin_application_helper.rb +6 -0
  91. data/spec/resources/helpers/view_spec_helper.rb +13 -0
  92. data/spec/resources/models/animal.rb +4 -0
  93. data/spec/resources/models/person.rb +18 -0
  94. data/spec/resources/models/thing.rb +3 -0
  95. data/spec/resources/views/controller_spec/_partial.html.erb +0 -0
  96. data/spec/resources/views/controller_spec/action_setting_flash_after_session_reset.html.erb +1 -0
  97. data/spec/resources/views/controller_spec/action_setting_flash_before_session_reset.html.erb +1 -0
  98. data/spec/resources/views/controller_spec/action_setting_the_assigns_hash.html.erb +0 -0
  99. data/spec/resources/views/controller_spec/action_with_errors_in_template.html.erb +1 -0
  100. data/spec/resources/views/controller_spec/action_with_template.html.erb +1 -0
  101. data/spec/resources/views/controller_spec/non_existent_action_with_existent_template.html.erb +1 -0
  102. data/spec/resources/views/layouts/application.html.erb +0 -0
  103. data/spec/resources/views/layouts/simple.html.erb +0 -0
  104. data/spec/resources/views/objects/_object.html.erb +1 -0
  105. data/spec/resources/views/render_spec/_a_partial.html.erb +0 -0
  106. data/spec/resources/views/render_spec/action_with_alternate_layout.html.erb +0 -0
  107. data/spec/resources/views/render_spec/some_action.html.erb +0 -0
  108. data/spec/resources/views/render_spec/some_action.js.rjs +1 -0
  109. data/spec/resources/views/rjs_spec/_replacement_partial.html.erb +1 -0
  110. data/spec/resources/views/rjs_spec/hide_div.js.rjs +1 -0
  111. data/spec/resources/views/rjs_spec/hide_page_element.js.rjs +1 -0
  112. data/spec/resources/views/rjs_spec/insert_html.js.rjs +1 -0
  113. data/spec/resources/views/rjs_spec/replace.js.rjs +1 -0
  114. data/spec/resources/views/rjs_spec/replace_html.js.rjs +1 -0
  115. data/spec/resources/views/rjs_spec/replace_html_with_partial.js.rjs +1 -0
  116. data/spec/resources/views/rjs_spec/visual_effect.js.rjs +1 -0
  117. data/spec/resources/views/rjs_spec/visual_toggle_effect.js.rjs +1 -0
  118. data/spec/resources/views/tag_spec/no_tags.html.erb +1 -0
  119. data/spec/resources/views/tag_spec/single_div_with_no_attributes.html.erb +1 -0
  120. data/spec/resources/views/tag_spec/single_div_with_one_attribute.html.erb +1 -0
  121. data/spec/resources/views/view_spec/_partial.html.erb +2 -0
  122. data/spec/resources/views/view_spec/_partial_used_twice.html.erb +0 -0
  123. data/spec/resources/views/view_spec/_partial_with_local_variable.html.erb +1 -0
  124. data/spec/resources/views/view_spec/_partial_with_sub_partial.html.erb +1 -0
  125. data/spec/resources/views/view_spec/_spacer.html.erb +1 -0
  126. data/spec/resources/views/view_spec/accessor.html.erb +6 -0
  127. data/spec/resources/views/view_spec/block_helper.html.erb +3 -0
  128. data/spec/resources/views/view_spec/entry_form.html.erb +2 -0
  129. data/spec/resources/views/view_spec/explicit_helper.html.erb +2 -0
  130. data/spec/resources/views/view_spec/foo/show.html.erb +1 -0
  131. data/spec/resources/views/view_spec/implicit_helper.html.erb +2 -0
  132. data/spec/resources/views/view_spec/multiple_helpers.html.erb +3 -0
  133. data/spec/resources/views/view_spec/path_params.html.erb +1 -0
  134. data/spec/resources/views/view_spec/should_not_receive.html.erb +3 -0
  135. data/spec/resources/views/view_spec/template_with_partial.html.erb +5 -0
  136. data/spec/resources/views/view_spec/template_with_partial_using_collection.html.erb +3 -0
  137. data/spec/resources/views/view_spec/template_with_partial_with_array.html.erb +1 -0
  138. data/spec/resources/views/view_spec/view_helpers.html.erb +1 -0
  139. data/spec/spec/rails/example/assigns_hash_proxy_spec.rb +109 -0
  140. data/spec/spec/rails/example/configuration_spec.rb +67 -0
  141. data/spec/spec/rails/example/controller_example_group_spec.rb +307 -0
  142. data/spec/spec/rails/example/controller_isolation_spec.rb +75 -0
  143. data/spec/spec/rails/example/cookies_proxy_spec.rb +87 -0
  144. data/spec/spec/rails/example/error_handling_spec.rb +90 -0
  145. data/spec/spec/rails/example/example_group_factory_spec.rb +112 -0
  146. data/spec/spec/rails/example/helper_example_group_spec.rb +247 -0
  147. data/spec/spec/rails/example/model_example_group_spec.rb +32 -0
  148. data/spec/spec/rails/example/routing_example_group_spec.rb +9 -0
  149. data/spec/spec/rails/example/shared_routing_example_group_examples.rb +241 -0
  150. data/spec/spec/rails/example/test_unit_assertion_accessibility_spec.rb +33 -0
  151. data/spec/spec/rails/example/view_example_group_spec.rb +346 -0
  152. data/spec/spec/rails/extensions/action_view_base_spec.rb +79 -0
  153. data/spec/spec/rails/extensions/active_record_spec.rb +14 -0
  154. data/spec/spec/rails/interop/testcase_spec.rb +70 -0
  155. data/spec/spec/rails/matchers/ar_be_valid_spec.rb +19 -0
  156. data/spec/spec/rails/matchers/assert_select_spec.rb +835 -0
  157. data/spec/spec/rails/matchers/errors_on_spec.rb +37 -0
  158. data/spec/spec/rails/matchers/have_text_spec.rb +69 -0
  159. data/spec/spec/rails/matchers/include_text_spec.rb +62 -0
  160. data/spec/spec/rails/matchers/redirect_to_spec.rb +253 -0
  161. data/spec/spec/rails/matchers/render_template_spec.rb +208 -0
  162. data/spec/spec/rails/matchers/should_change_spec.rb +15 -0
  163. data/spec/spec/rails/mocks/ar_classes.rb +10 -0
  164. data/spec/spec/rails/mocks/mock_model_spec.rb +112 -0
  165. data/spec/spec/rails/mocks/stub_model_spec.rb +80 -0
  166. data/spec/spec/rails/sample_modified_fixture.rb +8 -0
  167. data/spec/spec/rails/sample_spec.rb +8 -0
  168. data/spec/spec/rails/spec_spec.rb +11 -0
  169. data/spec/spec_helper.rb +78 -0
  170. metadata +363 -0
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ module Spec
4
+ module Rails
5
+ module Example
6
+ describe ModelExampleGroup do
7
+ accesses_configured_helper_methods
8
+
9
+ if defined?(ActiveRecord::TestCase)
10
+ it "derives from ActiveRecord::TestCase" do
11
+ group = describe("foo", :type => :model) do; end
12
+ group.ancestors.should include(ActiveRecord::TestCase)
13
+ end
14
+ else
15
+ it "derives from ActiveSupport::TestCase" do
16
+ group = describe("foo", :type => :model) do; end
17
+ group.ancestors.should include(ActiveSupport::TestCase)
18
+ end
19
+ end
20
+
21
+ it "clears its name from the description" do
22
+ group = describe("foo", :type => :model) do
23
+ $nested_group = describe("bar") do
24
+ end
25
+ end
26
+ group.description.to_s.should == "foo"
27
+ $nested_group.description.to_s.should == "foo bar"
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+ require 'controller_spec_controller'
3
+ require File.join(File.dirname(__FILE__), "/shared_routing_example_group_examples.rb")
4
+
5
+ describe "Routing Examples", :type => :routing do
6
+ it_should_behave_like "a routing example"
7
+ it_should_behave_like "a be routable spec"
8
+ it_should_behave_like "a route to spec"
9
+ end
@@ -0,0 +1,241 @@
1
+ class CustomRouteSpecController < ActionController::Base; end
2
+ class RspecOnRailsSpecsController < ActionController::Base; end
3
+
4
+ shared_examples_for "a routing example" do
5
+ describe "using backward compatible route_for()" do
6
+ it "translates GET-only paths to be explicit" do
7
+ self.should_receive(:assert_routing).with(hash_including(:method => :get), anything, {}, anything)
8
+ route_for(:controller => "controller_spec", :action => "some_action").
9
+ should == "/controller_spec/some_action"
10
+ end
11
+
12
+ it "uses assert_routing to specify that the :controller and :action are involved" do
13
+ @route = { :controller => "controller_spec", :action => "some_action" }
14
+ self.should_receive(:assert_routing).with(anything, @route, {}, anything)
15
+ route_for(@route).
16
+ should == "/controller_spec/some_action"
17
+ end
18
+
19
+ it "passes extra args through to assert_routing" do
20
+ @route = { :controller => "controller_spec", :action => "some_action" }
21
+ self.should_receive(:assert_routing).with(anything, anything, {}, { :a => "1", :b => "2" } )
22
+ route_for(@route).
23
+ should == "/controller_spec/some_action?a=1&b=2"
24
+ end
25
+
26
+ it "passes with an existing route" do
27
+ route_for(:controller => "controller_spec", :action => "some_action").
28
+ should == "/controller_spec/some_action"
29
+ end
30
+
31
+ it "passes with an existing route with additional parameters" do
32
+ route_for(:controller => "controller_spec", :action => "some_action", :param => '1').
33
+ should == "/controller_spec/some_action?param=1"
34
+ end
35
+
36
+ it "recognizes routes with methods besides :get" do
37
+ should_receive(:assert_routing).with(hash_including(:method => :put), anything, {}, anything)
38
+
39
+ route_for(:controller => "rspec_on_rails_specs", :action => "update", :id => "37").
40
+ should == {:path => "/rspec_on_rails_specs/37", :method => :put}
41
+ end
42
+
43
+ describe "failing due to bad path:" do
44
+ it "raises routing error and suggests should_not be_routeable()" do
45
+ lambda {
46
+ route_for(:controller => "rspec_on_rails_specs", :action => "nonexistent", :id => "37") ==
47
+ {:path => "/rspec_on_rails_specs/bad_route/37", :method => :put}
48
+ }.should raise_error( ActionController::RoutingError, /suggest.*should_not be_routable/ )
49
+ end
50
+ end
51
+
52
+ describe "failing due to params mismatch:" do
53
+ it "re-raises assertion and suggests should_not be_routeable()" do
54
+ lambda {
55
+ route_for(:controller => "rspec_on_rails_specs", :action => "nonexistent", :id => "37") ==
56
+ {:path => "/rspec_on_rails_specs/37", :method => :put}
57
+ }.should raise_error( ::Test::Unit::AssertionFailedError, /suggest.*should_not be_routable/ )
58
+ end
59
+ end
60
+
61
+ describe "failing due to wrong HTTP method" do
62
+ it "raises method error and suggest should_not be_routable()" do
63
+ lambda {
64
+ route_for(:controller => "rspec_on_rails_specs", :action => "update", :id => "37").
65
+ should == {:path => "/rspec_on_rails_specs/37", :method => :post}
66
+ }.should raise_error(ActionController::MethodNotAllowed) { |error| error.should_not =~ /should_not be_routable/ }
67
+ end
68
+ end
69
+
70
+ it "generates params for custom routes" do
71
+ # redundant, deprecated
72
+ params_from(:get, '/custom_route').
73
+ should == {:controller => "custom_route_spec", :action => "custom_route"}
74
+ end
75
+
76
+ it "generates params for existing routes" do
77
+ # redundant, deprecated
78
+ params_from(:get, '/controller_spec/some_action').
79
+ should == {:controller => "controller_spec", :action => "some_action"}
80
+ end
81
+
82
+ it "generates params for existing routes with a query parameters" do
83
+ # redundant, deprecated
84
+ params_from(:get, '/controller_spec/some_action?param=1').
85
+ should == {:controller => "controller_spec", :action => "some_action", :param => '1'}
86
+ end
87
+
88
+ it "generates params for existing routes with multiple query parameters" do
89
+ # redundant, deprecated
90
+ params_from(:get, '/controller_spec/some_action?param1=1&param2=2').
91
+ should == {:controller => "controller_spec", :action => "some_action", :param1 => '1', :param2 => '2' }
92
+ end
93
+ end
94
+ end
95
+
96
+ shared_examples_for "a be routable spec" do
97
+ describe "using should_not be_routable()" do
98
+ it "passes for a bad route" do
99
+ { :put => "/rspec_on_rails_specs/bad_route/37" }.
100
+ should_not be_routable
101
+ end
102
+ it "passes for a bad route having an arg" do
103
+ { :put => "/rspec_on_rails_specs/bad_route/37?some_arg=1" }.
104
+ should_not be_routable
105
+ end
106
+ describe "when assert_recognizes throws exceptions:" do
107
+ [ ActionController::RoutingError, ActionController::MethodNotAllowed ].each do |e|
108
+ it "passes on #{e}" do
109
+ self.stub!( :assert_recognizes ).and_return { raise e, "stubbed exception" }
110
+ { :get => "/rspec_on_rails_spec/bad_route/37" }.should_not be_routable
111
+ end
112
+ it "should be_routable on usual Test::Unit::AssertionFailedError" do
113
+ # <{}> is predictable because of the way we call assert_recognizes during be_routable().
114
+ self.stub!( :assert_recognizes ).and_return { raise ::Test::Unit::AssertionFailedError, "<{a}> did not match <{}>" }
115
+ { :get => "/rspec_on_rails_spec/arguably_bad_route" }.should be_routable
116
+ end
117
+ it "should be_routable even when Test::Unit::AssertionFailedError has line breaks in the message" do
118
+ self.stub!( :assert_recognizes ).and_return { raise ::Test::Unit::AssertionFailedError, "<{a => b,\nc => d}> did not match <{}>" }
119
+ { :get => "/rspec_on_rails_spec/arguably_bad_route" }.should be_routable
120
+ end
121
+ it "should re-raise on unusual Test::Unit::AssertionFailedError" do
122
+ self.stub!( :assert_recognizes ).and_return { raise ::Test::Unit::AssertionFailedError, "some other message" }
123
+ expect { { :get => "/rspec_on_rails_spec/weird_case_route/" }.should be_routable }.
124
+ to raise_error
125
+ end
126
+ end
127
+ end
128
+ it "test should be_routable" do
129
+ { :get => "/custom_route" }.
130
+ should be_routable
131
+ end
132
+
133
+ it "recommends route_to() on failure with should()" do
134
+ lambda {
135
+ { :get => "/nonexisting_route" }.
136
+ should be_routable
137
+ }.should raise_error( /route_to\(/)
138
+ end
139
+
140
+ it "shows actual route that was generated on failure with should_not()" do
141
+ begin
142
+ { :get => "/custom_route" }.should_not be_routable
143
+ rescue Exception => e
144
+ ensure
145
+ # Different versions of ruby order these differently
146
+ e.message.should =~ /"action"=>"custom_route"/
147
+ e.message.should =~ /"controller"=>"custom_route_spec"/
148
+ end
149
+ end
150
+
151
+ it "works with routeable (alternate spelling)" do
152
+ { :put => "/nonexisting_route" }.
153
+ should_not be_routeable
154
+ end
155
+ end
156
+ end
157
+
158
+ shared_examples_for "a route to spec" do
159
+ describe "using should[_not] route_to()" do
160
+ it "supports existing routes" do
161
+ { :get => "/controller_spec/some_action" }.
162
+ should route_to( :controller => "controller_spec", :action => "some_action" )
163
+ end
164
+
165
+ it "translates GET-only paths to be explicit, when matching against a string (for parity with route_for().should == '/path')" do
166
+ self.should_receive(:assert_routing).with(hash_including(:method => :get), anything, {}, anything)
167
+ "/controller_spec/some_action".
168
+ should route_to({})
169
+ end
170
+
171
+ it "asserts, using assert_routing, that the :controller and :action are involved" do
172
+ @route = { :controller => "controller_spec", :action => "some_action" }
173
+ self.should_receive(:assert_routing).with(anything, @route, {}, anything)
174
+ "/controller_spec/some_action".
175
+ should route_to(@route)
176
+ end
177
+
178
+ it "sends extra args through" do
179
+ @route = { :controller => "controller_spec", :action => "some_action" }
180
+ self.should_receive(:assert_routing).with(anything, anything, {}, { :a => "1", :b => "2" } )
181
+ "/controller_spec/some_action?a=1&b=2".
182
+ should route_to( @route )
183
+ end
184
+
185
+ it "supports routes with additional parameters" do
186
+ { :get => "/controller_spec/some_action?param=1" }.
187
+ should route_to( :controller => "controller_spec", :action => "some_action", :param => '1' )
188
+ end
189
+
190
+ it "recognizes routes with methods besides :get" do
191
+ self.should_receive(:assert_routing).with(hash_including(:method => :put), anything, {}, anything)
192
+ { :put => "/rspec_on_rails_specs/37" }.
193
+ should route_to(:controller => "rspec_on_rails_specs", :action => "update", :id => "37")
194
+ end
195
+
196
+ it "allows only one key/value in the path - :method => path" do
197
+ lambda {
198
+ { :a => "b" ,:c => "d" }.
199
+ should route_to("anything")
200
+ }.should raise_error( ArgumentError, /usage/ )
201
+ end
202
+
203
+ describe "failing due to bad path" do
204
+ it "raises routing error, and suggests should_not be_routeable()" do
205
+ lambda {
206
+ { :put => "/rspec_on_rails_specs/nonexistent/37" }.
207
+ should route_to(:controller => "rspec_on_rails_specs", :action => "nonexistent", :id => "37")
208
+ }.should raise_error( ActionController::RoutingError, /suggest.*nonexistent.*should_not be_routable/ )
209
+ end
210
+ end
211
+
212
+ describe "failing due to params mismatch" do
213
+ it "raises assertion, and suggests should_not be_routeable()" do
214
+ lambda {
215
+ { :put => "/rspec_on_rails_specs/37" }.
216
+ should route_to(:controller => "rspec_on_rails_specs", :action => "nonexistent", :id => "37")
217
+ }.should raise_error( ::Test::Unit::AssertionFailedError, /suggest.*rspec_on_rails_specs\/37.*should_not be_routable/ )
218
+ end
219
+ end
220
+
221
+ describe "passing when expected failure" do
222
+ it "suggests should_not be_routable()" do
223
+ self.stub!(:assert_routing).and_return true
224
+ lambda {
225
+ { :put => "/rspec_on_rails_specs/37" }.
226
+ should_not route_to(:controller => "rspec_on_rails_specs", :action => "update", :id => "37")
227
+ }.should raise_error( /expected a routing error.*be_routable/im )
228
+ end
229
+ end
230
+
231
+ describe "failing due to wrong HTTP method" do
232
+ it "raises method error and suggests should_not be_routable()" do
233
+ self.stub!(:assert_routing) { raise ActionController::MethodNotAllowed }
234
+ lambda {
235
+ { :post => "/rspec_on_rails_specs/37" }.
236
+ should route_to(:controller => "rspec_on_rails_specs", :action => "update", :id => "37" )
237
+ }.should raise_error(ActionController::MethodNotAllowed, /rspec_on_rails_specs\/37.*should_not be_routable/ )
238
+ end
239
+ end
240
+ end
241
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe "assert_equal", :shared => true do
4
+ it "like assert_equal" do
5
+ assert_equal 1, 1
6
+ lambda {
7
+ assert_equal 1, 2
8
+ }.should raise_error(::Test::Unit::AssertionFailedError)
9
+ end
10
+ end
11
+
12
+ describe "A model spec should be able to access 'test/unit' assertions", :type => :model do
13
+ it_should_behave_like "assert_equal"
14
+ end
15
+
16
+ describe "A view spec should be able to access 'test/unit' assertions", :type => :view do
17
+ it_should_behave_like "assert_equal"
18
+ end
19
+
20
+ describe "A helper spec should be able to access 'test/unit' assertions", :type => :helper do
21
+ it_should_behave_like "assert_equal"
22
+ end
23
+
24
+ describe "A controller spec with integrated views should be able to access 'test/unit' assertions", :type => :controller do
25
+ controller_name :controller_spec
26
+ integrate_views
27
+ it_should_behave_like "assert_equal"
28
+ end
29
+
30
+ describe "A controller spec should be able to access 'test/unit' assertions", :type => :controller do
31
+ controller_name :controller_spec
32
+ it_should_behave_like "assert_equal"
33
+ end
@@ -0,0 +1,346 @@
1
+ require 'spec_helper'
2
+
3
+ describe "A template with an implicit helper", :type => :view do
4
+ before(:each) do
5
+ render "view_spec/implicit_helper"
6
+ end
7
+
8
+ accesses_configured_helper_methods
9
+
10
+ it "should include the helper" do
11
+ response.should have_tag('div', :content => "This is text from a method in the ViewSpecHelper")
12
+ end
13
+
14
+ it "should include the application helper" do
15
+ response.should have_tag('div', :content => "This is text from a method in the ApplicationHelper")
16
+ end
17
+
18
+ it "should have access to named routes" do
19
+ rspec_on_rails_specs_url.should == "http://test.host/rspec_on_rails_specs"
20
+ rspec_on_rails_specs_path.should == "/rspec_on_rails_specs"
21
+ end
22
+ end
23
+
24
+ describe "A template requiring an explicit helper", :type => :view do
25
+ before(:each) do
26
+ render "view_spec/explicit_helper", :helper => 'explicit'
27
+ end
28
+
29
+ it "should include the helper if specified" do
30
+ response.should have_tag('div', :content => "This is text from a method in the ExplicitHelper")
31
+ end
32
+
33
+ it "should include the application helper" do
34
+ response.should have_tag('div', :content => "This is text from a method in the ApplicationHelper")
35
+ end
36
+ end
37
+
38
+ describe "A template requiring multiple explicit helpers", :type => :view do
39
+ before(:each) do
40
+ render "view_spec/multiple_helpers", :helpers => ['explicit', 'more_explicit']
41
+ end
42
+
43
+ it "should include all specified helpers" do
44
+ response.should have_tag('div', :content => "This is text from a method in the ExplicitHelper")
45
+ response.should have_tag('div', :content => "This is text from a method in the MoreExplicitHelper")
46
+ end
47
+
48
+ it "should include the application helper" do
49
+ response.should have_tag('div', :content => "This is text from a method in the ApplicationHelper")
50
+ end
51
+ end
52
+
53
+ describe "Message Expectations on helper methods", :type => :view do
54
+ it "should work" do
55
+ template.should_receive(:method_in_plugin_application_helper).and_return('alternate message 1')
56
+ render "view_spec/implicit_helper"
57
+ response.body.should =~ /alternate message 1/
58
+ end
59
+
60
+ it "should work twice" do
61
+ template.should_receive(:method_in_plugin_application_helper).and_return('alternate message 2')
62
+ render "view_spec/implicit_helper"
63
+ response.body.should =~ /alternate message 2/
64
+ end
65
+ end
66
+
67
+ describe "A template that includes a partial", :type => :view do
68
+ def render!
69
+ render "view_spec/template_with_partial"
70
+ end
71
+
72
+ it "should render the enclosing template" do
73
+ render!
74
+ response.should have_tag('div', "method_in_partial in ViewSpecHelper")
75
+ end
76
+
77
+ it "should render the partial" do
78
+ render!
79
+ response.should have_tag('div', "method_in_template_with_partial in ViewSpecHelper")
80
+ end
81
+
82
+ it "should include the application helper" do
83
+ render!
84
+ response.should have_tag('div', "This is text from a method in the ApplicationHelper")
85
+ end
86
+
87
+ it "should pass should_receive(:render) with the right partial" do
88
+ template.should_receive(:render).with(:partial => 'partial')
89
+ render!
90
+ template.verify_rendered
91
+ end
92
+
93
+ it "should fail should_receive(:render) with the wrong partial" do
94
+ template.should_receive(:render).with(:partial => 'non_existent')
95
+ render!
96
+ begin
97
+ template.verify_rendered
98
+ rescue Spec::Mocks::MockExpectationError => e
99
+ ensure
100
+ e.backtrace.find{|line| line =~ /#{__FILE__}\:#{__LINE__ - 6}/}.should_not be_nil
101
+ end
102
+ end
103
+
104
+ it "should pass should_receive(:render) when a partial is expected twice and happens twice" do
105
+ template.should_receive(:render).with(:partial => 'partial_used_twice').twice
106
+ render!
107
+ template.verify_rendered
108
+ end
109
+
110
+ it "should pass should_receive(:render) when a partial is expected once and happens twice" do
111
+ template.should_receive(:render).with(:partial => 'partial_used_twice')
112
+ render!
113
+ begin
114
+ template.verify_rendered
115
+ rescue Spec::Mocks::MockExpectationError => e
116
+ ensure
117
+ e.backtrace.find{|line| line =~ /#{__FILE__}\:#{__LINE__ - 6}/}.should_not be_nil
118
+ end
119
+ end
120
+
121
+ it "should fail should_receive(:render) with the right partial but wrong options" do
122
+ template.should_receive(:render).with(:partial => 'partial', :locals => {:thing => Object.new})
123
+ render!
124
+ lambda {template.verify_rendered}.should raise_error(Spec::Mocks::MockExpectationError)
125
+ end
126
+ end
127
+
128
+ describe "A partial that includes a partial", :type => :view do
129
+ it "should support should_receive(:render) with nested partial" do
130
+ obj = Object.new
131
+ template.should_receive(:render).with(:partial => 'partial', :object => obj)
132
+ render :partial => "view_spec/partial_with_sub_partial", :locals => { :partial => obj }
133
+ end
134
+ end
135
+
136
+ describe "A view that includes a partial using :collection and :spacer_template", :type => :view do
137
+ it "should render the partial w/ spacer_tamplate" do
138
+ render "view_spec/template_with_partial_using_collection"
139
+ response.should have_tag('div',/method_in_partial/)
140
+ response.should have_tag('div',/ApplicationHelper/)
141
+ response.should have_tag('div',/ViewSpecHelper/)
142
+ response.should have_tag('hr#spacer')
143
+ end
144
+
145
+ it "should render the partial" do
146
+ template.should_receive(:render).with(:partial => 'partial',
147
+ :collection => ['Alice', 'Bob'],
148
+ :spacer_template => 'spacer')
149
+ render "view_spec/template_with_partial_using_collection"
150
+ end
151
+
152
+ end
153
+
154
+ describe "A view that includes a partial using an array as partial_path", :type => :view do
155
+ before(:each) do
156
+ renderable_object = Object.new
157
+ renderable_object.stub!(:name).and_return("Renderable Object")
158
+ assigns[:array] = [renderable_object]
159
+ end
160
+
161
+ it "should render the array passed through to render_partial without modification" do
162
+ render "view_spec/template_with_partial_with_array"
163
+ response.body.should match(/^Renderable Object$/)
164
+ end
165
+ end
166
+
167
+ describe "Different types of renders (not :template)", :type => :view do
168
+ it "should render partial with local" do
169
+ render :partial => "view_spec/partial_with_local_variable", :locals => {:x => "Ender"}
170
+ response.should have_tag('div', :content => "Ender")
171
+ end
172
+ end
173
+
174
+ describe "A view", :type => :view do
175
+ before(:each) do
176
+ session[:key] = "session"
177
+ params[:key] = "params"
178
+ flash[:key] = "flash"
179
+ flash.now[:now_key] = "flash.now"
180
+ render "view_spec/accessor"
181
+ end
182
+
183
+ it "uses the template as the implicit subject" do
184
+ subject.should == template
185
+ end
186
+
187
+ it "has access to session data" do
188
+ response.should have_tag("div#session", "session")
189
+ end
190
+
191
+ it "has access to params data" do
192
+ response.should have_tag("div#params", "params")
193
+ end
194
+
195
+ it "has access to flash" do
196
+ response.should have_tag("div#flash", "flash")
197
+ end
198
+
199
+ it "has access to flash.now" do
200
+ response.should have_tag("div#flash_now", "flash.now")
201
+ end
202
+
203
+ it "has a controller param" do
204
+ response.should have_tag("div#controller", "view_spec")
205
+ end
206
+
207
+ it "has an action param" do
208
+ response.should have_tag("div#action", "accessor")
209
+ end
210
+ end
211
+
212
+ describe "A view with a form_tag", :type => :view do
213
+ it "should render the right action" do
214
+ render "view_spec/entry_form"
215
+ response.should have_tag("form[action=?]","/view_spec/entry_form")
216
+ end
217
+ end
218
+
219
+ describe "An instantiated ViewExampleGroupController", :type => :view do
220
+ before do
221
+ render "view_spec/foo/show"
222
+ end
223
+
224
+ it "should return the name of the real controller that it replaces" do
225
+ @controller.controller_name.should == 'foo'
226
+ end
227
+
228
+ it "should return the path of the real controller that it replaces" do
229
+ @controller.controller_path.should == 'view_spec/foo'
230
+ end
231
+ end
232
+
233
+ describe "a block helper", :type => :view do
234
+ it "should not yield when not told to in the example" do
235
+ template.should_receive(:if_allowed)
236
+ render "view_spec/block_helper"
237
+ response.should_not have_tag("div","block helper was rendered")
238
+ end
239
+
240
+ it "should yield when told to in the example" do
241
+ template.should_receive(:if_allowed).and_yield
242
+ render "view_spec/block_helper"
243
+ response.should have_tag("div","block helper was rendered")
244
+ end
245
+ end
246
+
247
+ describe "render :inline => ...", :type => :view do
248
+ it "should render ERB right in the spec" do
249
+ render :inline => %|<%= text_field_tag('field_name', 'Value') %>|
250
+ response.should have_tag("input[type=?][name=?][value=?]","text","field_name","Value")
251
+ end
252
+ end
253
+
254
+ describe "render 'view_spec/foo/show'", :type => :view do
255
+ it "should derive action name using the first part of the template name" do
256
+ render 'view_spec/foo/show'
257
+ request.path_parameters[:action].should == 'show'
258
+ end
259
+ end
260
+
261
+ describe "view_spec/foo/show", :type => :view do
262
+ context "rendered with no args" do
263
+ it "renders just fine" do
264
+ render
265
+ request.path_parameters[:action].should == 'show'
266
+ end
267
+ end
268
+ end
269
+
270
+ describe "setting path parameters", :type => :view do
271
+ describe "(controller)" do
272
+ it "should supercede the default path parameters" do
273
+ render "view_spec/entry_form", :path_parameters => {:controller => 'foo'}
274
+ request.path_parameters[:controller].should == 'foo'
275
+ end
276
+ end
277
+ describe "(action)" do
278
+ it "should supercede the default path parameters" do
279
+ render "view_spec/entry_form", :path_parameters => {:action => 'foo'}
280
+ request.path_parameters[:action].should == 'foo'
281
+ end
282
+ end
283
+ describe "(something arbitrary)" do
284
+ it "should supercede the default path parameters" do
285
+ render "view_spec/entry_form", :path_parameters => {:foo => 'bar'}
286
+ request.path_parameters[:foo].should == 'bar'
287
+ end
288
+ end
289
+ end
290
+
291
+ describe "route helpers", :type => :view do
292
+ it "should be available before render is called" do
293
+ custom_route_path.should == '/custom_route'
294
+ end
295
+ end
296
+
297
+ module Spec
298
+ module Rails
299
+ module Example
300
+ describe ViewExampleGroup do
301
+ it "should clear its name from the description" do
302
+ group = describe("foo", :type => :view) do
303
+ $nested_group = describe("bar") do
304
+ end
305
+ end
306
+ group.description.to_s.should == "foo"
307
+ $nested_group.description.to_s.should == "foo bar"
308
+ end
309
+
310
+ it "should clear ActionView::Base.base_view_path on teardown" do
311
+ group = describe("base_view_path_cleared flag", :type => :view) {}
312
+ example = group.new(Spec::Example::ExampleProxy.new) {}
313
+
314
+ ActionView::Base.should_receive(:base_view_path=).with(nil)
315
+ example.run_after_each
316
+ end
317
+ end
318
+ end
319
+ end
320
+ end
321
+
322
+ describe "bug http://rspec.lighthouseapp.com/projects/5645/tickets/510", :type => :view do
323
+ describe "a view example with should_not_receive" do
324
+ it "should render the view" do
325
+ obj = mock('model')
326
+ obj.should_receive(:render_partial?).and_return false
327
+ assigns[:obj] = obj
328
+ template.should_not_receive(:render).with(:partial => 'some_partial')
329
+ render "view_spec/should_not_receive"
330
+ end
331
+ end
332
+ end
333
+
334
+ describe "bug https://rspec.lighthouseapp.com/projects/5645/tickets/787", :type => :view do
335
+ describe "a view example checking a link" do
336
+ it "should have access to link_to" do
337
+ render "view_spec/view_helpers"
338
+ response.body.should include(link_to("edit", "this_is_the_link"))
339
+ end
340
+
341
+ it "should use link_to within have_tag" do
342
+ render "view_spec/view_helpers"
343
+ response.body.should have_tag("span", :html => link_to("edit", "this_is_the_link"))
344
+ end
345
+ end
346
+ end