actionpack 1.12.5 → 1.13.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of actionpack might be problematic. Click here for more details.

Files changed (179) hide show
  1. data/CHANGELOG +517 -15
  2. data/MIT-LICENSE +1 -1
  3. data/README +18 -20
  4. data/Rakefile +7 -4
  5. data/examples/address_book_controller.rb +3 -3
  6. data/examples/blog_controller.cgi +3 -3
  7. data/examples/debate_controller.cgi +5 -5
  8. data/lib/action_controller.rb +2 -2
  9. data/lib/action_controller/assertions.rb +73 -311
  10. data/lib/action_controller/{deprecated_assertions.rb → assertions/deprecated_assertions.rb} +32 -8
  11. data/lib/action_controller/assertions/dom_assertions.rb +25 -0
  12. data/lib/action_controller/assertions/model_assertions.rb +12 -0
  13. data/lib/action_controller/assertions/response_assertions.rb +140 -0
  14. data/lib/action_controller/assertions/routing_assertions.rb +82 -0
  15. data/lib/action_controller/assertions/selector_assertions.rb +571 -0
  16. data/lib/action_controller/assertions/tag_assertions.rb +117 -0
  17. data/lib/action_controller/base.rb +334 -163
  18. data/lib/action_controller/benchmarking.rb +3 -6
  19. data/lib/action_controller/caching.rb +83 -22
  20. data/lib/action_controller/cgi_ext/cgi_ext.rb +0 -7
  21. data/lib/action_controller/cgi_ext/cgi_methods.rb +167 -173
  22. data/lib/action_controller/cgi_ext/raw_post_data_fix.rb +43 -22
  23. data/lib/action_controller/cgi_process.rb +50 -27
  24. data/lib/action_controller/components.rb +21 -25
  25. data/lib/action_controller/cookies.rb +10 -9
  26. data/lib/action_controller/{dependencies.rb → deprecated_dependencies.rb} +9 -27
  27. data/lib/action_controller/filters.rb +448 -225
  28. data/lib/action_controller/flash.rb +24 -20
  29. data/lib/action_controller/helpers.rb +2 -5
  30. data/lib/action_controller/integration.rb +40 -16
  31. data/lib/action_controller/layout.rb +11 -8
  32. data/lib/action_controller/macros/auto_complete.rb +3 -2
  33. data/lib/action_controller/macros/in_place_editing.rb +3 -2
  34. data/lib/action_controller/mime_responds.rb +41 -29
  35. data/lib/action_controller/mime_type.rb +68 -10
  36. data/lib/action_controller/pagination.rb +4 -3
  37. data/lib/action_controller/request.rb +22 -14
  38. data/lib/action_controller/rescue.rb +25 -22
  39. data/lib/action_controller/resources.rb +302 -0
  40. data/lib/action_controller/response.rb +20 -2
  41. data/lib/action_controller/response.rb.rej +17 -0
  42. data/lib/action_controller/routing.rb +1165 -567
  43. data/lib/action_controller/scaffolding.rb +30 -31
  44. data/lib/action_controller/session/active_record_store.rb +2 -0
  45. data/lib/action_controller/session/drb_store.rb +4 -0
  46. data/lib/action_controller/session/mem_cache_store.rb +4 -0
  47. data/lib/action_controller/session_management.rb +6 -9
  48. data/lib/action_controller/status_codes.rb +89 -0
  49. data/lib/action_controller/streaming.rb +6 -15
  50. data/lib/action_controller/templates/rescues/_request_and_response.rhtml +5 -5
  51. data/lib/action_controller/templates/rescues/diagnostics.rhtml +2 -2
  52. data/lib/action_controller/templates/rescues/routing_error.rhtml +4 -4
  53. data/lib/action_controller/templates/rescues/template_error.rhtml +1 -1
  54. data/lib/action_controller/templates/scaffolds/list.rhtml +1 -1
  55. data/lib/action_controller/test_process.rb +52 -30
  56. data/lib/action_controller/url_rewriter.rb +63 -29
  57. data/lib/action_controller/vendor/html-scanner/html/document.rb +1 -0
  58. data/lib/action_controller/vendor/html-scanner/html/node.rb +3 -4
  59. data/lib/action_controller/vendor/html-scanner/html/selector.rb +822 -0
  60. data/lib/action_controller/verification.rb +22 -11
  61. data/lib/action_pack.rb +1 -1
  62. data/lib/action_pack/version.rb +2 -2
  63. data/lib/action_view.rb +1 -1
  64. data/lib/action_view/base.rb +46 -43
  65. data/lib/action_view/compiled_templates.rb +1 -1
  66. data/lib/action_view/helpers/active_record_helper.rb +54 -17
  67. data/lib/action_view/helpers/asset_tag_helper.rb +97 -46
  68. data/lib/action_view/helpers/capture_helper.rb +1 -1
  69. data/lib/action_view/helpers/date_helper.rb +258 -136
  70. data/lib/action_view/helpers/debug_helper.rb +1 -1
  71. data/lib/action_view/helpers/deprecated_helper.rb +34 -0
  72. data/lib/action_view/helpers/form_helper.rb +75 -35
  73. data/lib/action_view/helpers/form_options_helper.rb +7 -5
  74. data/lib/action_view/helpers/form_tag_helper.rb +44 -6
  75. data/lib/action_view/helpers/java_script_macros_helper.rb +59 -46
  76. data/lib/action_view/helpers/javascript_helper.rb +71 -10
  77. data/lib/action_view/helpers/javascripts/controls.js +41 -23
  78. data/lib/action_view/helpers/javascripts/dragdrop.js +105 -76
  79. data/lib/action_view/helpers/javascripts/effects.js +293 -163
  80. data/lib/action_view/helpers/javascripts/prototype.js +897 -389
  81. data/lib/action_view/helpers/javascripts/prototype.js.rej +561 -0
  82. data/lib/action_view/helpers/number_helper.rb +111 -65
  83. data/lib/action_view/helpers/prototype_helper.rb +84 -109
  84. data/lib/action_view/helpers/scriptaculous_helper.rb +5 -0
  85. data/lib/action_view/helpers/tag_helper.rb +69 -16
  86. data/lib/action_view/helpers/text_helper.rb +149 -112
  87. data/lib/action_view/helpers/url_helper.rb +200 -107
  88. data/lib/action_view/template_error.rb +66 -42
  89. data/test/abstract_unit.rb +4 -2
  90. data/test/active_record_unit.rb +84 -56
  91. data/test/activerecord/active_record_assertions_test.rb +26 -18
  92. data/test/activerecord/active_record_store_test.rb +4 -36
  93. data/test/activerecord/pagination_test.rb +1 -6
  94. data/test/controller/action_pack_assertions_test.rb +230 -113
  95. data/test/controller/addresses_render_test.rb +2 -6
  96. data/test/controller/assert_select_test.rb +576 -0
  97. data/test/controller/base_test.rb +73 -3
  98. data/test/controller/caching_test.rb +228 -0
  99. data/test/controller/capture_test.rb +12 -10
  100. data/test/controller/cgi_test.rb +89 -12
  101. data/test/controller/components_test.rb +24 -2
  102. data/test/controller/content_type_test.rb +139 -0
  103. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  104. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  105. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  106. data/test/controller/cookie_test.rb +33 -25
  107. data/test/controller/deprecated_instance_variables_test.rb +48 -0
  108. data/test/controller/deprecation/deprecated_base_methods_test.rb +60 -0
  109. data/test/controller/fake_controllers.rb +0 -1
  110. data/test/controller/filters_test.rb +301 -16
  111. data/test/controller/flash_test.rb +19 -2
  112. data/test/controller/helper_test.rb +2 -2
  113. data/test/controller/integration_test.rb +154 -0
  114. data/test/controller/layout_test.rb +115 -1
  115. data/test/controller/mime_responds_test.rb +94 -0
  116. data/test/controller/mime_type_test.rb +9 -0
  117. data/test/controller/new_render_test.rb +161 -11
  118. data/test/controller/raw_post_test.rb +52 -15
  119. data/test/controller/redirect_test.rb +27 -14
  120. data/test/controller/render_test.rb +76 -29
  121. data/test/controller/request_test.rb +55 -4
  122. data/test/controller/resources_test.rb +274 -0
  123. data/test/controller/routing_test.rb +1533 -824
  124. data/test/controller/selector_test.rb +628 -0
  125. data/test/controller/send_file_test.rb +9 -1
  126. data/test/controller/session_management_test.rb +51 -0
  127. data/test/controller/test_test.rb +113 -29
  128. data/test/controller/url_rewriter_test.rb +86 -17
  129. data/test/controller/verification_test.rb +19 -17
  130. data/test/controller/webservice_test.rb +0 -7
  131. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  132. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  133. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  134. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  135. data/test/fixtures/deprecated_instance_variables/_cookies_ivar.rhtml +1 -0
  136. data/test/fixtures/deprecated_instance_variables/_cookies_method.rhtml +1 -0
  137. data/test/fixtures/deprecated_instance_variables/_flash_ivar.rhtml +1 -0
  138. data/test/fixtures/deprecated_instance_variables/_flash_method.rhtml +1 -0
  139. data/test/fixtures/deprecated_instance_variables/_headers_ivar.rhtml +1 -0
  140. data/test/fixtures/deprecated_instance_variables/_headers_method.rhtml +1 -0
  141. data/test/fixtures/deprecated_instance_variables/_params_ivar.rhtml +1 -0
  142. data/test/fixtures/deprecated_instance_variables/_params_method.rhtml +1 -0
  143. data/test/fixtures/deprecated_instance_variables/_request_ivar.rhtml +1 -0
  144. data/test/fixtures/deprecated_instance_variables/_request_method.rhtml +1 -0
  145. data/test/fixtures/deprecated_instance_variables/_response_ivar.rhtml +1 -0
  146. data/test/fixtures/deprecated_instance_variables/_response_method.rhtml +1 -0
  147. data/test/fixtures/deprecated_instance_variables/_session_ivar.rhtml +1 -0
  148. data/test/fixtures/deprecated_instance_variables/_session_method.rhtml +1 -0
  149. data/test/fixtures/multipart/binary_file +0 -0
  150. data/test/fixtures/public/javascripts/application.js +1 -0
  151. data/test/fixtures/test/_hello.rxml +1 -0
  152. data/test/fixtures/test/hello_world_container.rxml +3 -0
  153. data/test/fixtures/topic.rb +2 -2
  154. data/test/template/active_record_helper_test.rb +83 -12
  155. data/test/template/asset_tag_helper_test.rb +75 -95
  156. data/test/template/compiled_templates_test.rb +1 -0
  157. data/test/template/date_helper_test.rb +873 -181
  158. data/test/template/deprecated_helper_test.rb +36 -0
  159. data/test/template/deprecated_instance_variables_test.rb +43 -0
  160. data/test/template/form_helper_test.rb +77 -1
  161. data/test/template/form_options_helper_test.rb +4 -0
  162. data/test/template/form_tag_helper_test.rb +66 -2
  163. data/test/template/java_script_macros_helper_test.rb +4 -1
  164. data/test/template/javascript_helper_test.rb +29 -0
  165. data/test/template/number_helper_test.rb +63 -27
  166. data/test/template/prototype_helper_test.rb +77 -34
  167. data/test/template/tag_helper_test.rb +34 -6
  168. data/test/template/text_helper_test.rb +69 -34
  169. data/test/template/url_helper_test.rb +168 -16
  170. data/test/testing_sandbox.rb +7 -22
  171. metadata +66 -20
  172. data/filler.txt +0 -50
  173. data/lib/action_controller/code_generation.rb +0 -235
  174. data/lib/action_controller/vendor/xml_simple.rb +0 -1019
  175. data/test/controller/caching_filestore.rb +0 -74
  176. data/test/fixtures/application_root/app/controllers/a_class_that_contains_a_controller/poorly_placed_controller.rb +0 -7
  177. data/test/fixtures/application_root/app/controllers/module_that_holds_controllers/nested_controller.rb +0 -3
  178. data/test/fixtures/application_root/app/models/a_class_that_contains_a_controller.rb +0 -7
  179. data/test/fixtures/dont_load.rb +0 -3
