cavalle-rspec-rails 1.2.2.0.1

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 (168) hide show
  1. data/.document +7 -0
  2. data/History.rdoc +207 -0
  3. data/License.txt +33 -0
  4. data/Manifest.txt +167 -0
  5. data/README.rdoc +45 -0
  6. data/Rakefile +79 -0
  7. data/TODO.txt +1 -0
  8. data/Upgrade.rdoc +103 -0
  9. data/features/step_definitions/people.rb +6 -0
  10. data/features/support/env.rb +13 -0
  11. data/features/transactions/transactions_should_rollback.feature +16 -0
  12. data/generators/rspec/CHANGES +1 -0
  13. data/generators/rspec/rspec_generator.rb +54 -0
  14. data/generators/rspec/templates/previous_failures.txt +0 -0
  15. data/generators/rspec/templates/rcov.opts +2 -0
  16. data/generators/rspec/templates/rspec.rake +165 -0
  17. data/generators/rspec/templates/script/autospec +6 -0
  18. data/generators/rspec/templates/script/spec +10 -0
  19. data/generators/rspec/templates/script/spec_server +9 -0
  20. data/generators/rspec/templates/spec.opts +4 -0
  21. data/generators/rspec/templates/spec_helper.rb +47 -0
  22. data/generators/rspec_controller/USAGE +33 -0
  23. data/generators/rspec_controller/rspec_controller_generator.rb +45 -0
  24. data/generators/rspec_controller/templates/controller_spec.rb +25 -0
  25. data/generators/rspec_controller/templates/helper_spec.rb +11 -0
  26. data/generators/rspec_controller/templates/view_spec.rb +12 -0
  27. data/generators/rspec_default_values.rb +19 -0
  28. data/generators/rspec_model/USAGE +18 -0
  29. data/generators/rspec_model/rspec_model_generator.rb +35 -0
  30. data/generators/rspec_model/templates/model_spec.rb +15 -0
  31. data/generators/rspec_scaffold/rspec_scaffold_generator.rb +150 -0
  32. data/generators/rspec_scaffold/templates/controller_spec.rb +171 -0
  33. data/generators/rspec_scaffold/templates/edit_erb_spec.rb +27 -0
  34. data/generators/rspec_scaffold/templates/helper_spec.rb +11 -0
  35. data/generators/rspec_scaffold/templates/index_erb_spec.rb +28 -0
  36. data/generators/rspec_scaffold/templates/new_erb_spec.rb +27 -0
  37. data/generators/rspec_scaffold/templates/routing_spec.rb +63 -0
  38. data/generators/rspec_scaffold/templates/show_erb_spec.rb +23 -0
  39. data/init.rb +9 -0
  40. data/lib/autotest/discover.rb +1 -0
  41. data/lib/autotest/rails_rspec.rb +76 -0
  42. data/lib/spec/rails/example/assigns_hash_proxy.rb +39 -0
  43. data/lib/spec/rails/example/controller_example_group.rb +247 -0
  44. data/lib/spec/rails/example/cookies_proxy.rb +29 -0
  45. data/lib/spec/rails/example/functional_example_group.rb +84 -0
  46. data/lib/spec/rails/example/helper_example_group.rb +153 -0
  47. data/lib/spec/rails/example/model_example_group.rb +14 -0
  48. data/lib/spec/rails/example/render_observer.rb +67 -0
  49. data/lib/spec/rails/example/routing_example_group.rb +13 -0
  50. data/lib/spec/rails/example/routing_helpers.rb +70 -0
  51. data/lib/spec/rails/example/view_example_group.rb +186 -0
  52. data/lib/spec/rails/example.rb +47 -0
  53. data/lib/spec/rails/extensions/action_controller/rescue.rb +42 -0
  54. data/lib/spec/rails/extensions/action_controller/test_case.rb +16 -0
  55. data/lib/spec/rails/extensions/action_controller/test_response.rb +21 -0
  56. data/lib/spec/rails/extensions/action_view/base.rb +33 -0
  57. data/lib/spec/rails/extensions/active_record/base.rb +45 -0
  58. data/lib/spec/rails/extensions/active_support/test_case.rb +7 -0
  59. data/lib/spec/rails/extensions/spec/matchers/have.rb +23 -0
  60. data/lib/spec/rails/extensions/spec/runner/configuration.rb +44 -0
  61. data/lib/spec/rails/extensions.rb +11 -0
  62. data/lib/spec/rails/interop/testcase.rb +14 -0
  63. data/lib/spec/rails/matchers/ar_be_valid.rb +44 -0
  64. data/lib/spec/rails/matchers/assert_select.rb +146 -0
  65. data/lib/spec/rails/matchers/change.rb +11 -0
  66. data/lib/spec/rails/matchers/have_text.rb +57 -0
  67. data/lib/spec/rails/matchers/include_text.rb +54 -0
  68. data/lib/spec/rails/matchers/redirect_to.rb +126 -0
  69. data/lib/spec/rails/matchers/render_template.rb +114 -0
  70. data/lib/spec/rails/matchers.rb +32 -0
  71. data/lib/spec/rails/mocks.rb +135 -0
  72. data/lib/spec/rails/spec_server.rb +127 -0
  73. data/lib/spec/rails/story_adapter.rb +79 -0
  74. data/lib/spec/rails/version.rb +15 -0
  75. data/lib/spec/rails.rb +28 -0
  76. data/rspec-rails.gemspec +57 -0
  77. data/spec/autotest/mappings_spec.rb +86 -0
  78. data/spec/rails_suite.rb +7 -0
  79. data/spec/resources/controllers/action_view_base_spec_controller.rb +2 -0
  80. data/spec/resources/controllers/application.rb +9 -0
  81. data/spec/resources/controllers/controller_spec_controller.rb +120 -0
  82. data/spec/resources/controllers/example.txt +1 -0
  83. data/spec/resources/controllers/redirect_spec_controller.rb +70 -0
  84. data/spec/resources/controllers/render_spec_controller.rb +30 -0
  85. data/spec/resources/controllers/rjs_spec_controller.rb +58 -0
  86. data/spec/resources/helpers/addition_helper.rb +5 -0
  87. data/spec/resources/helpers/explicit_helper.rb +46 -0
  88. data/spec/resources/helpers/more_explicit_helper.rb +5 -0
  89. data/spec/resources/helpers/plugin_application_helper.rb +6 -0
  90. data/spec/resources/helpers/view_spec_helper.rb +13 -0
  91. data/spec/resources/models/animal.rb +4 -0
  92. data/spec/resources/models/person.rb +18 -0
  93. data/spec/resources/models/thing.rb +3 -0
  94. data/spec/resources/views/controller_spec/_partial.html.erb +0 -0
  95. data/spec/resources/views/controller_spec/action_setting_flash_after_session_reset.html.erb +1 -0
  96. data/spec/resources/views/controller_spec/action_setting_flash_before_session_reset.html.erb +1 -0
  97. data/spec/resources/views/controller_spec/action_setting_the_assigns_hash.html.erb +0 -0
  98. data/spec/resources/views/controller_spec/action_with_errors_in_template.html.erb +1 -0
  99. data/spec/resources/views/controller_spec/action_with_template.html.erb +1 -0
  100. data/spec/resources/views/layouts/application.html.erb +0 -0
  101. data/spec/resources/views/layouts/simple.html.erb +0 -0
  102. data/spec/resources/views/objects/_object.html.erb +1 -0
  103. data/spec/resources/views/render_spec/_a_partial.html.erb +0 -0
  104. data/spec/resources/views/render_spec/action_with_alternate_layout.html.erb +0 -0
  105. data/spec/resources/views/render_spec/some_action.html.erb +0 -0
  106. data/spec/resources/views/render_spec/some_action.js.rjs +1 -0
  107. data/spec/resources/views/rjs_spec/_replacement_partial.html.erb +1 -0
  108. data/spec/resources/views/rjs_spec/hide_div.js.rjs +1 -0
  109. data/spec/resources/views/rjs_spec/hide_page_element.js.rjs +1 -0
  110. data/spec/resources/views/rjs_spec/insert_html.js.rjs +1 -0
  111. data/spec/resources/views/rjs_spec/replace.js.rjs +1 -0
  112. data/spec/resources/views/rjs_spec/replace_html.js.rjs +1 -0
  113. data/spec/resources/views/rjs_spec/replace_html_with_partial.js.rjs +1 -0
  114. data/spec/resources/views/rjs_spec/visual_effect.js.rjs +1 -0
  115. data/spec/resources/views/rjs_spec/visual_toggle_effect.js.rjs +1 -0
  116. data/spec/resources/views/tag_spec/no_tags.html.erb +1 -0
  117. data/spec/resources/views/tag_spec/single_div_with_no_attributes.html.erb +1 -0
  118. data/spec/resources/views/tag_spec/single_div_with_one_attribute.html.erb +1 -0
  119. data/spec/resources/views/view_spec/_partial.html.erb +2 -0
  120. data/spec/resources/views/view_spec/_partial_used_twice.html.erb +0 -0
  121. data/spec/resources/views/view_spec/_partial_with_local_variable.html.erb +1 -0
  122. data/spec/resources/views/view_spec/_partial_with_sub_partial.html.erb +1 -0
  123. data/spec/resources/views/view_spec/_spacer.html.erb +1 -0
  124. data/spec/resources/views/view_spec/accessor.html.erb +5 -0
  125. data/spec/resources/views/view_spec/block_helper.html.erb +3 -0
  126. data/spec/resources/views/view_spec/entry_form.html.erb +2 -0
  127. data/spec/resources/views/view_spec/explicit_helper.html.erb +2 -0
  128. data/spec/resources/views/view_spec/foo/show.html.erb +1 -0
  129. data/spec/resources/views/view_spec/implicit_helper.html.erb +2 -0
  130. data/spec/resources/views/view_spec/multiple_helpers.html.erb +3 -0
  131. data/spec/resources/views/view_spec/path_params.html.erb +1 -0
  132. data/spec/resources/views/view_spec/should_not_receive.html.erb +3 -0
  133. data/spec/resources/views/view_spec/template_with_partial.html.erb +5 -0
  134. data/spec/resources/views/view_spec/template_with_partial_using_collection.html.erb +3 -0
  135. data/spec/resources/views/view_spec/template_with_partial_with_array.html.erb +1 -0
  136. data/spec/spec/rails/example/assigns_hash_proxy_spec.rb +109 -0
  137. data/spec/spec/rails/example/configuration_spec.rb +65 -0
  138. data/spec/spec/rails/example/controller_example_group_spec.rb +299 -0
  139. data/spec/spec/rails/example/controller_isolation_spec.rb +56 -0
  140. data/spec/spec/rails/example/cookies_proxy_spec.rb +87 -0
  141. data/spec/spec/rails/example/error_handling_spec.rb +90 -0
  142. data/spec/spec/rails/example/example_group_factory_spec.rb +112 -0
  143. data/spec/spec/rails/example/helper_example_group_spec.rb +233 -0
  144. data/spec/spec/rails/example/model_example_group_spec.rb +20 -0
  145. data/spec/spec/rails/example/routing_example_group_spec.rb +9 -0
  146. data/spec/spec/rails/example/shared_routing_example_group_examples.rb +44 -0
  147. data/spec/spec/rails/example/test_unit_assertion_accessibility_spec.rb +33 -0
  148. data/spec/spec/rails/example/view_example_group_spec.rb +335 -0
  149. data/spec/spec/rails/extensions/action_view_base_spec.rb +48 -0
  150. data/spec/spec/rails/extensions/active_record_spec.rb +14 -0
  151. data/spec/spec/rails/interop/testcase_spec.rb +70 -0
  152. data/spec/spec/rails/matchers/ar_be_valid_spec.rb +45 -0
  153. data/spec/spec/rails/matchers/assert_select_spec.rb +809 -0
  154. data/spec/spec/rails/matchers/errors_on_spec.rb +25 -0
  155. data/spec/spec/rails/matchers/have_text_spec.rb +70 -0
  156. data/spec/spec/rails/matchers/include_text_spec.rb +62 -0
  157. data/spec/spec/rails/matchers/redirect_to_spec.rb +253 -0
  158. data/spec/spec/rails/matchers/render_template_spec.rb +191 -0
  159. data/spec/spec/rails/matchers/should_change_spec.rb +15 -0
  160. data/spec/spec/rails/mocks/ar_classes.rb +10 -0
  161. data/spec/spec/rails/mocks/mock_model_spec.rb +106 -0
  162. data/spec/spec/rails/mocks/stub_model_spec.rb +80 -0
  163. data/spec/spec/rails/sample_modified_fixture.rb +8 -0
  164. data/spec/spec/rails/sample_spec.rb +8 -0
  165. data/spec/spec/rails/spec_server_spec.rb +107 -0
  166. data/spec/spec/rails/spec_spec.rb +11 -0
  167. data/spec/spec_helper.rb +79 -0
  168. metadata +277 -0
