eactionpack 2.1.2
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.
- data/CHANGELOG +7 -0
- data/MIT-LICENSE +21 -0
- data/README +469 -0
- data/RUNNING_UNIT_TESTS +24 -0
- data/Rakefile +146 -0
- data/install.rb +30 -0
- data/lib/action_controller.rb +79 -0
- data/lib/action_controller/assertions.rb +69 -0
- data/lib/action_controller/assertions/dom_assertions.rb +39 -0
- data/lib/action_controller/assertions/model_assertions.rb +20 -0
- data/lib/action_controller/assertions/response_assertions.rb +172 -0
- data/lib/action_controller/assertions/routing_assertions.rb +146 -0
- data/lib/action_controller/assertions/selector_assertions.rb +491 -0
- data/lib/action_controller/assertions/tag_assertions.rb +130 -0
- data/lib/action_controller/base.rb +1288 -0
- data/lib/action_controller/benchmarking.rb +94 -0
- data/lib/action_controller/caching.rb +72 -0
- data/lib/action_controller/caching/actions.rb +144 -0
- data/lib/action_controller/caching/fragments.rb +138 -0
- data/lib/action_controller/caching/pages.rb +154 -0
- data/lib/action_controller/caching/sql_cache.rb +18 -0
- data/lib/action_controller/caching/sweeping.rb +97 -0
- data/lib/action_controller/cgi_ext.rb +16 -0
- data/lib/action_controller/cgi_ext/cookie.rb +110 -0
- 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 +24 -0
- data/lib/action_controller/cgi_process.rb +223 -0
- data/lib/action_controller/components.rb +166 -0
- data/lib/action_controller/cookies.rb +96 -0
- data/lib/action_controller/dispatcher.rb +162 -0
- data/lib/action_controller/filters.rb +642 -0
- data/lib/action_controller/flash.rb +172 -0
- data/lib/action_controller/headers.rb +31 -0
- data/lib/action_controller/helpers.rb +221 -0
- data/lib/action_controller/http_authentication.rb +124 -0
- data/lib/action_controller/integration.rb +634 -0
- data/lib/action_controller/layout.rb +309 -0
- data/lib/action_controller/mime_responds.rb +173 -0
- data/lib/action_controller/mime_type.rb +186 -0
- data/lib/action_controller/mime_types.rb +20 -0
- data/lib/action_controller/polymorphic_routes.rb +191 -0
- data/lib/action_controller/record_identifier.rb +102 -0
- data/lib/action_controller/request.rb +764 -0
- data/lib/action_controller/request_forgery_protection.rb +140 -0
- data/lib/action_controller/request_profiler.rb +169 -0
- data/lib/action_controller/rescue.rb +258 -0
- data/lib/action_controller/resources.rb +572 -0
- data/lib/action_controller/response.rb +76 -0
- data/lib/action_controller/routing.rb +387 -0
- data/lib/action_controller/routing/builder.rb +203 -0
- data/lib/action_controller/routing/optimisations.rb +120 -0
- data/lib/action_controller/routing/recognition_optimisation.rb +162 -0
- data/lib/action_controller/routing/route.rb +240 -0
- data/lib/action_controller/routing/route_set.rb +436 -0
- data/lib/action_controller/routing/routing_ext.rb +46 -0
- data/lib/action_controller/routing/segments.rb +283 -0
- data/lib/action_controller/session/active_record_store.rb +340 -0
- data/lib/action_controller/session/cookie_store.rb +166 -0
- data/lib/action_controller/session/drb_server.rb +32 -0
- data/lib/action_controller/session/drb_store.rb +35 -0
- data/lib/action_controller/session/mem_cache_store.rb +98 -0
- data/lib/action_controller/session_management.rb +158 -0
- data/lib/action_controller/status_codes.rb +88 -0
- data/lib/action_controller/streaming.rb +155 -0
- data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
- data/lib/action_controller/templates/rescues/_trace.erb +26 -0
- data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
- data/lib/action_controller/templates/rescues/layout.erb +29 -0
- data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
- data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
- data/lib/action_controller/templates/rescues/template_error.erb +21 -0
- data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
- data/lib/action_controller/test_case.rb +83 -0
- data/lib/action_controller/test_process.rb +526 -0
- data/lib/action_controller/url_rewriter.rb +142 -0
- data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
- data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
- data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
- data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
- data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
- data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
- data/lib/action_controller/verification.rb +130 -0
- data/lib/action_pack.rb +24 -0
- data/lib/action_pack/version.rb +9 -0
- data/lib/action_view.rb +44 -0
- data/lib/action_view/base.rb +335 -0
- data/lib/action_view/helpers/active_record_helper.rb +276 -0
- data/lib/action_view/helpers/asset_tag_helper.rb +599 -0
- data/lib/action_view/helpers/atom_feed_helper.rb +143 -0
- data/lib/action_view/helpers/benchmark_helper.rb +33 -0
- data/lib/action_view/helpers/cache_helper.rb +40 -0
- data/lib/action_view/helpers/capture_helper.rb +161 -0
- data/lib/action_view/helpers/date_helper.rb +711 -0
- data/lib/action_view/helpers/debug_helper.rb +31 -0
- data/lib/action_view/helpers/form_helper.rb +767 -0
- data/lib/action_view/helpers/form_options_helper.rb +458 -0
- data/lib/action_view/helpers/form_tag_helper.rb +458 -0
- data/lib/action_view/helpers/javascript_helper.rb +148 -0
- data/lib/action_view/helpers/number_helper.rb +186 -0
- 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 +229 -0
- data/lib/action_view/helpers/tag_helper.rb +134 -0
- data/lib/action_view/helpers/text_helper.rb +507 -0
- data/lib/action_view/helpers/url_helper.rb +573 -0
- data/lib/action_view/inline_template.rb +20 -0
- data/lib/action_view/partial_template.rb +70 -0
- data/lib/action_view/partials.rb +158 -0
- data/lib/action_view/template.rb +125 -0
- data/lib/action_view/template_error.rb +110 -0
- data/lib/action_view/template_finder.rb +176 -0
- data/lib/action_view/template_handler.rb +34 -0
- data/lib/action_view/template_handlers/builder.rb +27 -0
- data/lib/action_view/template_handlers/compilable.rb +128 -0
- data/lib/action_view/template_handlers/erb.rb +56 -0
- data/lib/action_view/test_case.rb +58 -0
- data/lib/actionpack.rb +1 -0
- data/test/abstract_unit.rb +36 -0
- data/test/active_record_unit.rb +105 -0
- data/test/activerecord/active_record_store_test.rb +141 -0
- data/test/activerecord/render_partial_with_record_identification_test.rb +191 -0
- data/test/adv_attr_test.rb +20 -0
- data/test/controller/action_pack_assertions_test.rb +543 -0
- data/test/controller/addresses_render_test.rb +43 -0
- data/test/controller/assert_select_test.rb +331 -0
- data/test/controller/base_test.rb +219 -0
- data/test/controller/benchmark_test.rb +32 -0
- data/test/controller/caching_test.rb +581 -0
- data/test/controller/capture_test.rb +89 -0
- data/test/controller/cgi_test.rb +116 -0
- data/test/controller/components_test.rb +140 -0
- data/test/controller/content_type_test.rb +139 -0
- data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
- data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
- data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
- data/test/controller/cookie_test.rb +146 -0
- data/test/controller/custom_handler_test.rb +45 -0
- data/test/controller/deprecation/deprecated_base_methods_test.rb +37 -0
- data/test/controller/dispatcher_test.rb +105 -0
- data/test/controller/fake_controllers.rb +33 -0
- data/test/controller/fake_models.rb +11 -0
- data/test/controller/filter_params_test.rb +49 -0
- data/test/controller/filters_test.rb +881 -0
- data/test/controller/flash_test.rb +146 -0
- data/test/controller/header_test.rb +14 -0
- data/test/controller/helper_test.rb +210 -0
- data/test/controller/html-scanner/cdata_node_test.rb +15 -0
- data/test/controller/html-scanner/document_test.rb +148 -0
- data/test/controller/html-scanner/node_test.rb +89 -0
- data/test/controller/html-scanner/sanitizer_test.rb +269 -0
- data/test/controller/html-scanner/tag_node_test.rb +238 -0
- data/test/controller/html-scanner/text_node_test.rb +50 -0
- data/test/controller/html-scanner/tokenizer_test.rb +131 -0
- data/test/controller/http_authentication_test.rb +54 -0
- data/test/controller/integration_test.rb +252 -0
- data/test/controller/integration_upload_test.rb +43 -0
- data/test/controller/layout_test.rb +255 -0
- data/test/controller/mime_responds_test.rb +514 -0
- data/test/controller/mime_type_test.rb +84 -0
- data/test/controller/new_render_test.rb +843 -0
- data/test/controller/polymorphic_routes_test.rb +174 -0
- data/test/controller/record_identifier_test.rb +139 -0
- data/test/controller/redirect_test.rb +289 -0
- data/test/controller/render_test.rb +484 -0
- data/test/controller/request_forgery_protection_test.rb +305 -0
- data/test/controller/request_test.rb +928 -0
- data/test/controller/rescue_test.rb +517 -0
- data/test/controller/resources_test.rb +873 -0
- data/test/controller/routing_test.rb +2464 -0
- data/test/controller/selector_test.rb +628 -0
- data/test/controller/send_file_test.rb +138 -0
- data/test/controller/session/cookie_store_test.rb +258 -0
- data/test/controller/session/mem_cache_store_test.rb +181 -0
- data/test/controller/session_fixation_test.rb +89 -0
- data/test/controller/session_management_test.rb +178 -0
- data/test/controller/test_test.rb +695 -0
- data/test/controller/url_rewriter_test.rb +310 -0
- data/test/controller/verification_test.rb +270 -0
- data/test/controller/view_paths_test.rb +140 -0
- data/test/controller/webservice_test.rb +229 -0
- data/test/fixtures/addresses/list.erb +1 -0
- data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
- data/test/fixtures/companies.yml +24 -0
- data/test/fixtures/company.rb +10 -0
- data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
- data/test/fixtures/content_type/render_default_for_js.js.erb +1 -0
- data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
- data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
- data/test/fixtures/customers/_customer.html.erb +1 -0
- data/test/fixtures/db_definitions/sqlite.sql +49 -0
- data/test/fixtures/developer.rb +9 -0
- data/test/fixtures/developers.yml +21 -0
- data/test/fixtures/developers_projects.yml +13 -0
- data/test/fixtures/fun/games/hello_world.erb +1 -0
- data/test/fixtures/functional_caching/_partial.erb +3 -0
- data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
- data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
- data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
- data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
- data/test/fixtures/helpers/abc_helper.rb +5 -0
- data/test/fixtures/helpers/fun/games_helper.rb +3 -0
- data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
- data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
- data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
- data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
- data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
- data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
- data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
- data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
- data/test/fixtures/layouts/block_with_layout.erb +3 -0
- data/test/fixtures/layouts/builder.builder +3 -0
- data/test/fixtures/layouts/partial_with_layout.erb +3 -0
- data/test/fixtures/layouts/standard.erb +1 -0
- data/test/fixtures/layouts/talk_from_action.erb +2 -0
- data/test/fixtures/layouts/yield.erb +2 -0
- data/test/fixtures/mascot.rb +3 -0
- data/test/fixtures/mascots.yml +4 -0
- data/test/fixtures/mascots/_mascot.html.erb +1 -0
- data/test/fixtures/multipart/binary_file +0 -0
- data/test/fixtures/multipart/boundary_problem_file +10 -0
- data/test/fixtures/multipart/bracketed_param +5 -0
- data/test/fixtures/multipart/large_text_file +10 -0
- data/test/fixtures/multipart/mixed_files +0 -0
- data/test/fixtures/multipart/mona_lisa.jpg +0 -0
- data/test/fixtures/multipart/single_parameter +5 -0
- data/test/fixtures/multipart/text_file +10 -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/project.rb +3 -0
- data/test/fixtures/projects.yml +7 -0
- data/test/fixtures/public/404.html +1 -0
- data/test/fixtures/public/500.html +1 -0
- data/test/fixtures/public/images/rails.png +0 -0
- data/test/fixtures/public/javascripts/application.js +1 -0
- data/test/fixtures/public/javascripts/bank.js +1 -0
- data/test/fixtures/public/javascripts/robber.js +1 -0
- data/test/fixtures/public/javascripts/version.1.0.js +1 -0
- data/test/fixtures/public/stylesheets/bank.css +1 -0
- data/test/fixtures/public/stylesheets/robber.css +1 -0
- data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
- data/test/fixtures/replies.yml +15 -0
- data/test/fixtures/reply.rb +7 -0
- data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -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.html.erb +1 -0
- data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
- data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
- data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
- data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
- data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
- data/test/fixtures/scope/test/modgreet.erb +1 -0
- data/test/fixtures/shared.html.erb +1 -0
- data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
- data/test/fixtures/test/_customer.erb +1 -0
- data/test/fixtures/test/_customer_counter.erb +1 -0
- data/test/fixtures/test/_customer_greeting.erb +1 -0
- data/test/fixtures/test/_form.erb +1 -0
- data/test/fixtures/test/_hash_greeting.erb +1 -0
- data/test/fixtures/test/_hash_object.erb +2 -0
- data/test/fixtures/test/_hello.builder +1 -0
- data/test/fixtures/test/_labelling_form.erb +1 -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.erb +1 -0
- data/test/fixtures/test/_person.erb +2 -0
- data/test/fixtures/test/_raise.html.erb +1 -0
- data/test/fixtures/test/action_talk_to_layout.erb +2 -0
- data/test/fixtures/test/block_content_for.erb +2 -0
- data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
- data/test/fixtures/test/capturing.erb +4 -0
- data/test/fixtures/test/content_for.erb +2 -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/delete_with_js.rjs +2 -0
- data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
- data/test/fixtures/test/enum_rjs_test.rjs +6 -0
- data/test/fixtures/test/erb_content_for.erb +2 -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.erb +1 -0
- data/test/fixtures/test/greeting.js.rjs +1 -0
- data/test/fixtures/test/hello.builder +4 -0
- data/test/fixtures/test/hello_world.erb +1 -0
- data/test/fixtures/test/hello_world_container.builder +3 -0
- data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
- data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
- data/test/fixtures/test/hello_xml_world.builder +11 -0
- data/test/fixtures/test/list.erb +1 -0
- data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
- data/test/fixtures/test/potential_conflicts.erb +4 -0
- data/test/fixtures/test/render_file_from_template.html.erb +1 -0
- data/test/fixtures/test/render_file_with_ivar.erb +1 -0
- data/test/fixtures/test/render_file_with_locals.erb +1 -0
- data/test/fixtures/test/render_to_string_test.erb +1 -0
- data/test/fixtures/test/update_element_with_capture.erb +9 -0
- data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
- data/test/fixtures/topic.rb +3 -0
- data/test/fixtures/topics.yml +22 -0
- data/test/fixtures/topics/_topic.html.erb +1 -0
- data/test/template/active_record_helper_test.rb +268 -0
- data/test/template/asset_tag_helper_test.rb +514 -0
- data/test/template/atom_feed_helper_test.rb +179 -0
- data/test/template/benchmark_helper_test.rb +60 -0
- data/test/template/date_helper_test.rb +1791 -0
- data/test/template/deprecated_erb_variable_test.rb +9 -0
- data/test/template/erb_util_test.rb +24 -0
- data/test/template/form_helper_test.rb +885 -0
- data/test/template/form_options_helper_test.rb +1333 -0
- data/test/template/form_tag_helper_test.rb +272 -0
- data/test/template/javascript_helper_test.rb +73 -0
- data/test/template/number_helper_test.rb +97 -0
- data/test/template/record_tag_helper_test.rb +54 -0
- data/test/template/sanitize_helper_test.rb +48 -0
- data/test/template/tag_helper_test.rb +77 -0
- data/test/template/template_finder_test.rb +73 -0
- data/test/template/template_object_test.rb +95 -0
- data/test/template/test_test.rb +56 -0
- data/test/template/text_helper_test.rb +367 -0
- data/test/template/url_helper_test.rb +544 -0
- data/test/testing_sandbox.rb +15 -0
- metadata +469 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
require 'abstract_unit'
|
|
2
|
+
|
|
3
|
+
class CaptureController < ActionController::Base
|
|
4
|
+
def self.controller_name; "test"; end
|
|
5
|
+
def self.controller_path; "test"; end
|
|
6
|
+
|
|
7
|
+
def content_for
|
|
8
|
+
render :layout => "talk_from_action"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def content_for_with_parameter
|
|
12
|
+
render :layout => "talk_from_action"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def content_for_concatenated
|
|
16
|
+
render :layout => "talk_from_action"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def erb_content_for
|
|
20
|
+
render :layout => "talk_from_action"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def block_content_for
|
|
24
|
+
render :layout => "talk_from_action"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def non_erb_block_content_for
|
|
28
|
+
render :layout => "talk_from_action"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def rescue_action(e) raise end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
CaptureController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
|
|
35
|
+
|
|
36
|
+
class CaptureTest < Test::Unit::TestCase
|
|
37
|
+
def setup
|
|
38
|
+
@controller = CaptureController.new
|
|
39
|
+
|
|
40
|
+
# enable a logger so that (e.g.) the benchmarking stuff runs, so we can get
|
|
41
|
+
# a more accurate simulation of what happens in "real life".
|
|
42
|
+
@controller.logger = Logger.new(nil)
|
|
43
|
+
|
|
44
|
+
@request = ActionController::TestRequest.new
|
|
45
|
+
@response = ActionController::TestResponse.new
|
|
46
|
+
|
|
47
|
+
@request.host = "www.nextangle.com"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_simple_capture
|
|
51
|
+
get :capturing
|
|
52
|
+
assert_equal "Dreamy days", @response.body.strip
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def test_content_for
|
|
56
|
+
get :content_for
|
|
57
|
+
assert_equal expected_content_for_output, @response.body
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def test_should_concatentate_content_for
|
|
61
|
+
get :content_for_concatenated
|
|
62
|
+
assert_equal expected_content_for_output, @response.body
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_erb_content_for
|
|
66
|
+
get :erb_content_for
|
|
67
|
+
assert_equal expected_content_for_output, @response.body
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def test_should_set_content_for_with_parameter
|
|
71
|
+
get :content_for_with_parameter
|
|
72
|
+
assert_equal expected_content_for_output, @response.body
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def test_block_content_for
|
|
76
|
+
get :block_content_for
|
|
77
|
+
assert_equal expected_content_for_output, @response.body
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_non_erb_block_content_for
|
|
81
|
+
get :non_erb_block_content_for
|
|
82
|
+
assert_equal expected_content_for_output, @response.body
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
private
|
|
86
|
+
def expected_content_for_output
|
|
87
|
+
"<title>Putting stuff in the title!</title>\n\nGreat stuff!"
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
require 'abstract_unit'
|
|
2
|
+
require 'action_controller/cgi_process'
|
|
3
|
+
|
|
4
|
+
class BaseCgiTest < Test::Unit::TestCase
|
|
5
|
+
def setup
|
|
6
|
+
@request_hash = {"HTTP_MAX_FORWARDS"=>"10", "SERVER_NAME"=>"glu.ttono.us:8007", "FCGI_ROLE"=>"RESPONDER", "HTTP_X_FORWARDED_HOST"=>"glu.ttono.us", "HTTP_ACCEPT_ENCODING"=>"gzip, deflate", "HTTP_USER_AGENT"=>"Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.5.1 (KHTML, like Gecko) Safari/312.3.1", "PATH_INFO"=>"", "HTTP_ACCEPT_LANGUAGE"=>"en", "HTTP_HOST"=>"glu.ttono.us:8007", "SERVER_PROTOCOL"=>"HTTP/1.1", "REDIRECT_URI"=>"/dispatch.fcgi", "SCRIPT_NAME"=>"/dispatch.fcgi", "SERVER_ADDR"=>"207.7.108.53", "REMOTE_ADDR"=>"207.7.108.53", "SERVER_SOFTWARE"=>"lighttpd/1.4.5", "HTTP_COOKIE"=>"_session_id=c84ace84796670c052c6ceb2451fb0f2; is_admin=yes", "HTTP_X_FORWARDED_SERVER"=>"glu.ttono.us", "REQUEST_URI"=>"/admin", "DOCUMENT_ROOT"=>"/home/kevinc/sites/typo/public", "SERVER_PORT"=>"8007", "QUERY_STRING"=>"", "REMOTE_PORT"=>"63137", "GATEWAY_INTERFACE"=>"CGI/1.1", "HTTP_X_FORWARDED_FOR"=>"65.88.180.234", "HTTP_ACCEPT"=>"*/*", "SCRIPT_FILENAME"=>"/home/kevinc/sites/typo/public/dispatch.fcgi", "REDIRECT_STATUS"=>"200", "REQUEST_METHOD"=>"GET"}
|
|
7
|
+
# some Nokia phone browsers omit the space after the semicolon separator.
|
|
8
|
+
# some developers have grown accustomed to using comma in cookie values.
|
|
9
|
+
@alt_cookie_fmt_request_hash = {"HTTP_COOKIE"=>"_session_id=c84ace847,96670c052c6ceb2451fb0f2;is_admin=yes"}
|
|
10
|
+
@fake_cgi = Struct.new(:env_table).new(@request_hash)
|
|
11
|
+
@request = ActionController::CgiRequest.new(@fake_cgi)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def default_test; end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class CgiRequestTest < BaseCgiTest
|
|
19
|
+
def test_proxy_request
|
|
20
|
+
assert_equal 'glu.ttono.us', @request.host_with_port
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_http_host
|
|
24
|
+
@request_hash.delete "HTTP_X_FORWARDED_HOST"
|
|
25
|
+
@request_hash['HTTP_HOST'] = "rubyonrails.org:8080"
|
|
26
|
+
assert_equal "rubyonrails.org:8080", @request.host_with_port
|
|
27
|
+
|
|
28
|
+
@request_hash['HTTP_X_FORWARDED_HOST'] = "www.firsthost.org, www.secondhost.org"
|
|
29
|
+
assert_equal "www.secondhost.org", @request.host
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_http_host_with_default_port_overrides_server_port
|
|
33
|
+
@request_hash.delete "HTTP_X_FORWARDED_HOST"
|
|
34
|
+
@request_hash['HTTP_HOST'] = "rubyonrails.org"
|
|
35
|
+
assert_equal "rubyonrails.org", @request.host_with_port
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_host_with_port_defaults_to_server_name_if_no_host_headers
|
|
39
|
+
@request_hash.delete "HTTP_X_FORWARDED_HOST"
|
|
40
|
+
@request_hash.delete "HTTP_HOST"
|
|
41
|
+
assert_equal "glu.ttono.us:8007", @request.host_with_port
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test_host_with_port_falls_back_to_server_addr_if_necessary
|
|
45
|
+
@request_hash.delete "HTTP_X_FORWARDED_HOST"
|
|
46
|
+
@request_hash.delete "HTTP_HOST"
|
|
47
|
+
@request_hash.delete "SERVER_NAME"
|
|
48
|
+
assert_equal "207.7.108.53:8007", @request.host_with_port
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_host_with_port_if_http_standard_port_is_specified
|
|
52
|
+
@request_hash['HTTP_X_FORWARDED_HOST'] = "glu.ttono.us:80"
|
|
53
|
+
assert_equal "glu.ttono.us", @request.host_with_port
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_host_with_port_if_https_standard_port_is_specified
|
|
57
|
+
@request_hash['HTTP_X_FORWARDED_PROTO'] = "https"
|
|
58
|
+
@request_hash['HTTP_X_FORWARDED_HOST'] = "glu.ttono.us:443"
|
|
59
|
+
assert_equal "glu.ttono.us", @request.host_with_port
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def test_host_if_ipv6_reference
|
|
63
|
+
@request_hash.delete "HTTP_X_FORWARDED_HOST"
|
|
64
|
+
@request_hash['HTTP_HOST'] = "[2001:1234:5678:9abc:def0::dead:beef]"
|
|
65
|
+
assert_equal "[2001:1234:5678:9abc:def0::dead:beef]", @request.host
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def test_host_if_ipv6_reference_with_port
|
|
69
|
+
@request_hash.delete "HTTP_X_FORWARDED_HOST"
|
|
70
|
+
@request_hash['HTTP_HOST'] = "[2001:1234:5678:9abc:def0::dead:beef]:8008"
|
|
71
|
+
assert_equal "[2001:1234:5678:9abc:def0::dead:beef]", @request.host
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_cookie_syntax_resilience
|
|
75
|
+
cookies = CGI::Cookie::parse(@request_hash["HTTP_COOKIE"]);
|
|
76
|
+
assert_equal ["c84ace84796670c052c6ceb2451fb0f2"], cookies["_session_id"], cookies.inspect
|
|
77
|
+
assert_equal ["yes"], cookies["is_admin"], cookies.inspect
|
|
78
|
+
|
|
79
|
+
alt_cookies = CGI::Cookie::parse(@alt_cookie_fmt_request_hash["HTTP_COOKIE"]);
|
|
80
|
+
assert_equal ["c84ace847,96670c052c6ceb2451fb0f2"], alt_cookies["_session_id"], alt_cookies.inspect
|
|
81
|
+
assert_equal ["yes"], alt_cookies["is_admin"], alt_cookies.inspect
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class CgiRequestParamsParsingTest < BaseCgiTest
|
|
87
|
+
def test_doesnt_break_when_content_type_has_charset
|
|
88
|
+
data = 'flamenco=love'
|
|
89
|
+
@request.env['CONTENT_LENGTH'] = data.length
|
|
90
|
+
@request.env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=utf-8'
|
|
91
|
+
@request.env['RAW_POST_DATA'] = data
|
|
92
|
+
assert_equal({"flamenco"=> "love"}, @request.request_parameters)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def test_doesnt_interpret_request_uri_as_query_string_when_missing
|
|
96
|
+
@request.env['REQUEST_URI'] = 'foo'
|
|
97
|
+
assert_equal({}, @request.query_parameters)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class CgiRequestNeedsRewoundTest < BaseCgiTest
|
|
103
|
+
def test_body_should_be_rewound
|
|
104
|
+
data = 'foo'
|
|
105
|
+
fake_cgi = Struct.new(:env_table, :query_string, :stdinput).new(@request_hash, '', StringIO.new(data))
|
|
106
|
+
fake_cgi.env_table['CONTENT_LENGTH'] = data.length
|
|
107
|
+
fake_cgi.env_table['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=utf-8'
|
|
108
|
+
|
|
109
|
+
# Read the request body by parsing params.
|
|
110
|
+
request = ActionController::CgiRequest.new(fake_cgi)
|
|
111
|
+
request.request_parameters
|
|
112
|
+
|
|
113
|
+
# Should have rewound the body.
|
|
114
|
+
assert_equal 0, request.body.pos
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
require 'abstract_unit'
|
|
2
|
+
|
|
3
|
+
class CallerController < ActionController::Base
|
|
4
|
+
def calling_from_controller
|
|
5
|
+
render_component(:controller => "callee", :action => "being_called")
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def calling_from_controller_with_params
|
|
9
|
+
render_component(:controller => "callee", :action => "being_called", :params => { "name" => "David" })
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def calling_from_controller_with_different_status_code
|
|
13
|
+
render_component(:controller => "callee", :action => "blowing_up")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def calling_from_template
|
|
17
|
+
render :inline => "Ring, ring: <%= render_component(:controller => 'callee', :action => 'being_called') %>"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def internal_caller
|
|
21
|
+
render :inline => "Are you there? <%= render_component(:action => 'internal_callee') %>"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def internal_callee
|
|
25
|
+
render :text => "Yes, ma'am"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def set_flash
|
|
29
|
+
render_component(:controller => "callee", :action => "set_flash")
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def use_flash
|
|
33
|
+
render_component(:controller => "callee", :action => "use_flash")
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def calling_redirected
|
|
37
|
+
render_component(:controller => "callee", :action => "redirected")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def calling_redirected_as_string
|
|
41
|
+
render :inline => "<%= render_component(:controller => 'callee', :action => 'redirected') %>"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def rescue_action(e) raise end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
class CalleeController < ActionController::Base
|
|
48
|
+
def being_called
|
|
49
|
+
render :text => "#{params[:name] || "Lady"} of the House, speaking"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def blowing_up
|
|
53
|
+
render :text => "It's game over, man, just game over, man!", :status => 500
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def set_flash
|
|
57
|
+
flash[:notice] = 'My stoney baby'
|
|
58
|
+
render :text => 'flash is set'
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def use_flash
|
|
62
|
+
render :text => flash[:notice] || 'no flash'
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def redirected
|
|
66
|
+
redirect_to :controller => "callee", :action => "being_called"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def rescue_action(e) raise end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
class ComponentsTest < Test::Unit::TestCase
|
|
73
|
+
def setup
|
|
74
|
+
@controller = CallerController.new
|
|
75
|
+
@request = ActionController::TestRequest.new
|
|
76
|
+
@response = ActionController::TestResponse.new
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def test_calling_from_controller
|
|
80
|
+
get :calling_from_controller
|
|
81
|
+
assert_equal "Lady of the House, speaking", @response.body
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_calling_from_controller_with_params
|
|
85
|
+
get :calling_from_controller_with_params
|
|
86
|
+
assert_equal "David of the House, speaking", @response.body
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def test_calling_from_controller_with_different_status_code
|
|
90
|
+
get :calling_from_controller_with_different_status_code
|
|
91
|
+
assert_equal 500, @response.response_code
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def test_calling_from_template
|
|
95
|
+
get :calling_from_template
|
|
96
|
+
assert_equal "Ring, ring: Lady of the House, speaking", @response.body
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def test_etag_is_set_for_parent_template_when_calling_from_template
|
|
100
|
+
get :calling_from_template
|
|
101
|
+
expected_etag = etag_for("Ring, ring: Lady of the House, speaking")
|
|
102
|
+
assert_equal expected_etag, @response.headers['ETag']
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def test_internal_calling
|
|
106
|
+
get :internal_caller
|
|
107
|
+
assert_equal "Are you there? Yes, ma'am", @response.body
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def test_flash
|
|
111
|
+
get :set_flash
|
|
112
|
+
assert_equal 'My stoney baby', flash[:notice]
|
|
113
|
+
get :use_flash
|
|
114
|
+
assert_equal 'My stoney baby', @response.body
|
|
115
|
+
get :use_flash
|
|
116
|
+
assert_equal 'no flash', @response.body
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def test_component_redirect_redirects
|
|
120
|
+
get :calling_redirected
|
|
121
|
+
|
|
122
|
+
assert_redirected_to :action => "being_called"
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def test_component_multiple_redirect_redirects
|
|
126
|
+
test_component_redirect_redirects
|
|
127
|
+
test_internal_calling
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def test_component_as_string_redirect_renders_redirected_action
|
|
131
|
+
get :calling_redirected_as_string
|
|
132
|
+
|
|
133
|
+
assert_equal "Lady of the House, speaking", @response.body
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
protected
|
|
137
|
+
def etag_for(text)
|
|
138
|
+
%("#{Digest::MD5.hexdigest(text)}")
|
|
139
|
+
end
|
|
140
|
+
end
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
require 'abstract_unit'
|
|
2
|
+
|
|
3
|
+
class ContentTypeController < ActionController::Base
|
|
4
|
+
def render_content_type_from_body
|
|
5
|
+
response.content_type = Mime::RSS
|
|
6
|
+
render :text => "hello world!"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def render_defaults
|
|
10
|
+
render :text => "hello world!"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def render_content_type_from_render
|
|
14
|
+
render :text => "hello world!", :content_type => Mime::RSS
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def render_charset_from_body
|
|
18
|
+
response.charset = "utf-16"
|
|
19
|
+
render :text => "hello world!"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def render_default_for_rhtml
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def render_default_for_rxml
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def render_default_for_js
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def render_change_for_rxml
|
|
32
|
+
response.content_type = Mime::HTML
|
|
33
|
+
render :action => "render_default_for_rxml"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def render_default_content_types_for_respond_to
|
|
37
|
+
respond_to do |format|
|
|
38
|
+
format.html { render :text => "hello world!" }
|
|
39
|
+
format.xml { render :action => "render_default_content_types_for_respond_to.rhtml" }
|
|
40
|
+
format.js { render :text => "hello world!" }
|
|
41
|
+
format.rss { render :text => "hello world!", :content_type => Mime::XML }
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def rescue_action(e) raise end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
ContentTypeController.view_paths = [ File.dirname(__FILE__) + "/../fixtures/" ]
|
|
49
|
+
|
|
50
|
+
class ContentTypeTest < Test::Unit::TestCase
|
|
51
|
+
def setup
|
|
52
|
+
@controller = ContentTypeController.new
|
|
53
|
+
|
|
54
|
+
# enable a logger so that (e.g.) the benchmarking stuff runs, so we can get
|
|
55
|
+
# a more accurate simulation of what happens in "real life".
|
|
56
|
+
@controller.logger = Logger.new(nil)
|
|
57
|
+
|
|
58
|
+
@request = ActionController::TestRequest.new
|
|
59
|
+
@response = ActionController::TestResponse.new
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def test_render_defaults
|
|
63
|
+
get :render_defaults
|
|
64
|
+
assert_equal "utf-8", @response.charset
|
|
65
|
+
assert_equal Mime::HTML, @response.content_type
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def test_render_changed_charset_default
|
|
69
|
+
ContentTypeController.default_charset = "utf-16"
|
|
70
|
+
get :render_defaults
|
|
71
|
+
assert_equal "utf-16", @response.charset
|
|
72
|
+
assert_equal Mime::HTML, @response.content_type
|
|
73
|
+
ContentTypeController.default_charset = "utf-8"
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def test_content_type_from_body
|
|
77
|
+
get :render_content_type_from_body
|
|
78
|
+
assert_equal "application/rss+xml", @response.content_type
|
|
79
|
+
assert_equal "utf-8", @response.charset
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_content_type_from_render
|
|
83
|
+
get :render_content_type_from_render
|
|
84
|
+
assert_equal "application/rss+xml", @response.content_type
|
|
85
|
+
assert_equal "utf-8", @response.charset
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def test_charset_from_body
|
|
89
|
+
get :render_charset_from_body
|
|
90
|
+
assert_equal "utf-16", @response.charset
|
|
91
|
+
assert_equal Mime::HTML, @response.content_type
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def test_default_for_rhtml
|
|
95
|
+
get :render_default_for_rhtml
|
|
96
|
+
assert_equal Mime::HTML, @response.content_type
|
|
97
|
+
assert_equal "utf-8", @response.charset
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def test_default_for_rxml
|
|
101
|
+
get :render_default_for_rxml
|
|
102
|
+
assert_equal Mime::XML, @response.content_type
|
|
103
|
+
assert_equal "utf-8", @response.charset
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def test_default_for_js
|
|
107
|
+
xhr :post, :render_default_for_js
|
|
108
|
+
assert_equal Mime::JS, @response.content_type
|
|
109
|
+
assert_equal "utf-8", @response.charset
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def test_change_for_rxml
|
|
113
|
+
get :render_change_for_rxml
|
|
114
|
+
assert_equal Mime::HTML, @response.content_type
|
|
115
|
+
assert_equal "utf-8", @response.charset
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def test_render_default_content_types_for_respond_to
|
|
119
|
+
@request.env["HTTP_ACCEPT"] = Mime::HTML.to_s
|
|
120
|
+
get :render_default_content_types_for_respond_to
|
|
121
|
+
assert_equal Mime::HTML, @response.content_type
|
|
122
|
+
|
|
123
|
+
@request.env["HTTP_ACCEPT"] = Mime::JS.to_s
|
|
124
|
+
get :render_default_content_types_for_respond_to
|
|
125
|
+
assert_equal Mime::JS, @response.content_type
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def test_render_default_content_types_for_respond_to_with_template
|
|
129
|
+
@request.env["HTTP_ACCEPT"] = Mime::XML.to_s
|
|
130
|
+
get :render_default_content_types_for_respond_to
|
|
131
|
+
assert_equal Mime::XML, @response.content_type
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def test_render_default_content_types_for_respond_to_with_overwrite
|
|
135
|
+
@request.env["HTTP_ACCEPT"] = Mime::RSS.to_s
|
|
136
|
+
get :render_default_content_types_for_respond_to
|
|
137
|
+
assert_equal Mime::XML, @response.content_type
|
|
138
|
+
end
|
|
139
|
+
end
|