@@ -1,38 +1,42 @@
1
- require 'test/unit'
2
- require 'test/unit/assertions'
3
1
  require 'rexml/document'
4
2
 
5
- module Test #:nodoc:
6
- module Unit #:nodoc:
7
- module Assertions
3
+ module ActionController #:nodoc:
4
+ module Assertions #:nodoc:
5
+ module DeprecatedAssertions
8
6
  def assert_success(message=nil) #:nodoc:
9
7
  assert_response(:success, message)
10
8
  end
9
+ deprecate :assert_success => "use assert_response(:success)"
11
10
 
12
11
  def assert_redirect(message=nil) #:nodoc:
13
12
  assert_response(:redirect, message)
14
13
  end
14
+ deprecate :assert_redirect => "use assert_response(:redirect)"
15
15
 
16
16
  def assert_rendered_file(expected=nil, message=nil) #:nodoc:
17
17
  assert_template(expected, message)
18
18
  end
19
+ deprecate :assert_rendered_file => :assert_template
19
20
 
20
21
  # ensure that the session has an object with the specified name
21
22
  def assert_session_has(key=nil, message=nil) #:nodoc:
22
23
  msg = build_message(message, "<?> is not in the session <?>", key, @response.session)
23
24
  assert_block(msg) { @response.has_session_object?(key) }
