actionpack 1.13.6 → 2.0.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.
- data/CHANGELOG +1400 -20
- data/MIT-LICENSE +1 -1
- data/README +5 -5
- data/RUNNING_UNIT_TESTS +4 -5
- data/Rakefile +5 -6
- data/install.rb +2 -2
- data/lib/action_controller.rb +11 -15
- data/lib/action_controller/assertions.rb +12 -25
- data/lib/action_controller/assertions/dom_assertions.rb +18 -4
- data/lib/action_controller/assertions/model_assertions.rb +8 -1
- data/lib/action_controller/assertions/response_assertions.rb +35 -12
- data/lib/action_controller/assertions/routing_assertions.rb +56 -12
- data/lib/action_controller/assertions/selector_assertions.rb +105 -38
- data/lib/action_controller/assertions/tag_assertions.rb +28 -15
- data/lib/action_controller/base.rb +318 -250
- data/lib/action_controller/benchmarking.rb +33 -29
- data/lib/action_controller/caching.rb +130 -64
- data/lib/action_controller/cgi_ext.rb +16 -0
- data/lib/action_controller/cgi_ext/{cookie_performance_fix.rb → cookie.rb} +25 -40
- data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
- data/lib/action_controller/cgi_ext/session.rb +73 -0
- data/lib/action_controller/cgi_ext/stdinput.rb +23 -0
- data/lib/action_controller/cgi_process.rb +34 -57
- data/lib/action_controller/components.rb +19 -36
- data/lib/action_controller/cookies.rb +10 -9
- data/lib/action_controller/dispatcher.rb +195 -0
- data/lib/action_controller/filters.rb +35 -34
- data/lib/action_controller/flash.rb +30 -35
- data/lib/action_controller/helpers.rb +121 -47
- data/lib/action_controller/http_authentication.rb +126 -0
- data/lib/action_controller/integration.rb +105 -101
- data/lib/action_controller/layout.rb +59 -47
- data/lib/action_controller/mime_responds.rb +57 -68
- data/lib/action_controller/mime_type.rb +43 -80
- data/lib/action_controller/mime_types.rb +20 -0
- data/lib/action_controller/polymorphic_routes.rb +88 -0
- data/lib/action_controller/record_identifier.rb +91 -0
- data/lib/action_controller/request.rb +553 -88
- data/lib/action_controller/request_forgery_protection.rb +126 -0
- data/lib/action_controller/request_profiler.rb +138 -0
- data/lib/action_controller/rescue.rb +185 -69
- data/lib/action_controller/resources.rb +211 -172
- data/lib/action_controller/response.rb +49 -8
- data/lib/action_controller/routing.rb +359 -236
- data/lib/action_controller/routing_optimisation.rb +119 -0
- data/lib/action_controller/session/active_record_store.rb +3 -2
- data/lib/action_controller/session/cookie_store.rb +161 -0
- data/lib/action_controller/session/mem_cache_store.rb +9 -16
- data/lib/action_controller/session_management.rb +17 -8
- data/lib/action_controller/streaming.rb +6 -3
- data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
- data/lib/action_controller/templates/rescues/{_trace.rhtml → _trace.erb} +0 -0
- data/lib/action_controller/templates/rescues/{diagnostics.rhtml → diagnostics.erb} +2 -2
- data/lib/action_controller/templates/rescues/{layout.rhtml → layout.erb} +0 -0
- data/lib/action_controller/templates/rescues/{missing_template.rhtml → missing_template.erb} +0 -0
- data/lib/action_controller/templates/rescues/{routing_error.rhtml → routing_error.erb} +0 -0
- data/lib/action_controller/templates/rescues/{template_error.rhtml → template_error.erb} +2 -2
- data/lib/action_controller/templates/rescues/{unknown_action.rhtml → unknown_action.erb} +0 -0
- data/lib/action_controller/test_case.rb +53 -0
- data/lib/action_controller/test_process.rb +59 -46
- data/lib/action_controller/url_rewriter.rb +48 -24
- data/lib/action_controller/vendor/html-scanner/html/document.rb +7 -4
- data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
- data/lib/action_controller/vendor/html-scanner/html/selector.rb +11 -6
- data/lib/action_controller/verification.rb +27 -21
- data/lib/action_pack.rb +1 -1
- data/lib/action_pack/version.rb +4 -4
- data/lib/action_view.rb +2 -3
- data/lib/action_view/base.rb +218 -63
- data/lib/action_view/compiled_templates.rb +1 -2
- data/lib/action_view/helpers/active_record_helper.rb +35 -17
- data/lib/action_view/helpers/asset_tag_helper.rb +395 -87
- data/lib/action_view/helpers/atom_feed_helper.rb +111 -0
- data/lib/action_view/helpers/benchmark_helper.rb +12 -5
- data/lib/action_view/helpers/cache_helper.rb +29 -0
- data/lib/action_view/helpers/capture_helper.rb +97 -63
- data/lib/action_view/helpers/date_helper.rb +295 -35
- data/lib/action_view/helpers/debug_helper.rb +6 -2
- data/lib/action_view/helpers/form_helper.rb +354 -111
- data/lib/action_view/helpers/form_options_helper.rb +171 -109
- data/lib/action_view/helpers/form_tag_helper.rb +332 -76
- data/lib/action_view/helpers/javascript_helper.rb +35 -11
- data/lib/action_view/helpers/javascripts/controls.js +484 -354
- data/lib/action_view/helpers/javascripts/dragdrop.js +88 -58
- data/lib/action_view/helpers/javascripts/effects.js +396 -364
- data/lib/action_view/helpers/javascripts/prototype.js +2817 -1107
- data/lib/action_view/helpers/number_helper.rb +84 -60
- data/lib/action_view/helpers/prototype_helper.rb +419 -43
- data/lib/action_view/helpers/record_identification_helper.rb +20 -0
- data/lib/action_view/helpers/record_tag_helper.rb +59 -0
- data/lib/action_view/helpers/sanitize_helper.rb +223 -0
- data/lib/action_view/helpers/scriptaculous_helper.rb +63 -4
- data/lib/action_view/helpers/tag_helper.rb +69 -39
- data/lib/action_view/helpers/text_helper.rb +221 -148
- data/lib/action_view/helpers/url_helper.rb +283 -165
- data/lib/action_view/partials.rb +134 -62
- data/lib/action_view/template_error.rb +4 -12
- data/lib/actionpack.rb +1 -0
- data/test/abstract_unit.rb +21 -1
- data/test/action_view_test.rb +26 -0
- data/test/active_record_unit.rb +12 -20
- data/test/activerecord/active_record_store_test.rb +2 -2
- data/test/activerecord/render_partial_with_record_identification_test.rb +74 -0
- data/test/controller/action_pack_assertions_test.rb +21 -152
- data/test/controller/addresses_render_test.rb +2 -7
- data/test/controller/assert_select_test.rb +120 -14
- data/test/controller/base_test.rb +11 -13
- data/test/controller/caching_test.rb +125 -5
- data/test/controller/capture_test.rb +23 -16
- data/test/controller/cgi_test.rb +66 -391
- data/test/controller/components_test.rb +31 -42
- data/test/controller/content_type_test.rb +1 -1
- data/test/controller/cookie_test.rb +42 -14
- data/test/controller/deprecation/deprecated_base_methods_test.rb +1 -42
- data/test/controller/dispatcher_test.rb +123 -0
- data/test/controller/fake_models.rb +5 -0
- data/test/controller/filters_test.rb +44 -7
- data/test/controller/flash_test.rb +46 -2
- data/test/controller/fragment_store_setting_test.rb +10 -8
- data/test/controller/helper_test.rb +19 -2
- data/test/controller/html-scanner/document_test.rb +124 -0
- data/test/controller/html-scanner/node_test.rb +69 -0
- data/test/controller/html-scanner/sanitizer_test.rb +250 -0
- data/test/controller/html-scanner/tag_node_test.rb +239 -0
- data/test/controller/html-scanner/text_node_test.rb +51 -0
- data/test/controller/html-scanner/tokenizer_test.rb +125 -0
- data/test/controller/http_authentication_test.rb +54 -0
- data/test/controller/integration_test.rb +12 -26
- data/test/controller/layout_test.rb +64 -12
- data/test/controller/mime_responds_test.rb +193 -38
- data/test/controller/mime_type_test.rb +30 -8
- data/test/controller/new_render_test.rb +104 -22
- data/test/controller/polymorphic_routes_test.rb +98 -0
- data/test/controller/record_identifier_test.rb +103 -0
- data/test/controller/redirect_test.rb +120 -18
- data/test/controller/render_test.rb +195 -45
- data/test/controller/request_forgery_protection_test.rb +217 -0
- data/test/controller/request_test.rb +545 -27
- data/test/controller/rescue_test.rb +501 -0
- data/test/controller/resources_test.rb +258 -132
- data/test/controller/routing_test.rb +502 -106
- data/test/controller/selector_test.rb +5 -5
- data/test/controller/send_file_test.rb +17 -7
- data/test/controller/session/cookie_store_test.rb +246 -0
- data/test/controller/session/mem_cache_store_test.rb +182 -0
- data/test/controller/session_fixation_test.rb +8 -11
- data/test/controller/session_management_test.rb +7 -7
- data/test/controller/test_test.rb +150 -38
- data/test/controller/url_rewriter_test.rb +87 -12
- data/test/controller/verification_test.rb +11 -0
- data/test/controller/view_paths_test.rb +137 -0
- data/test/controller/webservice_test.rb +11 -75
- data/test/fixtures/addresses/{list.rhtml → list.erb} +0 -0
- data/test/fixtures/db_definitions/sqlite.sql +2 -1
- data/test/fixtures/developer.rb +2 -0
- data/test/fixtures/fun/games/{hello_world.rhtml → hello_world.erb} +0 -0
- data/test/fixtures/helpers/fun/pdf_helper.rb +1 -1
- data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
- data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
- data/test/fixtures/layouts/{builder.rxml → builder.builder} +0 -0
- data/test/fixtures/layouts/{standard.rhtml → standard.erb} +0 -0
- data/test/fixtures/layouts/{talk_from_action.rhtml → talk_from_action.erb} +0 -0
- data/test/fixtures/layouts/{yield.rhtml → yield.erb} +0 -0
- data/test/fixtures/multipart/binary_file +0 -0
- data/test/fixtures/multipart/bracketed_param +5 -0
- data/test/fixtures/override/test/hello_world.erb +1 -0
- data/test/fixtures/override2/layouts/test/sub.erb +1 -0
- data/test/fixtures/post_test/layouts/post.html.erb +1 -0
- data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
- data/test/fixtures/post_test/post/index.html.erb +1 -0
- data/test/fixtures/post_test/post/index.iphone.erb +1 -0
- data/test/fixtures/post_test/super_post/index.html.erb +1 -0
- data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
- data/test/fixtures/public/404.html +1 -0
- data/test/fixtures/public/500.html +1 -0
- data/test/fixtures/public/javascripts/application.js +0 -1
- data/test/fixtures/public/javascripts/bank.js +1 -0
- data/test/fixtures/public/javascripts/robber.js +1 -0
- data/test/fixtures/public/stylesheets/bank.css +1 -0
- data/test/fixtures/public/stylesheets/robber.css +1 -0
- data/test/fixtures/replies.yml +2 -0
- data/test/fixtures/reply.rb +2 -1
- data/test/fixtures/respond_to/{all_types_with_layout.rhtml → all_types_with_layout.html.erb} +0 -0
- data/test/fixtures/respond_to/{all_types_with_layout.rjs → all_types_with_layout.js.rjs} +0 -0
- data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
- data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
- data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
- data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
- data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
- data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
- data/test/fixtures/respond_to/{using_defaults.rhtml → using_defaults.html.erb} +0 -0
- data/test/fixtures/respond_to/{using_defaults.rjs → using_defaults.js.rjs} +0 -0
- data/test/fixtures/respond_to/{using_defaults.rxml → using_defaults.xml.builder} +0 -0
- data/test/fixtures/respond_to/{using_defaults_with_type_list.rhtml → using_defaults_with_type_list.html.erb} +0 -0
- data/test/fixtures/respond_to/{using_defaults_with_type_list.rjs → using_defaults_with_type_list.js.rjs} +0 -0
- data/test/fixtures/respond_to/{using_defaults_with_type_list.rxml → using_defaults_with_type_list.xml.builder} +0 -0
- data/test/fixtures/scope/test/{modgreet.rhtml → modgreet.erb} +0 -0
- data/test/fixtures/test/{_customer.rhtml → _customer.erb} +0 -0
- data/test/fixtures/test/{_customer_greeting.rhtml → _customer_greeting.erb} +0 -0
- data/test/fixtures/test/_hash_greeting.erb +1 -0
- data/test/fixtures/test/_hash_object.erb +2 -0
- data/test/fixtures/test/{_hello.rxml → _hello.builder} +0 -0
- data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
- data/test/fixtures/test/_partial.erb +1 -0
- data/test/fixtures/test/_partial.html.erb +1 -0
- data/test/fixtures/test/_partial.js.erb +1 -0
- data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
- data/test/fixtures/test/{_partial_only.rhtml → _partial_only.erb} +0 -0
- data/test/fixtures/test/{_person.rhtml → _person.erb} +0 -0
- data/test/fixtures/test/{action_talk_to_layout.rhtml → action_talk_to_layout.erb} +0 -0
- data/test/fixtures/test/{block_content_for.rhtml → block_content_for.erb} +0 -0
- data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
- data/test/fixtures/test/{capturing.rhtml → capturing.erb} +0 -0
- data/test/fixtures/test/{content_for.rhtml → content_for.erb} +0 -0
- data/test/fixtures/test/content_for_concatenated.erb +3 -0
- data/test/fixtures/test/content_for_with_parameter.erb +2 -0
- data/test/fixtures/test/dot.directory/{render_file_with_ivar.rhtml → render_file_with_ivar.erb} +0 -0
- data/test/fixtures/test/{erb_content_for.rhtml → erb_content_for.erb} +0 -0
- data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
- data/test/fixtures/test/formatted_xml_erb.builder +1 -0
- data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
- data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
- data/test/fixtures/test/{greeting.rhtml → greeting.erb} +0 -0
- data/test/fixtures/test/{hello.rxml → hello.builder} +0 -0
- data/test/fixtures/test/{hello_world.rxml → hello_world.builder} +0 -0
- data/test/fixtures/test/{hello_world.rhtml → hello_world.erb} +0 -0
- data/test/fixtures/test/{hello_world_container.rxml → hello_world_container.builder} +0 -0
- data/test/fixtures/test/{hello_world_with_layout_false.rhtml → hello_world_with_layout_false.erb} +0 -0
- data/test/fixtures/test/{hello_xml_world.rxml → hello_xml_world.builder} +0 -0
- data/test/fixtures/test/list.erb +1 -0
- data/test/fixtures/test/{non_erb_block_content_for.rxml → non_erb_block_content_for.builder} +0 -0
- data/test/fixtures/test/{potential_conflicts.rhtml → potential_conflicts.erb} +0 -0
- data/test/fixtures/test/{render_file_with_ivar.rhtml → render_file_with_ivar.erb} +0 -0
- data/test/fixtures/test/{render_file_with_locals.rhtml → render_file_with_locals.erb} +0 -0
- data/test/fixtures/test/{render_to_string_test.rhtml → render_to_string_test.erb} +0 -0
- data/test/fixtures/test/{update_element_with_capture.rhtml → update_element_with_capture.erb} +0 -0
- data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
- data/test/fixtures/topic.rb +1 -1
- data/test/template/active_record_helper_test.rb +67 -20
- data/test/template/asset_tag_helper_test.rb +222 -54
- data/test/template/atom_feed_helper_test.rb +101 -0
- data/test/template/benchmark_helper_test.rb +2 -2
- data/test/template/compiled_templates_test.rb +76 -32
- data/test/template/date_helper_test.rb +125 -9
- data/test/template/form_helper_test.rb +326 -33
- data/test/template/form_options_helper_test.rb +822 -15
- data/test/template/form_tag_helper_test.rb +96 -30
- data/test/template/javascript_helper_test.rb +61 -13
- data/test/template/number_helper_test.rb +12 -11
- data/test/template/prototype_helper_test.rb +185 -24
- data/test/template/sanitize_helper_test.rb +49 -0
- data/test/template/scriptaculous_helper_test.rb +9 -3
- data/test/template/tag_helper_test.rb +13 -2
- data/test/template/text_helper_test.rb +38 -52
- data/test/template/url_helper_test.rb +216 -46
- metadata +144 -116
- data/examples/.htaccess +0 -24
- data/examples/address_book/index.rhtml +0 -33
- data/examples/address_book/layout.rhtml +0 -8
- data/examples/address_book_controller.cgi +0 -9
- data/examples/address_book_controller.fcgi +0 -6
- data/examples/address_book_controller.rb +0 -52
- data/examples/address_book_controller.rbx +0 -4
- data/examples/benchmark.rb +0 -52
- data/examples/benchmark_with_ar.fcgi +0 -89
- data/examples/blog_controller.cgi +0 -53
- data/examples/debate/index.rhtml +0 -14
- data/examples/debate/new_topic.rhtml +0 -22
- data/examples/debate/topic.rhtml +0 -32
- data/examples/debate_controller.cgi +0 -57
- data/lib/action_controller/assertions/deprecated_assertions.rb +0 -228
- data/lib/action_controller/cgi_ext/cgi_ext.rb +0 -36
- data/lib/action_controller/cgi_ext/cgi_methods.rb +0 -211
- data/lib/action_controller/cgi_ext/pstore_performance_fix.rb +0 -30
- data/lib/action_controller/cgi_ext/raw_post_data_fix.rb +0 -95
- data/lib/action_controller/cgi_ext/session_performance_fix.rb +0 -30
- data/lib/action_controller/deprecated_dependencies.rb +0 -65
- data/lib/action_controller/deprecated_redirects.rb +0 -17
- data/lib/action_controller/deprecated_request_methods.rb +0 -34
- data/lib/action_controller/macros/auto_complete.rb +0 -53
- data/lib/action_controller/macros/in_place_editing.rb +0 -33
- data/lib/action_controller/pagination.rb +0 -408
- data/lib/action_controller/scaffolding.rb +0 -189
- data/lib/action_controller/templates/rescues/_request_and_response.rhtml +0 -44
- data/lib/action_controller/templates/scaffolds/edit.rhtml +0 -7
- data/lib/action_controller/templates/scaffolds/layout.rhtml +0 -69
- data/lib/action_controller/templates/scaffolds/list.rhtml +0 -27
- data/lib/action_controller/templates/scaffolds/new.rhtml +0 -6
- data/lib/action_controller/templates/scaffolds/show.rhtml +0 -9
- data/lib/action_controller/vendor/xml_node.rb +0 -97
- data/lib/action_view/helpers/deprecated_helper.rb +0 -37
- data/lib/action_view/helpers/java_script_macros_helper.rb +0 -233
- data/lib/action_view/helpers/pagination_helper.rb +0 -86
- data/test/activerecord/active_record_assertions_test.rb +0 -92
- data/test/activerecord/pagination_test.rb +0 -165
- data/test/controller/deprecated_instance_variables_test.rb +0 -48
- data/test/controller/raw_post_test.rb +0 -68
- data/test/fixtures/deprecated_instance_variables/_cookies_ivar.rhtml +0 -1
- data/test/fixtures/deprecated_instance_variables/_cookies_method.rhtml +0 -1
- data/test/fixtures/deprecated_instance_variables/_flash_ivar.rhtml +0 -1
- data/test/fixtures/deprecated_instance_variables/_flash_method.rhtml +0 -1
- data/test/fixtures/deprecated_instance_variables/_headers_ivar.rhtml +0 -1
- data/test/fixtures/deprecated_instance_variables/_headers_method.rhtml +0 -1
- data/test/fixtures/deprecated_instance_variables/_params_ivar.rhtml +0 -1
- data/test/fixtures/deprecated_instance_variables/_params_method.rhtml +0 -1
- data/test/fixtures/deprecated_instance_variables/_request_ivar.rhtml +0 -1
- data/test/fixtures/deprecated_instance_variables/_request_method.rhtml +0 -1
- data/test/fixtures/deprecated_instance_variables/_response_ivar.rhtml +0 -1
- data/test/fixtures/deprecated_instance_variables/_response_method.rhtml +0 -1
- data/test/fixtures/deprecated_instance_variables/_session_ivar.rhtml +0 -1
- data/test/fixtures/deprecated_instance_variables/_session_method.rhtml +0 -1
- data/test/fixtures/respond_to/layouts/standard.rhtml +0 -1
- data/test/fixtures/test/_hash_object.rhtml +0 -1
- data/test/fixtures/test/list.rhtml +0 -1
- data/test/template/deprecated_helper_test.rb +0 -36
- data/test/template/deprecated_instance_variables_test.rb +0 -43
- data/test/template/java_script_macros_helper_test.rb +0 -109
@@ -11,7 +11,7 @@ class RespondToController < ActionController::Base
|
|
11
11
|
type.all { render :text => "Nothing" }
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def js_or_html
|
16
16
|
respond_to do |type|
|
17
17
|
type.html { render :text => "HTML" }
|
@@ -34,13 +34,22 @@ class RespondToController < ActionController::Base
|
|
34
34
|
type.all { render :text => "Nothing" }
|
35
35
|
end
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
|
+
def forced_xml
|
39
|
+
request.format = :xml
|
40
|
+
|
41
|
+
respond_to do |type|
|
42
|
+
type.html { render :text => "HTML" }
|
43
|
+
type.xml { render :text => "XML" }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
38
47
|
def just_xml
|
39
48
|
respond_to do |type|
|
40
49
|
type.xml { render :text => "XML" }
|
41
50
|
end
|
42
51
|
end
|
43
|
-
|
52
|
+
|
44
53
|
def using_defaults
|
45
54
|
respond_to do |type|
|
46
55
|
type.html
|
@@ -48,11 +57,11 @@ class RespondToController < ActionController::Base
|
|
48
57
|
type.xml
|
49
58
|
end
|
50
59
|
end
|
51
|
-
|
60
|
+
|
52
61
|
def using_defaults_with_type_list
|
53
62
|
respond_to(:html, :js, :xml)
|
54
63
|
end
|
55
|
-
|
64
|
+
|
56
65
|
def made_for_content_type
|
57
66
|
respond_to do |type|
|
58
67
|
type.rss { render :text => "RSS" }
|
@@ -68,7 +77,7 @@ class RespondToController < ActionController::Base
|
|
68
77
|
type.all { render :text => "Nothing" }
|
69
78
|
end
|
70
79
|
end
|
71
|
-
|
80
|
+
|
72
81
|
def custom_constant_handling
|
73
82
|
Mime::Type.register("text/x-mobile", :mobile)
|
74
83
|
|
@@ -76,10 +85,10 @@ class RespondToController < ActionController::Base
|
|
76
85
|
type.html { render :text => "HTML" }
|
77
86
|
type.mobile { render :text => "Mobile" }
|
78
87
|
end
|
79
|
-
|
80
|
-
Mime.
|
88
|
+
ensure
|
89
|
+
Mime.module_eval { remove_const :MOBILE if const_defined?(:MOBILE) }
|
81
90
|
end
|
82
|
-
|
91
|
+
|
83
92
|
def custom_constant_handling_without_block
|
84
93
|
Mime::Type.register("text/x-mobile", :mobile)
|
85
94
|
|
@@ -87,10 +96,10 @@ class RespondToController < ActionController::Base
|
|
87
96
|
type.html { render :text => "HTML" }
|
88
97
|
type.mobile
|
89
98
|
end
|
90
|
-
|
91
|
-
|
99
|
+
|
100
|
+
ensure
|
101
|
+
Mime.module_eval { remove_const :MOBILE if const_defined?(:MOBILE) }
|
92
102
|
end
|
93
|
-
|
94
103
|
|
95
104
|
def handle_any
|
96
105
|
respond_to do |type|
|
@@ -104,21 +113,49 @@ class RespondToController < ActionController::Base
|
|
104
113
|
type.html
|
105
114
|
type.js
|
106
115
|
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def iphone_with_html_response_type
|
119
|
+
Mime::Type.register_alias("text/html", :iphone)
|
120
|
+
request.format = :iphone if request.env["HTTP_ACCEPT"] == "text/iphone"
|
121
|
+
|
122
|
+
respond_to do |type|
|
123
|
+
type.html { @type = "Firefox" }
|
124
|
+
type.iphone { @type = "iPhone" }
|
125
|
+
end
|
126
|
+
|
127
|
+
ensure
|
128
|
+
Mime.module_eval { remove_const :IPHONE if const_defined?(:IPHONE) }
|
129
|
+
end
|
130
|
+
|
131
|
+
def iphone_with_html_response_type_without_layout
|
132
|
+
Mime::Type.register_alias("text/html", :iphone)
|
133
|
+
request.format = "iphone" if request.env["HTTP_ACCEPT"] == "text/iphone"
|
134
|
+
|
135
|
+
respond_to do |type|
|
136
|
+
type.html { @type = "Firefox"; render :action => "iphone_with_html_response_type" }
|
137
|
+
type.iphone { @type = "iPhone" ; render :action => "iphone_with_html_response_type" }
|
138
|
+
end
|
139
|
+
|
140
|
+
ensure
|
141
|
+
Mime.module_eval { remove_const :IPHONE if const_defined?(:IPHONE) }
|
107
142
|
end
|
108
143
|
|
109
144
|
def rescue_action(e)
|
110
145
|
raise
|
111
146
|
end
|
112
|
-
|
147
|
+
|
113
148
|
protected
|
114
149
|
def set_layout
|
115
|
-
if
|
116
|
-
"standard"
|
150
|
+
if ["all_types_with_layout", "iphone_with_html_response_type"].include?(action_name)
|
151
|
+
"respond_to/layouts/standard"
|
152
|
+
elsif action_name == "iphone_with_html_response_type_without_layout"
|
153
|
+
"respond_to/layouts/missing"
|
117
154
|
end
|
118
155
|
end
|
119
156
|
end
|
120
157
|
|
121
|
-
RespondToController.
|
158
|
+
RespondToController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
|
122
159
|
|
123
160
|
class MimeControllerTest < Test::Unit::TestCase
|
124
161
|
def setup
|
@@ -128,12 +165,12 @@ class MimeControllerTest < Test::Unit::TestCase
|
|
128
165
|
@controller = RespondToController.new
|
129
166
|
@request.host = "www.example.com"
|
130
167
|
end
|
131
|
-
|
168
|
+
|
132
169
|
def test_html
|
133
170
|
@request.env["HTTP_ACCEPT"] = "text/html"
|
134
171
|
get :js_or_html
|
135
172
|
assert_equal 'HTML', @response.body
|
136
|
-
|
173
|
+
|
137
174
|
get :html_or_xml
|
138
175
|
assert_equal 'HTML', @response.body
|
139
176
|
|
@@ -207,41 +244,49 @@ class MimeControllerTest < Test::Unit::TestCase
|
|
207
244
|
def test_using_defaults
|
208
245
|
@request.env["HTTP_ACCEPT"] = "*/*"
|
209
246
|
get :using_defaults
|
247
|
+
assert_equal "text/html", @response.content_type
|
210
248
|
assert_equal 'Hello world!', @response.body
|
211
249
|
|
212
250
|
@request.env["HTTP_ACCEPT"] = "text/javascript"
|
213
251
|
get :using_defaults
|
252
|
+
assert_equal "text/javascript", @response.content_type
|
214
253
|
assert_equal '$("body").visualEffect("highlight");', @response.body
|
215
254
|
|
216
255
|
@request.env["HTTP_ACCEPT"] = "application/xml"
|
217
256
|
get :using_defaults
|
257
|
+
assert_equal "application/xml", @response.content_type
|
218
258
|
assert_equal "<p>Hello world!</p>\n", @response.body
|
219
259
|
end
|
220
|
-
|
260
|
+
|
221
261
|
def test_using_defaults_with_type_list
|
222
262
|
@request.env["HTTP_ACCEPT"] = "*/*"
|
223
263
|
get :using_defaults_with_type_list
|
264
|
+
assert_equal "text/html", @response.content_type
|
224
265
|
assert_equal 'Hello world!', @response.body
|
225
266
|
|
226
267
|
@request.env["HTTP_ACCEPT"] = "text/javascript"
|
227
268
|
get :using_defaults_with_type_list
|
269
|
+
assert_equal "text/javascript", @response.content_type
|
228
270
|
assert_equal '$("body").visualEffect("highlight");', @response.body
|
229
271
|
|
230
272
|
@request.env["HTTP_ACCEPT"] = "application/xml"
|
231
273
|
get :using_defaults_with_type_list
|
274
|
+
assert_equal "application/xml", @response.content_type
|
232
275
|
assert_equal "<p>Hello world!</p>\n", @response.body
|
233
276
|
end
|
234
|
-
|
235
|
-
def
|
277
|
+
|
278
|
+
def test_with_atom_content_type
|
236
279
|
@request.env["CONTENT_TYPE"] = "application/atom+xml"
|
237
280
|
get :made_for_content_type
|
238
281
|
assert_equal "ATOM", @response.body
|
282
|
+
end
|
239
283
|
|
284
|
+
def test_with_rss_content_type
|
240
285
|
@request.env["CONTENT_TYPE"] = "application/rss+xml"
|
241
286
|
get :made_for_content_type
|
242
287
|
assert_equal "RSS", @response.body
|
243
288
|
end
|
244
|
-
|
289
|
+
|
245
290
|
def test_synonyms
|
246
291
|
@request.env["HTTP_ACCEPT"] = "application/javascript"
|
247
292
|
get :js_or_html
|
@@ -251,14 +296,16 @@ class MimeControllerTest < Test::Unit::TestCase
|
|
251
296
|
get :html_xml_or_rss
|
252
297
|
assert_equal "XML", @response.body
|
253
298
|
end
|
254
|
-
|
299
|
+
|
255
300
|
def test_custom_types
|
256
301
|
@request.env["HTTP_ACCEPT"] = "application/crazy-xml"
|
257
302
|
get :custom_type_handling
|
303
|
+
assert_equal "application/crazy-xml", @response.content_type
|
258
304
|
assert_equal 'Crazy XML', @response.body
|
259
305
|
|
260
306
|
@request.env["HTTP_ACCEPT"] = "text/html"
|
261
307
|
get :custom_type_handling
|
308
|
+
assert_equal "text/html", @response.content_type
|
262
309
|
assert_equal 'HTML', @response.body
|
263
310
|
end
|
264
311
|
|
@@ -267,7 +314,7 @@ class MimeControllerTest < Test::Unit::TestCase
|
|
267
314
|
get :html_or_xml
|
268
315
|
assert_equal 'HTML', @response.body
|
269
316
|
end
|
270
|
-
|
317
|
+
|
271
318
|
def test_firefox_simulation
|
272
319
|
@request.env["HTTP_ACCEPT"] = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"
|
273
320
|
get :html_or_xml
|
@@ -287,15 +334,17 @@ class MimeControllerTest < Test::Unit::TestCase
|
|
287
334
|
get :handle_any
|
288
335
|
assert_equal 'Either JS or XML', @response.body
|
289
336
|
end
|
290
|
-
|
291
|
-
def
|
337
|
+
|
338
|
+
def test_rjs_type_skips_layout
|
292
339
|
@request.env["HTTP_ACCEPT"] = "text/javascript"
|
293
340
|
get :all_types_with_layout
|
294
341
|
assert_equal 'RJS for all_types_with_layout', @response.body
|
342
|
+
end
|
295
343
|
|
344
|
+
def test_html_type_with_layout
|
296
345
|
@request.env["HTTP_ACCEPT"] = "text/html"
|
297
346
|
get :all_types_with_layout
|
298
|
-
assert_equal '<html>HTML for all_types_with_layout</html>', @response.body
|
347
|
+
assert_equal '<html><div id="html">HTML for all_types_with_layout</div></html>', @response.body
|
299
348
|
end
|
300
349
|
|
301
350
|
def test_xhr
|
@@ -305,19 +354,19 @@ class MimeControllerTest < Test::Unit::TestCase
|
|
305
354
|
xhr :get, :using_defaults
|
306
355
|
assert_equal '$("body").visualEffect("highlight");', @response.body
|
307
356
|
end
|
308
|
-
|
357
|
+
|
309
358
|
def test_custom_constant
|
310
359
|
get :custom_constant_handling, :format => "mobile"
|
360
|
+
assert_equal "text/x-mobile", @response.content_type
|
311
361
|
assert_equal "Mobile", @response.body
|
312
362
|
end
|
313
|
-
|
314
|
-
def
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
end
|
363
|
+
|
364
|
+
def test_custom_constant_handling_without_block
|
365
|
+
get :custom_constant_handling_without_block, :format => "mobile"
|
366
|
+
assert_equal "text/x-mobile", @response.content_type
|
367
|
+
assert_equal "Mobile", @response.body
|
319
368
|
end
|
320
|
-
|
369
|
+
|
321
370
|
def test_forced_format
|
322
371
|
get :html_xml_or_rss
|
323
372
|
assert_equal "HTML", @response.body
|
@@ -332,20 +381,126 @@ class MimeControllerTest < Test::Unit::TestCase
|
|
332
381
|
assert_equal "RSS", @response.body
|
333
382
|
end
|
334
383
|
|
384
|
+
def test_internally_forced_format
|
385
|
+
get :forced_xml
|
386
|
+
assert_equal "XML", @response.body
|
387
|
+
|
388
|
+
get :forced_xml, :format => "html"
|
389
|
+
assert_equal "XML", @response.body
|
390
|
+
end
|
391
|
+
|
392
|
+
def test_extension_synonyms
|
393
|
+
get :html_xml_or_rss, :format => "xhtml"
|
394
|
+
assert_equal "HTML", @response.body
|
395
|
+
end
|
396
|
+
|
335
397
|
def test_render_action_for_html
|
336
398
|
@controller.instance_eval do
|
337
399
|
def render(*args)
|
338
400
|
unless args.empty?
|
339
401
|
@action = args.first[:action]
|
340
402
|
end
|
341
|
-
response.body = @action
|
403
|
+
response.body = "#{@action} - #{@template.template_format}"
|
342
404
|
end
|
343
405
|
end
|
344
406
|
|
345
407
|
get :using_defaults
|
346
|
-
assert_equal "using_defaults", @response.body
|
408
|
+
assert_equal "using_defaults - html", @response.body
|
347
409
|
|
348
410
|
get :using_defaults, :format => "xml"
|
349
|
-
assert_equal "using_defaults
|
411
|
+
assert_equal "using_defaults - xml", @response.body
|
412
|
+
end
|
413
|
+
|
414
|
+
def test_format_with_custom_response_type
|
415
|
+
get :iphone_with_html_response_type
|
416
|
+
assert_equal '<html><div id="html">Hello future from Firefox!</div></html>', @response.body
|
417
|
+
|
418
|
+
get :iphone_with_html_response_type, :format => "iphone"
|
419
|
+
assert_equal "text/html", @response.content_type
|
420
|
+
assert_equal '<html><div id="iphone">Hello iPhone future from iPhone!</div></html>', @response.body
|
421
|
+
end
|
422
|
+
|
423
|
+
def test_format_with_custom_response_type_and_request_headers
|
424
|
+
@request.env["HTTP_ACCEPT"] = "text/iphone"
|
425
|
+
get :iphone_with_html_response_type
|
426
|
+
assert_equal '<html><div id="iphone">Hello iPhone future from iPhone!</div></html>', @response.body
|
427
|
+
assert_equal "text/html", @response.content_type
|
428
|
+
end
|
429
|
+
|
430
|
+
def test_format_with_custom_response_type_and_request_headers_with_only_one_layout_present
|
431
|
+
get :iphone_with_html_response_type_without_layout
|
432
|
+
assert_equal '<html><div id="html_missing">Hello future from Firefox!</div></html>', @response.body
|
433
|
+
|
434
|
+
@request.env["HTTP_ACCEPT"] = "text/iphone"
|
435
|
+
assert_raises(ActionController::MissingTemplate) { get :iphone_with_html_response_type_without_layout }
|
436
|
+
end
|
437
|
+
end
|
438
|
+
|
439
|
+
class AbstractPostController < ActionController::Base
|
440
|
+
class << self
|
441
|
+
def view_paths
|
442
|
+
[ File.dirname(__FILE__) + "/../fixtures/post_test/" ]
|
443
|
+
end
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
447
|
+
# For testing layouts which are set automatically
|
448
|
+
class PostController < AbstractPostController
|
449
|
+
around_filter :with_iphone
|
450
|
+
|
451
|
+
def index
|
452
|
+
respond_to do |type|
|
453
|
+
type.html
|
454
|
+
type.iphone
|
455
|
+
end
|
456
|
+
end
|
457
|
+
|
458
|
+
protected
|
459
|
+
def with_iphone
|
460
|
+
Mime::Type.register_alias("text/html", :iphone)
|
461
|
+
request.format = "iphone" if request.env["HTTP_ACCEPT"] == "text/iphone"
|
462
|
+
yield
|
463
|
+
ensure
|
464
|
+
Mime.module_eval { remove_const :IPHONE if const_defined?(:IPHONE) }
|
465
|
+
end
|
466
|
+
end
|
467
|
+
|
468
|
+
class SuperPostController < PostController
|
469
|
+
def index
|
470
|
+
respond_to do |type|
|
471
|
+
type.html
|
472
|
+
type.iphone
|
473
|
+
end
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
class MimeControllerLayoutsTest < Test::Unit::TestCase
|
478
|
+
def setup
|
479
|
+
@request = ActionController::TestRequest.new
|
480
|
+
@response = ActionController::TestResponse.new
|
481
|
+
|
482
|
+
@controller = PostController.new
|
483
|
+
@request.host = "www.example.com"
|
484
|
+
end
|
485
|
+
|
486
|
+
def test_missing_layout_renders_properly
|
487
|
+
get :index
|
488
|
+
assert_equal '<html><div id="html">Hello Firefox</div></html>', @response.body
|
489
|
+
|
490
|
+
@request.env["HTTP_ACCEPT"] = "text/iphone"
|
491
|
+
get :index
|
492
|
+
assert_equal 'Hello iPhone', @response.body
|
493
|
+
end
|
494
|
+
|
495
|
+
def test_format_with_inherited_layouts
|
496
|
+
@controller = SuperPostController.new
|
497
|
+
|
498
|
+
get :index
|
499
|
+
assert_equal 'Super Firefox', @response.body
|
500
|
+
|
501
|
+
@request.env["HTTP_ACCEPT"] = "text/iphone"
|
502
|
+
get :index
|
503
|
+
assert_equal '<html><div id="super_iphone">Super iPhone</div></html>', @response.body
|
350
504
|
end
|
351
505
|
end
|
506
|
+
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../abstract_unit'
|
2
2
|
|
3
3
|
class MimeTypeTest < Test::Unit::TestCase
|
4
|
-
Mime::
|
5
|
-
Mime::
|
4
|
+
Mime::Type.register "image/png", :png
|
5
|
+
Mime::Type.register "application/pdf", :pdf
|
6
6
|
|
7
7
|
def test_parse_single
|
8
8
|
Mime::LOOKUP.keys.each do |mime_type|
|
@@ -11,23 +11,45 @@ class MimeTypeTest < Test::Unit::TestCase
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def test_parse_without_q
|
14
|
-
accept = "text/xml,application/xhtml+xml,text/yaml,application/xml,text/html,image/png,text/plain,*/*"
|
15
|
-
expect = [Mime::HTML, Mime::XML, Mime::YAML, Mime::PNG, Mime::
|
14
|
+
accept = "text/xml,application/xhtml+xml,text/yaml,application/xml,text/html,image/png,text/plain,application/pdf,*/*"
|
15
|
+
expect = [Mime::HTML, Mime::XML, Mime::YAML, Mime::PNG, Mime::TEXT, Mime::PDF, Mime::ALL]
|
16
16
|
assert_equal expect, Mime::Type.parse(accept)
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_parse_with_q
|
20
|
-
accept = "text/xml,application/xhtml+xml,text/yaml; q=0.3,application/xml,text/html; q=0.8,image/png,text/plain; q=0.5,*/*; q=0.2"
|
21
|
-
expect = [Mime::HTML, Mime::XML, Mime::PNG, Mime::
|
20
|
+
accept = "text/xml,application/xhtml+xml,text/yaml; q=0.3,application/xml,text/html; q=0.8,image/png,text/plain; q=0.5,application/pdf,*/*; q=0.2"
|
21
|
+
expect = [Mime::HTML, Mime::XML, Mime::PNG, Mime::PDF, Mime::TEXT, Mime::YAML, Mime::ALL]
|
22
22
|
assert_equal expect, Mime::Type.parse(accept)
|
23
23
|
end
|
24
24
|
|
25
|
+
# Accept header send with user HTTP_USER_AGENT: Sunrise/0.42j (Windows XP)
|
26
|
+
def test_parse_crappy_broken_acceptlines
|
27
|
+
accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/*,,*/*;q=0.5"
|
28
|
+
expect = [Mime::HTML, Mime::XML, "image/*", Mime::TEXT, Mime::ALL]
|
29
|
+
assert_equal expect, Mime::Type.parse(accept).collect { |c| c.to_s }
|
30
|
+
end
|
31
|
+
|
25
32
|
def test_custom_type
|
26
33
|
Mime::Type.register("image/gif", :gif)
|
27
34
|
assert_nothing_raised do
|
28
35
|
Mime::GIF
|
29
36
|
assert_equal Mime::GIF, Mime::SET.last
|
30
37
|
end
|
31
|
-
|
38
|
+
ensure
|
39
|
+
Mime.module_eval { remove_const :GIF if const_defined?(:GIF) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_type_convenience_methods
|
43
|
+
types = [:html, :xml, :png, :pdf, :yaml, :url_encoded_form]
|
44
|
+
types.each do |type|
|
45
|
+
mime = Mime.const_get(type.to_s.upcase)
|
46
|
+
assert mime.send("#{type}?"), "Mime::#{type.to_s.upcase} is not #{type}?"
|
47
|
+
(types - [type]).each { |t| assert !mime.send("#{t}?"), "Mime::#{t.to_s.upcase} is #{t}?" }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_mime_all_is_html
|
52
|
+
assert Mime::ALL.all?, "Mime::ALL is not all?"
|
53
|
+
assert Mime::ALL.html?, "Mime::ALL is not html?"
|
32
54
|
end
|
33
|
-
end
|
55
|
+
end
|