@@ -0,0 +1,25 @@
1
+ require File.dirname(__FILE__) + '/../../../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 == "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 == "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
@@ -0,0 +1,70 @@
1
+ require File.dirname(__FILE__) + '/../../../spec_helper'
2
+
3
+ describe "have_text" do
4
+
5
+
6
+ it "should have a helpful description" do
7
+ matcher = have_text("foo bar")
8
+ matcher.description.should == 'have text "foo bar"'
9
+ end
10
+
11
+ describe "where target is a Regexp" do
12
+ it 'should should match submitted text using a regexp' do
13
+ matcher = have_text(/fo*/)
14
+ matcher.matches?('foo').should be_true
15
+ matcher.matches?('bar').should be_nil
16
+ end
17
+ end
18
+
19
+ describe "where target is a String" do
20
+ it 'should match submitted text using a string' do
21
+ matcher = have_text('foo')
22
+ matcher.matches?('foo').should be_true
23
+ matcher.matches?('foo bar').should be_false
24
+ end
25
+ end
26
+
27
+ end
28
+
29
+ describe "have_text",
30
+ :type => :controller do
31
+ ['isolation','integration'].each do |mode|
32
+ if mode == 'integration'
33
+ integrate_views
34
+ end
35
+
36
+ describe "where target is a response (in #{mode} mode)" do
37
+ controller_name :render_spec
38
+
39
+ it "should pass with exactly matching text" do
40
+ post 'text_action'
41
+ response.should have_text("this is the text for this action")
42
+ end
43
+
44
+ it "should pass with matching text (using Regexp)" do
45
+ post 'text_action'
46
+ response.should have_text(/is the text/)
47
+ end
48
+
49
+ it "should fail with matching text" do
50
+ post 'text_action'
51
+ lambda {
52
+ response.should have_text("this is NOT the text for this action")
53
+ }.should fail_with("expected \"this is NOT the text for this action\", got \"this is the text for this action\"")
54
+ end
55
+
56
+ it "should fail when a template is rendered" do
57
+ post 'some_action'
58
+ lambda {
59
+ response.should have_text("this is the text for this action")
60
+ }.should fail_with(/expected \"this is the text for this action\", got .*/)
61
+ end
62
+
63
+ it "should pass using should_not with incorrect text" do
64
+ post 'text_action'
65
+ response.should_not have_text("the accordian guy")
66
+ end
67
+ end
68
+ end
69
+ end
70
+
@@ -0,0 +1,62 @@
1
+ require File.dirname(__FILE__) + '/../../../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 File.dirname(__FILE__) + '/../../../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,191 @@
1
+ require File.dirname(__FILE__) + '/../../../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
+ if ::Rails::VERSION::STRING >= '2.3'
20
+ it "matches an action with specified extenstions" do
21
+ post 'some_action'
22
+ should render_template('some_action.html.erb')
23
+ end
24
+ end
25
+
26
+ it "matches an action (using a symbol)" do
27
+ post 'some_action'
28
+ should render_template(:some_action)
29
+ end
30
+
31
+ it "matches an action on a specific controller" do
32
+ post 'some_action'
33
+ should render_template('render_spec/some_action')
34
+ end
35
+
36
+ it "matches an action on a non-default specific controller" do
37
+ post 'action_which_renders_template_from_other_controller'
38
+ should render_template('controller_spec/action_with_template')
39
+ end
40
+
41
+ it "matches an rjs template" do
42
+ xhr :post, 'some_action'
43
+ should render_template('render_spec/some_action')
44
+ end
45
+
46
+ it "matches a partial template (simple path)" do
47
+ get 'action_with_partial'
48
+ should render_template("_a_partial")
49
+ end
50
+
51
+ it "matches a partial template (complex path)" do
52
+ get 'action_with_partial'
53
+ should render_template("render_spec/_a_partial")
54
+ end
55
+
56
+ it "fails when the wrong template is rendered" do
57
+ post 'some_action'
58
+ lambda do
59
+ should render_template('non_existent_template')
60
+ end.should fail_with(/expected \"non_existent_template\", got \"render_spec\/some_action(\.html\.erb)?\"/)
61
+ end
62
+
63
+ it "fails when template is associated with a different controller but controller is not specified" do
64
+ post 'action_which_renders_template_from_other_controller'
65
+ lambda do
66
+ should render_template('action_with_template')
67
+ end.should fail_with(/expected \"action_with_template\", got \"controller_spec\/action_with_template(\.html\.erb)?\"/)
68
+ end
69
+
70
+ it "fails with incorrect full path when template is associated with a different controller" do
71
+ post 'action_which_renders_template_from_other_controller'
72
+ lambda do
73
+ should render_template('render_spec/action_with_template')
74
+ end.should fail_with(/expected \"render_spec\/action_with_template\", got \"controller_spec\/action_with_template(\.html\.erb)?\"/)
75
+ end
76
+
77
+ it "fails on the wrong extension" do
78
+ get 'some_action'
79
+ lambda {
80
+ should render_template('render_spec/some_action.js.rjs')
81
+ }.should fail_with(/expected \"render_spec\/some_action\.js\.rjs\", got \"render_spec\/some_action(\.html\.erb)?\"/)
82
+ end
83
+
84
+ it "faild when TEXT is rendered" do
85
+ post 'text_action'
86
+ lambda do
87
+ should render_template('some_action')
88
+ end.should fail_with(/expected \"some_action\", got (nil|\"\")/)
89
+ end
90
+
91
+ describe "with an alternate layout" do
92
+ it "says it rendered the action's layout" do
93
+ pending("record rendering of layouts") do
94
+ get 'action_with_alternate_layout'
95
+ should render_template('layouts/simple')
96
+ end
97
+ end
98
+ end
99
+
100
+ it "provides a description" do
101
+ render_template("foo/bar").description.should == %q|render template "foo/bar"|
102
+ end
103
+ end
104
+
105
+ describe "#{subject_method}.should_not render_template (in #{mode} mode)",
106
+ :type => :controller do
107
+ controller_name :render_spec
108
+ if mode == 'integration'
109
+ integrate_views
110
+ end
111
+
112
+ subject { send(subject_method) }
113
+
114
+ it "passes when the action renders nothing" do
115
+ post 'action_that_renders_nothing'
116
+ should_not render_template('action_that_renders_nothing')
117
+ end
118
+
119
+ it "passes when the action renders nothing (symbol)" do
120
+ post 'action_that_renders_nothing'
121
+ should_not render_template(:action_that_renders_nothing)
122
+ end
123
+
124
+ it "passes when the action does not render the template" do
125
+ post 'some_action'
126
+ should_not render_template('some_other_template')
127
+ end
128
+
129
+ it "passes when the action does not render the template (symbol)" do
130
+ post 'some_action'
131
+ should_not render_template(:some_other_template)
132
+ end
133
+
134
+ it "passes when the action does not render the template (named with controller)" do
135
+ post 'some_action'
136
+ should_not render_template('render_spec/some_other_template')
137
+ end
138
+
139
+ it "passes when the action renders the template with a different controller" do
140
+ post 'action_which_renders_template_from_other_controller'
141
+ should_not render_template('action_with_template')
142
+ end
143
+
144
+ it "passes when the action renders the template (named with controller) with a different controller" do
145
+ post 'action_which_renders_template_from_other_controller'
146
+ should_not render_template('render_spec/action_with_template')
147
+ end
148
+
149
+ it "passes when TEXT is rendered" do
150
+ post 'text_action'
151
+ should_not render_template('some_action')
152
+ end
153
+
154
+ it "fails when the action renders the template" do
155
+ post 'some_action'
156
+ lambda do
157
+ should_not render_template('some_action')
158
+ end.should fail_with("expected not to render \"some_action\", but did")
159
+ end
160
+
161
+ it "fails when the action renders the template (symbol)" do
162
+ post 'some_action'
163
+ lambda do
164
+ should_not render_template(:some_action)
165
+ end.should fail_with("expected not to render \"some_action\", but did")
166
+ end
167
+
168
+ it "fails when the action renders the template (named with controller)" do
169
+ post 'some_action'
170
+ lambda do
171
+ should_not render_template('render_spec/some_action')
172
+ end.should fail_with("expected not to render \"render_spec/some_action\", but did")
173
+ end
174
+
175
+ it "fails when the action renders the partial" do
176
+ post 'action_with_partial'
177
+ lambda do
178
+ should_not render_template('_a_partial')
179
+ end.should fail_with("expected not to render \"_a_partial\", but did")
180
+ end
181
+
182
+ it "fails when the action renders the partial (named with controller)" do
183
+ post 'action_with_partial'
184
+ lambda do
185
+ should_not render_template('render_spec/_a_partial')
186
+ end.should fail_with("expected not to render \"render_spec/_a_partial\", but did")
187
+ end
188
+
189
+ end
190
+ end
191
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/../../../spec_helper'
2
+
3
+ describe "should change" do
4
+ describe "handling association proxies" do
5
+ it "should match expected collection with proxied collection" do
6
+ person = Person.create!(:name => 'David')
7
+ koala = person.animals.create!(:name => 'Koala')
8
+ zebra = person.animals.create!(:name => 'Zebra')
9
+
10
+ lambda {
11
+ person.animals.delete(koala)
12
+ }.should change{person.animals}.to([zebra])
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ class MockableModel < ActiveRecord::Base
2
+ has_one :associated_model
3
+ end
4
+
5
+ class SubMockableModel < MockableModel
6
+ end
7
+
8
+ class AssociatedModel < ActiveRecord::Base
9
+ belongs_to :mockable_model
10
+ end