24
25
  end
26
+ deprecate :assert_session_has => "use assert(@response.has_session_object?(key))"
25
27
 
26
28
  # ensure that the session has no object with the specified name
27
29
  def assert_session_has_no(key=nil, message=nil) #:nodoc:
28
30
  msg = build_message(message, "<?> is in the session <?>", key, @response.session)
29
31
  assert_block(msg) { !@response.has_session_object?(key) }
30
32
  end
33
+ deprecate :assert_session_has_no => "use assert(!@response.has_session_object?(key))"
31
34
 
32
35
  def assert_session_equal(expected = nil, key = nil, message = nil) #:nodoc:
33
36
  msg = build_message(message, "<?> expected in session['?'] but was <?>", expected, key, @response.session[key])
34
37
  assert_block(msg) { expected == @response.session[key] }
35
38
  end
39
+ deprecate :assert_session_equal => "use assert_equal(expected, @response[key])"
36
40
 
37
41
  # -- cookie assertions ---------------------------------------------------
38
42
 
@@ -41,6 +45,7 @@ module Test #:nodoc:
41
45
  msg = build_message(message, "<?> not expected in cookies['?']", actual, key)
42
46
  assert_block(msg) { actual.nil? or actual.empty? }
43
47
  end
48
+ deprecate :assert_no_cookie => "use assert(!@response.cookies.key?(key))"
44
49
 
