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,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe "error_on" do
4
+ it "should provide a description including the name of what the error is on" do
5
+ have(1).error_on(:whatever).description.should == "have 1 error on :whatever"
6
+ end
7
+
8
+ it "should provide a failure message including the number actually given" do
9
+ lambda {
10
+ [].should have(1).error_on(:whatever)
11
+ }.should fail_with("expected 1 error on :whatever, got 0")
12
+ end
13
+ end
14
+
15
+ describe "errors_on" do
16
+ it "should provide a description including the name of what the error is on" do
17
+ have(2).errors_on(:whatever).description.should == "have 2 errors on :whatever"
18
+ end
19
+
20
+ it "should provide a failure message including the number actually given" do
21
+ lambda {
22
+ [1].should have(3).errors_on(:whatever)
23
+ }.should fail_with("expected 3 errors on :whatever, got 1")
24
+ end
25
+ end
26
+
27
+ describe "have something other than error_on or errors_on" do
28
+ it "has a standard rspec failure message" do
29
+ lambda {
30
+ [1,2,3].should have(2).elements
31
+ }.should fail_with("expected 2 elements, got 3")
32
+ end
33
+
34
+ it "has a standard rspec description" do
35
+ have(2).elements.description.should == "have 2 elements"
36
+ end
37
+ end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe "have_text" do
4
+
5
+ it "should have a helpful description" do
6
+ matcher = have_text("foo bar")
7
+ matcher.description.should == 'have text "foo bar"'
8
+ end
9
+
10
+ describe "where target is a Regexp" do
11
+ it 'should should match submitted text using a regexp' do
12
+ matcher = have_text(/fo*/)
13
+ matcher.matches?('foo').should be_true
14
+ matcher.matches?('bar').should be_nil
15
+ end
16
+ end
17
+
18
+ describe "where target is a String" do
19
+ it 'should match submitted text using a string' do
20
+ matcher = have_text('foo')
21
+ matcher.matches?('foo').should be_true
22
+ matcher.matches?('foo bar').should be_false
23
+ end
24
+ end
25
+
26
+ end
27
+
28
+ describe "have_text",
29
+ :type => :controller do
30
+ ['isolation','integration'].each do |mode|
31
+ if mode == 'integration'
32
+ integrate_views
33
+ end
34
+
35
+ describe "where target is a response (in #{mode} mode)" do
36
+ controller_name :render_spec
37
+
38
+ it "should pass with exactly matching text" do
39
+ post 'text_action'
40
+ response.should have_text("this is the text for this action")
41
+ end
42
+
43
+ it "should pass with matching text (using Regexp)" do
44
+ post 'text_action'
45
+ response.should have_text(/is the text/)
46
+ end
47
+
48
+ it "should fail with matching text" do
49
+ post 'text_action'
50
+ lambda {
51
+ response.should have_text("this is NOT the text for this action")
52
+ }.should fail_with("expected \"this is NOT the text for this action\", got \"this is the text for this action\"")
53
+ end
54
+
55
+ it "should fail when a template is rendered" do
56
+ post 'some_action'
57
+ lambda {
58
+ response.should have_text("this is the text for this action")
59
+ }.should fail_with(/expected \"this is the text for this action\", got .*/)
60
+ end
61
+
62
+ it "should pass using should_not with incorrect text" do
63
+ post 'text_action'
64
+ response.should_not have_text("the accordian guy")
65
+ end
66
+ end
67
+ end
68
+ end
69
+
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe "include_text" do
4
+
5
+ it "should have a helpful description" do
6
+ matcher = include_text("foo bar")
7
+ matcher.description.should == 'include text "foo bar"'
8
+ end
9
+
10
+ it 'should match if the text is contained' do
11
+ matcher = include_text('big piece')
12
+ matcher.matches?('I am a big piece of text').should be_true
13
+ end
14
+
15
+ it 'should not match if text is not contained' do
16
+ matcher = include_text('foo bar')
17
+ matcher.matches?('hello world').should be_false
18
+ end
19
+
20
+ end
21
+
22
+ describe "include_text", :type => :controller do
23
+ ['isolation','integration'].each do |mode|
24
+ if mode == 'integration'
25
+ integrate_views
26
+ end
27
+
28
+ describe "where target is a response (in #{mode} mode)" do
29
+ controller_name :render_spec
30
+
31
+ it "should pass with exactly matching text" do
32
+ post 'text_action'
33
+ response.should include_text("this is the text for this action")
34
+ end
35
+
36
+ it 'should pass with substring matching text' do
37
+ post 'text_action'
38
+ response.should include_text('text for this')
39
+ end
40
+
41
+ it "should fail with incorrect text" do
42
+ post 'text_action'
43
+ lambda {
44
+ response.should include_text("the accordian guy")
45
+ }.should fail_with("expected to find \"the accordian guy\" in \"this is the text for this action\"")
46
+ end
47
+
48
+ it "should pass using should_not with incorrect text" do
49
+ post 'text_action'
50
+ response.should_not include_text("the accordian guy")
51
+ end
52
+
53
+ it "should fail when a template is rendered" do
54
+ get 'some_action'
55
+ lambda {
56
+ response.should include_text("this is the text for this action")
57
+ }.should fail_with(/expected to find \"this is the text for this action\"/)
58
+ end
59
+ end
60
+ end
61
+ end
62
+
@@ -0,0 +1,253 @@
1
+ require 'spec_helper'
2
+
3
+ [:response, :controller].each do |subject_method|
4
+ ['isolation','integration'].each do |mode|
5
+ describe "redirect_to behaviour", :type => :controller do
6
+ if mode == 'integration'
7
+ integrate_views
8
+ end
9
+ controller_name :redirect_spec
10
+
11
+ subject { send(subject_method) }
12
+
13
+ it "redirected to another action" do
14
+ get 'action_with_redirect_to_somewhere'
15
+ should redirect_to(:action => 'somewhere')
16
+ end
17
+
18
+ it "redirected to another controller and action" do
19
+ get 'action_with_redirect_to_other_somewhere'
20
+ should redirect_to(:controller => 'render_spec', :action => 'text_action')
21
+ end
22
+
23
+ it "redirected to another action (with 'and return')" do
24
+ get 'action_with_redirect_to_somewhere_and_return'
25
+ should redirect_to(:action => 'somewhere')
26
+ end
27
+
28
+ it "redirected from an SSL action to a non-SSL action" do
29
+ request.stub!(:ssl?).and_return true
30
+ get 'action_with_redirect_to_somewhere'
31
+ should redirect_to(:action => 'somewhere')
32
+ end
33
+
34
+ it "redirected to correct path with leading /" do
35
+ get 'action_with_redirect_to_somewhere'
36
+ should redirect_to('/redirect_spec/somewhere')
37
+ end
38
+
39
+ it "redirected to correct path without leading /" do
40
+ get 'action_with_redirect_to_somewhere'
41
+ should redirect_to('redirect_spec/somewhere')
42
+ end
43
+
44
+ it "redirected to correct internal URL" do
45
+ get 'action_with_redirect_to_somewhere'
46
+ should redirect_to("http://test.host/redirect_spec/somewhere")
47
+ end
48
+
49
+ it "redirected to correct external URL" do
50
+ get 'action_with_redirect_to_rspec_site'
51
+ should redirect_to("http://rspec.rubyforge.org")
52
+ end
53
+
54
+ it "redirected :back" do
55
+ request.env['HTTP_REFERER'] = "http://test.host/previous/page"
56
+ get 'action_with_redirect_back'
57
+ should redirect_to(:back)
58
+ end
59
+
60
+ it "redirected :back and should redirect_to URL matches" do
61
+ request.env['HTTP_REFERER'] = "http://test.host/previous/page"
62
+ get 'action_with_redirect_back'
63
+ should redirect_to("http://test.host/previous/page")
64
+ end
65
+
66
+ it "redirected from within a respond_to block" do
67
+ get 'action_with_redirect_in_respond_to'
68
+ should redirect_to('redirect_spec/somewhere')
69
+ end
70
+
71
+ params_as_hash = {:action => "somewhere", :id => 1111, :param1 => "value1", :param2 => "value2"}
72
+
73
+ it "redirected to an internal URL containing a query string" do
74
+ get "action_with_redirect_which_creates_query_string"
75
+ should redirect_to(params_as_hash)
76
+ end
77
+
78
+ it "redirected to an internal URL containing a query string, one way it might be generated" do
79
+ get "action_with_redirect_with_query_string_order1"
80
+ should redirect_to(params_as_hash)
81
+ end
82
+
83
+ it "redirected to an internal URL containing a query string, another way it might be generated" do
84
+ get "action_with_redirect_with_query_string_order2"
85
+ should redirect_to(params_as_hash)
86
+ end
87
+
88
+ it "redirected to an internal URL which is unroutable but matched via a string" do
89
+ get "action_with_redirect_to_unroutable_url_inside_app"
90
+ should redirect_to("http://test.host/nonexistant/none")
91
+ end
92
+
93
+ it "redirected to a URL with a specific status code" do
94
+ get "action_with_redirect_to_somewhere_with_status"
95
+ should redirect_to(:action => 'somewhere').with(:status => 301)
96
+ end
97
+
98
+ it "redirected to a URL with a specific status code (using names)" do
99
+ get "action_with_redirect_to_somewhere_with_status"
100
+ should redirect_to(:action => 'somewhere').with(:status => :moved_permanently)
101
+ end
102
+
103
+ end
104
+
105
+
106
+ describe "redirect_to with a controller spec in #{mode} mode and a custom request.host", :type => :controller do
107
+ if mode == 'integration'
108
+ integrate_views
109
+ end
110
+ controller_name :redirect_spec
111
+
112
+ subject { send(subject_method) }
113
+
114
+ before do
115
+ request.host = "some.custom.host"
116
+ end
117
+
118
+ it "should pass when redirected to another action" do
119
+ get 'action_with_redirect_to_somewhere'
120
+ should redirect_to(:action => 'somewhere')
121
+ end
122
+ end
123
+
124
+ describe "Given a controller spec in #{mode} mode", :type => :controller do
125
+ if mode == 'integration'
126
+ integrate_views
127
+ end
128
+ controller_name :redirect_spec
129
+
130
+ subject { send(subject_method) }
131
+
132
+ it "an action that redirects should not result in an error if no should redirect_to expectation is called" do
133
+ get 'action_with_redirect_to_somewhere'
134
+ end
135
+
136
+ it "an action that redirects should not result in an error if should_not redirect_to expectation was called, but not to that action" do
137
+ get 'action_with_redirect_to_somewhere'
138
+ should_not redirect_to(:action => 'another_destination')
139
+ end
140
+
141
+ it "an action that redirects should result in an error if should_not redirect_to expectation was called to that action" do
142
+ get 'action_with_redirect_to_somewhere'
143
+ lambda {
144
+ should_not redirect_to(:action => 'somewhere')
145
+ }.should fail_with("expected not to be redirected to {:action=>\"somewhere\"}, but was")
146
+ end
147
+
148
+ it "an action that does not redirects should not result in an error if should_not redirect_to expectation was called" do
149
+ get 'action_with_no_redirect'
150
+ should_not redirect_to(:action => 'any_destination')
151
+ end
152
+
153
+
154
+ end
155
+
156
+ describe "Given a controller spec in #{mode} mode, should redirect_to should fail when", :type => :controller do
157
+ if mode == 'integration'
158
+ integrate_views
159
+ end
160
+ controller_name :redirect_spec
161
+
162
+ subject { send(subject_method) }
163
+
164
+ it "redirected to wrong action" do
165
+ get 'action_with_redirect_to_somewhere'
166
+ lambda {
167
+ should redirect_to(:action => 'somewhere_else')
168
+ }.should fail_with("expected redirect to {:action=>\"somewhere_else\"}, got redirect to \"http://test.host/redirect_spec/somewhere\"")
169
+ end
170
+
171
+ it "redirected with wrong status code" do
172
+ get 'action_with_redirect_to_somewhere_with_status'
173
+ lambda {
174
+ should redirect_to(:action => 'somewhere').with(:status => 302)
175
+ }.should fail_with("expected redirect to {:action=>\"somewhere\"} with status 302 Found, got 301 Moved Permanently")
176
+ end
177
+
178
+ it "redirected with wrong status code (using names)" do
179
+ get 'action_with_redirect_to_somewhere_with_status'
180
+ lambda {
181
+ should redirect_to(:action => 'somewhere').with(:status => :found)
182
+ }.should fail_with("expected redirect to {:action=>\"somewhere\"} with status 302 Found, got 301 Moved Permanently")
183
+ end
184
+
185
+ it "redirected to incorrect path with leading /" do
186
+ get 'action_with_redirect_to_somewhere'
187
+ lambda {
188
+ should redirect_to('/redirect_spec/somewhere_else')
189
+ }.should fail_with('expected redirect to "/redirect_spec/somewhere_else", got redirect to "http://test.host/redirect_spec/somewhere"')
190
+ end
191
+
192
+ it "redirected to incorrect path without leading /" do
193
+ get 'action_with_redirect_to_somewhere'
194
+ lambda {
195
+ should redirect_to('redirect_spec/somewhere_else')
196
+ }.should fail_with('expected redirect to "redirect_spec/somewhere_else", got redirect to "http://test.host/redirect_spec/somewhere"')
197
+ end
198
+
199
+ it "redirected to incorrect internal URL (based on the action)" do
200
+ get 'action_with_redirect_to_somewhere'
201
+ lambda {
202
+ should redirect_to("http://test.host/redirect_spec/somewhere_else")
203
+ }.should fail_with('expected redirect to "http://test.host/redirect_spec/somewhere_else", got redirect to "http://test.host/redirect_spec/somewhere"')
204
+ end
205
+
206
+ it "redirected to wrong external URL" do
207
+ get 'action_with_redirect_to_rspec_site'
208
+ lambda {
209
+ should redirect_to("http://test.unit.rubyforge.org")
210
+ }.should fail_with('expected redirect to "http://test.unit.rubyforge.org", got redirect to "http://rspec.rubyforge.org"')
211
+ end
212
+
213
+ it "redirected to incorrect internal URL (based on the directory path)" do
214
+ get 'action_with_redirect_to_somewhere'
215
+ lambda {
216
+ should redirect_to("http://test.host/non_existent_controller/somewhere")
217
+ }.should fail_with('expected redirect to "http://test.host/non_existent_controller/somewhere", got redirect to "http://test.host/redirect_spec/somewhere"')
218
+ end
219
+
220
+ it "expected redirect :back, but redirected to a new URL" do
221
+ get 'action_with_no_redirect'
222
+ lambda {
223
+ should redirect_to(:back)
224
+ }.should fail_with('expected redirect to :back, got no redirect')
225
+ end
226
+
227
+ it "no redirect at all" do
228
+ get 'action_with_no_redirect'
229
+ lambda {
230
+ should redirect_to(:action => 'nowhere')
231
+ }.should fail_with("expected redirect to {:action=>\"nowhere\"}, got no redirect")
232
+ end
233
+
234
+ it "redirected to an internal URL which is unroutable and matched via a hash" do
235
+ get "action_with_redirect_to_unroutable_url_inside_app"
236
+ route = {:controller => "nonexistant", :action => "none"}
237
+ lambda {
238
+ should redirect_to(route)
239
+ }.should raise_error(ActionController::RoutingError, /(no route found to match|No route matches) \"\/nonexistant\/none\" with \{.*\}/)
240
+ end
241
+
242
+ it "provides a description" do
243
+ redirect_to("foo/bar").description.should == %q|redirect to "foo/bar"|
244
+ end
245
+
246
+ it "redirects to action with http method restriction" do
247
+ post 'action_to_redirect_to_action_with_method_restriction'
248
+ should redirect_to(:action => 'action_with_method_restriction')
249
+ end
250
+
251
+ end
252
+ end
253
+ end
@@ -0,0 +1,208 @@
1
+ require 'spec_helper'
2
+
3
+ [:response, :controller].each do |subject_method|
4
+ ['isolation','integration'].each do |mode|
5
+ describe "#{subject_method}.should render_template (in #{mode} mode)",
6
+ :type => :controller do
7
+ controller_name :render_spec
8
+ if mode == 'integration'
9
+ integrate_views
10
+ end
11
+
12
+ subject { send(subject_method) }
13
+
14
+ it "matches an action (using a string)" do
15
+ post 'some_action'
16
+ should render_template('some_action')
17
+ end
18
+
19
+ it "does not match an action that is a truncated version of the actual action" do
20
+ post 'some_action'
21
+ should_not render_template('some_actio')
22
+ end
23
+
24
+ if ::Rails::VERSION::STRING >= '2.3'
25
+ it "matches an action with specified extenstions (implicit format)" do
26
+ post 'some_action'
27
+ should render_template('some_action.html.erb')
28
+ end
29
+
30
+ it "matches an action with specified extenstions (explicit format)" do
31
+ post 'some_action', :format => 'js'
32
+ should render_template('some_action.js.rjs')
33
+ end
34
+ end
35
+
36
+ it "matches an action (using a symbol)" do
37
+ post 'some_action'
38
+ should render_template(:some_action)
39
+ end
40
+
41
+ it "matches an action on a specific controller" do
42
+ post 'some_action'
43
+ should render_template('render_spec/some_action')
44
+ end
45
+
46
+ it "matches an action on a non-default specific controller" do
47
+ post 'action_which_renders_template_from_other_controller'
48
+ should render_template('controller_spec/action_with_template')
49
+ end
50
+
51
+ it "matches an rjs template" do
52
+ xhr :post, 'some_action'
53
+ should render_template('render_spec/some_action')
54
+ end
55
+
56
+ it "matches a partial template (simple path)" do
57
+ get 'action_with_partial'
58
+ should render_template("_a_partial")
59
+ end
60
+
61
+ it "matches a partial template (complex path)" do
62
+ get 'action_with_partial'
63
+ should render_template("render_spec/_a_partial")
64
+ end
65
+
66
+ it "fails when the wrong template is rendered" do
67
+ post 'some_action'
68
+ lambda do
69
+ should render_template('non_existent_template')
70
+ end.should fail_with(/expected \"non_existent_template\", got \"render_spec\/some_action(\.html\.erb)?\"/)
71
+ end
72
+
73
+ it "fails when redirected" do
74
+ post :action_with_redirect
75
+ lambda do
76
+ should render_template(:some_action)
77
+ end.should fail_with(/expected \"some_action\", got redirected to \"http:\/\/test.host\/render_spec\/some_action\"/)
78
+ end
79
+
80
+ it "fails when template is associated with a different controller but controller is not specified" do
81
+ post 'action_which_renders_template_from_other_controller'
82
+ lambda do
83
+ should render_template('action_with_template')
84
+ end.should fail_with(/expected \"action_with_template\", got \"controller_spec\/action_with_template(\.html\.erb)?\"/)
85
+ end
86
+
87
+ it "fails with incorrect full path when template is associated with a different controller" do
88
+ post 'action_which_renders_template_from_other_controller'
89
+ lambda do
90
+ should render_template('render_spec/action_with_template')
91
+ end.should fail_with(/expected \"render_spec\/action_with_template\", got \"controller_spec\/action_with_template(\.html\.erb)?\"/)
92
+ end
93
+
94
+ it "fails on the wrong extension" do
95
+ get 'some_action'
96
+ lambda {
97
+ should render_template('render_spec/some_action.js.rjs')
98
+ }.should fail_with(/expected \"render_spec\/some_action\.js\.rjs\", got \"render_spec\/some_action(\.html\.erb)?\"/)
99
+ end
100
+
101
+ it "faild when TEXT is rendered" do
102
+ post 'text_action'
103
+ lambda do
104
+ should render_template('some_action')
105
+ end.should fail_with(/expected \"some_action\", got (nil|\"\")/)
106
+ end
107
+
108
+ describe "with an alternate layout" do
109
+ it "says it rendered the action's layout" do
110
+ pending("record rendering of layouts") do
111
+ get 'action_with_alternate_layout'
112
+ should render_template('layouts/simple')
113
+ end
114
+ end
115
+ end
116
+
117
+ it "provides a description" do
118
+ render_template("foo/bar").description.should == %q|render template "foo/bar"|
119
+ end
120
+ end
121
+
122
+ describe "#{subject_method}.should_not render_template (in #{mode} mode)",
123
+ :type => :controller do
124
+ controller_name :render_spec
125
+ if mode == 'integration'
126
+ integrate_views
127
+ end
128
+
129
+ subject { send(subject_method) }
130
+
131
+ it "passes when the action renders nothing" do
132
+ post 'action_that_renders_nothing'
133
+ should_not render_template('action_that_renders_nothing')
134
+ end
135
+
136
+ it "passes when the action renders nothing (symbol)" do
137
+ post 'action_that_renders_nothing'
138
+ should_not render_template(:action_that_renders_nothing)
139
+ end
140
+
141
+ it "passes when the action does not render the template" do
142
+ post 'some_action'
143
+ should_not render_template('some_other_template')
144
+ end
145
+
146
+ it "passes when the action does not render the template (symbol)" do
147
+ post 'some_action'
148
+ should_not render_template(:some_other_template)
149
+ end
150
+
151
+ it "passes when the action does not render the template (named with controller)" do
152
+ post 'some_action'
153
+ should_not render_template('render_spec/some_other_template')
154
+ end
155
+
156
+ it "passes when the action renders the template with a different controller" do
157
+ post 'action_which_renders_template_from_other_controller'
158
+ should_not render_template('action_with_template')
159
+ end
160
+
161
+ it "passes when the action renders the template (named with controller) with a different controller" do
162
+ post 'action_which_renders_template_from_other_controller'
163
+ should_not render_template('render_spec/action_with_template')
164
+ end
165
+
166
+ it "passes when TEXT is rendered" do
167
+ post 'text_action'
168
+ should_not render_template('some_action')
169
+ end
170
+
171
+ it "fails when the action renders the template" do
172
+ post 'some_action'
173
+ lambda do
174
+ should_not render_template('some_action')
175
+ end.should fail_with("expected not to render \"some_action\", but did")
176
+ end
177
+
178
+ it "fails when the action renders the template (symbol)" do
179
+ post 'some_action'
180
+ lambda do
181
+ should_not render_template(:some_action)
182
+ end.should fail_with("expected not to render \"some_action\", but did")
183
+ end
184
+
185
+ it "fails when the action renders the template (named with controller)" do
186
+ post 'some_action'
187
+ lambda do
188
+ should_not render_template('render_spec/some_action')
189
+ end.should fail_with("expected not to render \"render_spec/some_action\", but did")
190
+ end
191
+
192
+ it "fails when the action renders the partial" do
193
+ post 'action_with_partial'
194
+ lambda do
195
+ should_not render_template('_a_partial')
196
+ end.should fail_with("expected not to render \"_a_partial\", but did")
197
+ end
198
+
199
+ it "fails when the action renders the partial (named with controller)" do
200
+ post 'action_with_partial'
201
+ lambda do
202
+ should_not render_template('render_spec/_a_partial')
203
+ end.should fail_with("expected not to render \"render_spec/_a_partial\", but did")
204
+ end
205
+
206
+ end
207
+ end
208
+ end