45
50
  def assert_cookie_equal(expected = nil, key = nil, message = nil) #:nodoc:
46
51
  actual = @response.cookies[key]
@@ -48,6 +53,7 @@ module Test #:nodoc:
48
53
  msg = build_message(message, "<?> expected in cookies['?'] but was <?>", expected, key, actual)
49
54
  assert_block(msg) { expected == actual }
50
55
  end
56
+ deprecate :assert_cookie_equal => "use assert(@response.cookies.key?(key))"
51
57
 
52
58
  # -- flash assertions ---------------------------------------------------
53
59
 
@@ -56,41 +62,48 @@ module Test #:nodoc:
56
62
  msg = build_message(message, "<?> is not in the flash <?>", key, @response.flash)
57
63
  assert_block(msg) { @response.has_flash_object?(key) }
58
64
  end
65
+ deprecate :assert_flash_has => "use assert(@response.has_flash_object?(key))"
59
66
 
60
67
  # ensure that the flash has no object with the specified name
61
68
  def assert_flash_has_no(key=nil, message=nil) #:nodoc:
62
69
  msg = build_message(message, "<?> is in the flash <?>", key, @response.flash)
63
70
  assert_block(msg) { !@response.has_flash_object?(key) }
64
71
  end
72
+ deprecate :assert_flash_has_no => "use assert(!@response.has_flash_object?(key))"
65
73
 
66
74
  # ensure the flash exists
67
75
  def assert_flash_exists(message=nil) #:nodoc:
68
76
  msg = build_message(message, "the flash does not exist <?>", @response.session['flash'] )
69
77
  assert_block(msg) { @response.has_flash? }
70
78
  end
79
+ deprecate :assert_flash_exists => "use assert(@response.has_flash?)"
71
80
 
72
81
  # ensure the flash does not exist
73
82
  def assert_flash_not_exists(message=nil) #:nodoc:
74
83
  msg = build_message(message, "the flash exists <?>", @response.flash)
75
84
  assert_block(msg) { !@response.has_flash? }
76
85
  end
86
+ deprecate :assert_flash_not_exists => "use assert(!@response.has_flash?)"
77
87
 
78
88
  # ensure the flash is empty but existent
79
89
  def assert_flash_empty(message=nil) #:nodoc:
80
90
  msg = build_message(message, "the flash is not empty <?>", @response.flash)
81
91
  assert_block(msg) { !@response.has_flash_with_contents? }
82
92
  end
93
+ deprecate :assert_flash_empty => "use assert(!@response.has_flash_with_contents?)"
83
94
 
84
95
  # ensure the flash is not empty
85
96
  def assert_flash_not_empty(message=nil) #:nodoc:
86
97
  msg = build_message(message, "the flash is empty")
87
98
  assert_block(msg) { @response.has_flash_with_contents? }
88
99
  end
100
+ deprecate :assert_flash_not_empty => "use assert(@response.has_flash_with_contents?)"
89
101
 
90
102
  def assert_flash_equal(expected = nil, key = nil, message = nil) #:nodoc:
91
103
  msg = build_message(message, "<?> expected in flash['?'] but was <?>", expected, key, @response.flash[key])
92
104
  assert_block(msg) { expected == @response.flash[key] }
93
105
  end
106
+ deprecate :assert_flash_equal => "use assert_equal(expected, @response.flash[key])"
94
107
 
95
108
 
96
109
  # ensure our redirection url is an exact match
@@ -99,6 +112,7 @@ module Test #:nodoc:
99
112
  msg = build_message(message, "<?> is not the redirected location <?>", url, @response.redirect_url)
100
113
  assert_block(msg) { @response.redirect_url == url }
101
114
  end
115
+ deprecate :assert_redirect_url => "use assert_equal(url, @response.redirect_url)"
102
116
 
103
117
  # ensure our redirection url matches a pattern
104
118
  def assert_redirect_url_match(pattern=nil, message=nil) #:nodoc:
@@ -106,6 +120,7 @@ module Test #:nodoc:
106
120
  msg = build_message(message, "<?> was not found in the location: <?>", pattern, @response.redirect_url)
107
121
  assert_block(msg) { @response.redirect_url_match?(pattern) }
108
122
  end
123
+ deprecate :assert_redirect_url_match => "use assert(@response.redirect_url_match?(pattern))"
109
124
 
110
125
 
111
126
  # -- template assertions ------------------------------------------------
@@ -115,12 +130,14 @@ module Test #:nodoc:
115
130
  msg = build_message(message, "<?> is not a template object", key )
116
131
  assert_block(msg) { @response.has_template_object?(key) }
117
132
  end
133
+ deprecate :assert_template_has => "use assert(@response.has_template_object?(key))"
118
134
 
119
135
  # ensure that a template object with the given name does not exist
120
136
  def assert_template_has_no(key=nil,message=nil) #:nodoc:
121
137
  msg = build_message(message, "<?> is a template object <?>", key, @response.template_objects[key])
122
138
  assert_block(msg) { !@response.has_template_object?(key) }
123
139
  end
140
+ deprecate :assert_template_has_no => "use assert(!@response.has_template_object?(key))"
124
141
 
125
142
  # ensures that the object assigned to the template on +key+ is equal to +expected+ object.
126
143
  def assert_template_equal(expected = nil, key = nil, message = nil) #:nodoc:
@@ -128,6 +145,8 @@ module Test #:nodoc:
128
145
  assert_block(msg) { expected == @response.template.assigns[key.to_s] }
129
146
  end
130
147
  alias_method :assert_assigned_equal, :assert_template_equal
148
+ deprecate :assert_assigned_equal => "use assert_equal(expected, @response.template.assigns[key.to_s])"
149
+ deprecate :assert_template_equal => "use assert_equal(expected, @response.template.assigns[key.to_s])"
131
150
 
132
151
  # Asserts that the template returns the +expected+ string or array based on the XPath +expression+.
133
152
  # This will only work if the template rendered a valid XML document.
@@ -145,6 +164,7 @@ module Test #:nodoc:
145
164
  msg = build_message(message, "<?> found <?>, not <?>", expression, matches, expected)
146
165
  assert_block(msg) { matches == expected }
147
166
  end
167
+ deprecate :assert_template_xpath_match => "you should use assert_tag, instead"
148
168
 
149
169
  # Assert the template object with the given name is an Active Record descendant and is valid.
150
170
  def assert_valid_record(key = nil, message = nil) #:nodoc:
@@ -152,6 +172,7 @@ module Test #:nodoc:
152
172
  msg = build_message(message, "Active Record is invalid <?>)", record.errors.full_messages)
153
173
  assert_block(msg) { record.valid? }
154
174
  end
175
+ deprecate :assert_valid_record => "use assert(assigns(key).valid?)"
155
176
 
156
177
  # Assert the template object with the given name is an Active Record descendant and is invalid.
157
178
  def assert_invalid_record(key = nil, message = nil) #:nodoc:
@@ -159,6 +180,7 @@ module Test #:nodoc:
159
180
  msg = build_message(message, "Active Record is valid)")
160
181
  assert_block(msg) { !record.valid? }
161
182
  end
183
+ deprecate :assert_invalid_record => "use assert(!assigns(key).valid?)"
162
184
 
163
185
  # Assert the template object with the given name is an Active Record descendant and the specified column(s) are valid.
164
186
  def assert_valid_column_on_record(key = nil, columns = "", message = nil) #:nodoc:
@@ -170,6 +192,7 @@ module Test #:nodoc:
170
192
  msg = build_message(message, "Active Record has invalid columns <?>)", cols.join(",") )
171
193
  assert_block(msg) { cols.empty? }
172
194
  end
195
+ deprecate :assert_valid_column_on_record => "use assert(!record.errors.invalid?(column)) instead"
173
196
 
174
197
  # Assert the template object with the given name is an Active Record descendant and the specified column(s) are invalid.
175
198
  def assert_invalid_column_on_record(key = nil, columns = "", message = nil) #:nodoc:
@@ -181,6 +204,7 @@ module Test #:nodoc:
181
204
  msg = build_message(message, "Active Record has valid columns <?>)", cols.join(",") )
182
205
  assert_block(msg) { cols.empty? }
183
206
  end
207
+ deprecate :assert_invalid_column_on_record => "use assert(record.errors.invalid?(column)) instead"
184
208
 
185
209
  private
186
210
  def glue_columns(columns)
@@ -191,14 +215,14 @@ module Test #:nodoc:
191
215
  end
192
216
 
193
217
  def find_record_in_template(key = nil)
194
- assert_template_has(key)
218
+ assert_not_nil assigns(key)
195
219
  record = @response.template_objects[key]
196
220
 
197
221
  assert_not_nil(record)
198
222
  assert_kind_of ActiveRecord::Base, record
199
223
 
200
224
  return record
201
- end
225
+ end
202
226
  end
203
227
  end
204
- end
228
+ end
@@ -0,0 +1,25 @@
1
+ module ActionController
2
+ module Assertions
3
+ module DomAssertions
4
+ # test 2 html strings to be equivalent, i.e. identical up to reordering of attributes
5
+ def assert_dom_equal(expected, actual, message="")
6
+ clean_backtrace do
7
+ expected_dom = HTML::Document.new(expected).root
8
+ actual_dom = HTML::Document.new(actual).root
9
+ full_message = build_message(message, "<?> expected to be == to\n<?>.", expected_dom.to_s, actual_dom.to_s)
10
+ assert_block(full_message) { expected_dom == actual_dom }
11
+ end
12
+ end
13
+
14
+ # negated form of +assert_dom_equivalent+
15
+ def assert_dom_not_equal(expected, actual, message="")
16
+ clean_backtrace do
17
+ expected_dom = HTML::Document.new(expected).root
18
+ actual_dom = HTML::Document.new(actual).root
19
+ full_message = build_message(message, "<?> expected to be != to\n<?>.", expected_dom.to_s, actual_dom.to_s)
20
+ assert_block(full_message) { expected_dom != actual_dom }
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,12 @@
1
+ module ActionController
2
+ module Assertions
3
+ module ModelAssertions
4
+ # ensures that the passed record is valid by active record standards. returns the error messages if not
5
+ def assert_valid(record)
6
+ clean_backtrace do
7
+ assert record.valid?, record.errors.full_messages.join("\n")
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,140 @@
1
+ require 'rexml/document'
2
+ require File.dirname(__FILE__) + "/../vendor/html-scanner/html/document"
3
+
4
+ module ActionController
5
+ module Assertions
6
+ module ResponseAssertions
7
+ # Asserts that the response is one of the following types:
8
+ #
9
+ # * <tt>:success</tt>: Status code was 200
10
+ # * <tt>:redirect</tt>: Status code was in the 300-399 range
11
+ # * <tt>:missing</tt>: Status code was 404
12
+ # * <tt>:error</tt>: Status code was in the 500-599 range
13
+ #
14
+ # You can also pass an explicit status number like assert_response(501)
15
+ # or its symbolic equivalent assert_response(:not_implemented).
16
+ # See ActionController::StatusCodes for a full list.
17
+ def assert_response(type, message = nil)
18
+ clean_backtrace do
19
+ if [ :success, :missing, :redirect, :error ].include?(type) && @response.send("#{type}?")
20
+ assert_block("") { true } # to count the assertion
21
+ elsif type.is_a?(Fixnum) && @response.response_code == type
22
+ assert_block("") { true } # to count the assertion
23
+ elsif type.is_a?(Symbol) && @response.response_code == ActionController::StatusCodes::SYMBOL_TO_STATUS_CODE[type]
24
+ assert_block("") { true } # to count the assertion
25
+ else
26
+ assert_block(build_message(message, "Expected response to be a <?>, but was <?>", type, @response.response_code)) { false }
27
+ end
28
+ end
29
+ end
30
+
31
+ # Assert that the redirection options passed in match those of the redirect called in the latest action. This match can be partial,
32
+ # such that assert_redirected_to(:controller => "weblog") will also match the redirection of
33
+ # redirect_to(:controller => "weblog", :action => "show") and so on.
34
+ def assert_redirected_to(options = {}, message=nil)
35
+ clean_backtrace do
36
+ assert_response(:redirect, message)
37
+ return true if options == @response.redirected_to
38
+ ActionController::Routing::Routes.reload if ActionController::Routing::Routes.empty?
39
+
40
+ begin
41
+ url = {}
42
+ original = { :expected => options, :actual => @response.redirected_to.is_a?(Symbol) ? @response.redirected_to : @response.redirected_to.dup }
43
+ original.each do |key, value|
44
+ if value.is_a?(Symbol)
45
+ value = @controller.respond_to?(value, true) ? @controller.send(value) : @controller.send("hash_for_#{value}_url")
46
+ end
47
+
48
+ unless value.is_a?(Hash)
49
+ request = case value
50
+ when NilClass then nil
51
+ when /^\w+:\/\// then recognized_request_for(%r{^(\w+://.*?(/|$|\?))(.*)$} =~ value ? $3 : nil)
52
+ else recognized_request_for(value)
53
+ end
54
+ value = request.path_parameters if request
55
+ end
56
+
57
+ if value.is_a?(Hash) # stringify 2 levels of hash keys
58
+ if name = value.delete(:use_route)
59
+ route = ActionController::Routing::Routes.named_routes[name]
60
+ value.update(route.parameter_shell)
61
+ end
62
+
63
+ value.stringify_keys!
64
+ value.values.select { |v| v.is_a?(Hash) }.collect { |v| v.stringify_keys! }
65
+ if key == :expected && value['controller'] == @controller.controller_name && original[:actual].is_a?(Hash)
66
+ original[:actual].stringify_keys!
67
+ value.delete('controller') if original[:actual]['controller'].nil? || original[:actual]['controller'] == value['controller']
68
+ end
69
+ end
70
+
71
+ if value.respond_to?(:[]) && value['controller']
72
+ if key == :actual && value['controller'].first != '/' && !value['controller'].include?('/')
73
+ new_controller_path = ActionController::Routing.controller_relative_to(value['controller'], @controller.class.controller_path)
74
+ value['controller'] = new_controller_path if value['controller'] != new_controller_path && ActionController::Routing.possible_controllers.include?(new_controller_path)
75
+ end
76
+ value['controller'] = value['controller'][1..-1] if value['controller'].first == '/' # strip leading hash
77
+ end
78
+ url[key] = value
79
+ end
80
+
81
+
82
+ @response_diff = url[:expected].diff(url[:actual]) if url[:actual]
83
+ msg = build_message(message, "response is not a redirection to all of the options supplied (redirection is <?>), difference: <?>",
84
+ url[:actual], @response_diff)
85
+
86
+ assert_block(msg) do
87
+ url[:expected].keys.all? do |k|
88
+ if k == :controller then url[:expected][k] == ActionController::Routing.controller_relative_to(url[:actual][k], @controller.class.controller_path)
89
+ else parameterize(url[:expected][k]) == parameterize(url[:actual][k])
90
+ end
91
+ end
92
+ end
93
+ rescue ActionController::RoutingError # routing failed us, so match the strings only.
94
+ msg = build_message(message, "expected a redirect to <?>, found one to <?>", options, @response.redirect_url)
95
+ url_regexp = %r{^(\w+://.*?(/|$|\?))(.*)$}
96
+ eurl, epath, url, path = [options, @response.redirect_url].collect do |url|
97
+ u, p = (url_regexp =~ url) ? [$1, $3] : [nil, url]
98
+ [u, (p.first == '/') ? p : '/' + p]
99
+ end.flatten
100
+
101
+ assert_equal(eurl, url, msg) if eurl && url
102
+ assert_equal(epath, path, msg) if epath && path
103
+ end
104
+ end
105
+ end
106
+
107
+ # Asserts that the request was rendered with the appropriate template file.
108
+ def assert_template(expected = nil, message=nil)
109
+ clean_backtrace do
110
+ rendered = expected ? @response.rendered_file(!expected.include?('/')) : @response.rendered_file
111
+ msg = build_message(message, "expecting <?> but rendering with <?>", expected, rendered)
112
+ assert_block(msg) do
113
+ if expected.nil?
114
+ !@response.rendered_with_file?
115
+ else
116
+ expected == rendered
117
+ end
118
+ end
119
+ end
120
+ end
121
+
122
+ private
123
+ def recognized_request_for(path, request_method = nil)
124
+ path = "/#{path}" unless path.first == '/'
125
+
126
+ # Assume given controller
127
+ request = ActionController::TestRequest.new({}, {}, nil)
128
+ request.env["REQUEST_METHOD"] = request_method.to_s.upcase if request_method
129
+ request.path = path
130
+
131
+ ActionController::Routing::Routes.recognize(request)
132
+ request
133
+ end
134
+
135
+ def parameterize(value)
136
+ value.respond_to?(:to_param) ? value.to_param : value
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,82 @@
1
+ module ActionController
2
+ module Assertions
3
+ module RoutingAssertions
4
+ # Asserts that the routing of the given path was handled correctly and that the parsed options match.
5
+ #
6
+ # assert_recognizes({:controller => 'items', :action => 'index'}, 'items')
7
+ #
8
+ # Pass a hash in the second argument to specify the request method. This is useful for routes
9
+ # requiring a specific method.
10
+ #
11
+ # assert_recognizes({:controller => 'items', :action => 'create'}, {:path => 'items', :method => :post})
12
+ #
13
+ def assert_recognizes(expected_options, path, extras={}, message=nil)
14
+ if path.is_a? Hash
15
+ request_method = path[:method]
16
+ path = path[:path]
17
+ else
18
+ request_method = nil
19
+ end
20
+
21
+ clean_backtrace do
22
+ ActionController::Routing::Routes.reload if ActionController::Routing::Routes.empty?
23
+ request = recognized_request_for(path, request_method)
24
+
25
+ expected_options = expected_options.clone
26
+ extras.each_key { |key| expected_options.delete key } unless extras.nil?
27
+
28
+ expected_options.stringify_keys!
29
+ routing_diff = expected_options.diff(request.path_parameters)
30
+ msg = build_message(message, "The recognized options <?> did not match <?>, difference: <?>",
31
+ request.path_parameters, expected_options, expected_options.diff(request.path_parameters))
32
+ assert_block(msg) { request.path_parameters == expected_options }
33
+ end
34
+ end
35
+
36
+ # Asserts that the provided options can be used to generate the provided path.
37
+ def assert_generates(expected_path, options, defaults={}, extras = {}, message=nil)
38
+ clean_backtrace do
39
+ expected_path = "/#{expected_path}" unless expected_path[0] == ?/
40
+ # Load routes.rb if it hasn't been loaded.
41
+ ActionController::Routing::Routes.reload if ActionController::Routing::Routes.empty?
42
+
43
+ generated_path, extra_keys = ActionController::Routing::Routes.generate_extras(options, defaults)
44
+ found_extras = options.reject {|k, v| ! extra_keys.include? k}
45
+
46
+ msg = build_message(message, "found extras <?>, not <?>", found_extras, extras)
47
+ assert_block(msg) { found_extras == extras }
48
+
49
+ msg = build_message(message, "The generated path <?> did not match <?>", generated_path,
50
+ expected_path)
51
+ assert_block(msg) { expected_path == generated_path }
52
+ end
53
+ end
54
+
55
+ # Asserts that path and options match both ways; in other words, the URL generated from
56
+ # options is the same as path, and also that the options recognized from path are the same as options
57
+ def assert_routing(path, options, defaults={}, extras={}, message=nil)
58
+ assert_recognizes(options, path, extras, message)
59
+
60
+ controller, default_controller = options[:controller], defaults[:controller]
61
+ if controller && controller.include?(?/) && default_controller && default_controller.include?(?/)
62
+ options[:controller] = "/#{controller}"
63
+ end
64
+
65
+ assert_generates(path, options, defaults, extras, message)
66
+ end
67
+
68
+ private
69
+ def recognized_request_for(path, request_method = nil)
70
+ path = "/#{path}" unless path.first == '/'
71
+
72
+ # Assume given controller
73
+ request = ActionController::TestRequest.new({}, {}, nil)
74
+ request.env["REQUEST_METHOD"] = request_method.to_s.upcase if request_method
75
+ request.path = path
76
+
77
+ ActionController::Routing::Routes.recognize(request)
78
+ request
79
+ end
80
+ end
81
+ end
82
+ end