actionpack-rack-upgrade-2 2.3.15
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 +5250 -0
- data/MIT-LICENSE +21 -0
- data/README +409 -0
- data/RUNNING_UNIT_TESTS +24 -0
- data/Rakefile +158 -0
- data/install.rb +30 -0
- data/lib/action_controller.rb +113 -0
- data/lib/action_controller/assertions/dom_assertions.rb +55 -0
- data/lib/action_controller/assertions/model_assertions.rb +21 -0
- data/lib/action_controller/assertions/response_assertions.rb +169 -0
- data/lib/action_controller/assertions/routing_assertions.rb +146 -0
- data/lib/action_controller/assertions/selector_assertions.rb +638 -0
- data/lib/action_controller/assertions/tag_assertions.rb +127 -0
- data/lib/action_controller/base.rb +1425 -0
- data/lib/action_controller/benchmarking.rb +107 -0
- data/lib/action_controller/caching.rb +71 -0
- data/lib/action_controller/caching/actions.rb +177 -0
- data/lib/action_controller/caching/fragments.rb +120 -0
- data/lib/action_controller/caching/pages.rb +152 -0
- data/lib/action_controller/caching/sweeper.rb +45 -0
- data/lib/action_controller/caching/sweeping.rb +55 -0
- data/lib/action_controller/cgi_ext.rb +15 -0
- data/lib/action_controller/cgi_ext/cookie.rb +112 -0
- data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
- data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
- data/lib/action_controller/cgi_process.rb +77 -0
- data/lib/action_controller/cookies.rb +197 -0
- data/lib/action_controller/dispatcher.rb +133 -0
- data/lib/action_controller/failsafe.rb +87 -0
- data/lib/action_controller/filters.rb +680 -0
- data/lib/action_controller/flash.rb +213 -0
- data/lib/action_controller/headers.rb +33 -0
- data/lib/action_controller/helpers.rb +225 -0
- data/lib/action_controller/http_authentication.rb +309 -0
- data/lib/action_controller/integration.rb +708 -0
- data/lib/action_controller/layout.rb +286 -0
- data/lib/action_controller/middleware_stack.rb +119 -0
- data/lib/action_controller/middlewares.rb +14 -0
- data/lib/action_controller/mime_responds.rb +193 -0
- data/lib/action_controller/mime_type.rb +212 -0
- data/lib/action_controller/mime_types.rb +21 -0
- data/lib/action_controller/params_parser.rb +77 -0
- data/lib/action_controller/performance_test.rb +15 -0
- data/lib/action_controller/polymorphic_routes.rb +189 -0
- data/lib/action_controller/rack_lint_patch.rb +36 -0
- data/lib/action_controller/record_identifier.rb +104 -0
- data/lib/action_controller/reloader.rb +54 -0
- data/lib/action_controller/request.rb +495 -0
- data/lib/action_controller/request_forgery_protection.rb +116 -0
- data/lib/action_controller/rescue.rb +183 -0
- data/lib/action_controller/resources.rb +682 -0
- data/lib/action_controller/response.rb +237 -0
- data/lib/action_controller/routing.rb +388 -0
- data/lib/action_controller/routing/builder.rb +197 -0
- data/lib/action_controller/routing/optimisations.rb +130 -0
- data/lib/action_controller/routing/recognition_optimisation.rb +167 -0
- data/lib/action_controller/routing/route.rb +265 -0
- data/lib/action_controller/routing/route_set.rb +503 -0
- data/lib/action_controller/routing/routing_ext.rb +49 -0
- data/lib/action_controller/routing/segments.rb +343 -0
- data/lib/action_controller/session/abstract_store.rb +276 -0
- data/lib/action_controller/session/cookie_store.rb +240 -0
- data/lib/action_controller/session/mem_cache_store.rb +60 -0
- data/lib/action_controller/session_management.rb +54 -0
- data/lib/action_controller/status_codes.rb +88 -0
- data/lib/action_controller/streaming.rb +181 -0
- data/lib/action_controller/string_coercion.rb +29 -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 +209 -0
- data/lib/action_controller/test_process.rb +580 -0
- data/lib/action_controller/translation.rb +13 -0
- data/lib/action_controller/uploaded_file.rb +44 -0
- data/lib/action_controller/url_rewriter.rb +229 -0
- data/lib/action_controller/vendor/html-scanner.rb +16 -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 +58 -0
- data/lib/action_view/base.rb +362 -0
- data/lib/action_view/helpers.rb +61 -0
- data/lib/action_view/helpers/active_record_helper.rb +305 -0
- data/lib/action_view/helpers/asset_tag_helper.rb +695 -0
- data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
- data/lib/action_view/helpers/benchmark_helper.rb +54 -0
- data/lib/action_view/helpers/cache_helper.rb +39 -0
- data/lib/action_view/helpers/capture_helper.rb +136 -0
- data/lib/action_view/helpers/csrf_helper.rb +14 -0
- data/lib/action_view/helpers/date_helper.rb +989 -0
- data/lib/action_view/helpers/debug_helper.rb +38 -0
- data/lib/action_view/helpers/form_helper.rb +1118 -0
- data/lib/action_view/helpers/form_options_helper.rb +599 -0
- data/lib/action_view/helpers/form_tag_helper.rb +490 -0
- data/lib/action_view/helpers/javascript_helper.rb +208 -0
- data/lib/action_view/helpers/number_helper.rb +308 -0
- data/lib/action_view/helpers/prototype_helper.rb +1305 -0
- data/lib/action_view/helpers/raw_output_helper.rb +9 -0
- data/lib/action_view/helpers/record_identification_helper.rb +20 -0
- data/lib/action_view/helpers/record_tag_helper.rb +58 -0
- data/lib/action_view/helpers/sanitize_helper.rb +251 -0
- data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
- data/lib/action_view/helpers/tag_helper.rb +151 -0
- data/lib/action_view/helpers/text_helper.rb +597 -0
- data/lib/action_view/helpers/translation_helper.rb +67 -0
- data/lib/action_view/helpers/url_helper.rb +637 -0
- data/lib/action_view/inline_template.rb +19 -0
- data/lib/action_view/locale/en.yml +117 -0
- data/lib/action_view/partials.rb +241 -0
- data/lib/action_view/paths.rb +77 -0
- data/lib/action_view/reloadable_template.rb +117 -0
- data/lib/action_view/renderable.rb +109 -0
- data/lib/action_view/renderable_partial.rb +53 -0
- data/lib/action_view/template.rb +252 -0
- data/lib/action_view/template_error.rb +99 -0
- data/lib/action_view/template_handler.rb +34 -0
- data/lib/action_view/template_handlers.rb +48 -0
- data/lib/action_view/template_handlers/builder.rb +17 -0
- data/lib/action_view/template_handlers/erb.rb +25 -0
- data/lib/action_view/template_handlers/rjs.rb +13 -0
- data/lib/action_view/test_case.rb +162 -0
- data/lib/actionpack.rb +2 -0
- data/test/abstract_unit.rb +78 -0
- data/test/active_record_unit.rb +104 -0
- data/test/activerecord/active_record_store_test.rb +221 -0
- data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
- data/test/adv_attr_test.rb +20 -0
- data/test/controller/action_pack_assertions_test.rb +545 -0
- data/test/controller/addresses_render_test.rb +37 -0
- data/test/controller/assert_select_test.rb +735 -0
- data/test/controller/base_test.rb +217 -0
- data/test/controller/benchmark_test.rb +32 -0
- data/test/controller/caching_test.rb +743 -0
- data/test/controller/capture_test.rb +66 -0
- data/test/controller/content_type_test.rb +178 -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 +208 -0
- data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
- data/test/controller/dispatcher_test.rb +144 -0
- data/test/controller/dom_assertions_test.rb +53 -0
- data/test/controller/failsafe_test.rb +60 -0
- data/test/controller/fake_controllers.rb +33 -0
- data/test/controller/fake_models.rb +19 -0
- data/test/controller/filter_params_test.rb +52 -0
- data/test/controller/filters_test.rb +885 -0
- data/test/controller/flash_test.rb +174 -0
- data/test/controller/header_test.rb +14 -0
- data/test/controller/helper_test.rb +224 -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 +281 -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_basic_authentication_test.rb +113 -0
- data/test/controller/http_digest_authentication_test.rb +254 -0
- data/test/controller/integration_test.rb +526 -0
- data/test/controller/layout_test.rb +215 -0
- data/test/controller/localized_templates_test.rb +24 -0
- data/test/controller/logging_test.rb +46 -0
- data/test/controller/middleware_stack_test.rb +90 -0
- data/test/controller/mime_responds_test.rb +536 -0
- data/test/controller/mime_type_test.rb +93 -0
- data/test/controller/output_escaping_test.rb +19 -0
- data/test/controller/polymorphic_routes_test.rb +297 -0
- data/test/controller/rack_test.rb +308 -0
- data/test/controller/record_identifier_test.rb +139 -0
- data/test/controller/redirect_test.rb +285 -0
- data/test/controller/reloader_test.rb +125 -0
- data/test/controller/render_test.rb +1783 -0
- data/test/controller/request/json_params_parsing_test.rb +65 -0
- data/test/controller/request/multipart_params_parsing_test.rb +177 -0
- data/test/controller/request/query_string_parsing_test.rb +120 -0
- data/test/controller/request/test_request_test.rb +35 -0
- data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
- data/test/controller/request/xml_params_parsing_test.rb +103 -0
- data/test/controller/request_forgery_protection_test.rb +233 -0
- data/test/controller/request_test.rb +398 -0
- data/test/controller/rescue_test.rb +541 -0
- data/test/controller/resources_test.rb +1393 -0
- data/test/controller/routing_test.rb +2592 -0
- data/test/controller/selector_test.rb +628 -0
- data/test/controller/send_file_test.rb +171 -0
- data/test/controller/session/abstract_store_test.rb +64 -0
- data/test/controller/session/cookie_store_test.rb +354 -0
- data/test/controller/session/mem_cache_store_test.rb +187 -0
- data/test/controller/session/test_session_test.rb +58 -0
- data/test/controller/test_test.rb +700 -0
- data/test/controller/translation_test.rb +26 -0
- data/test/controller/url_rewriter_test.rb +395 -0
- data/test/controller/verification_test.rb +270 -0
- data/test/controller/view_paths_test.rb +141 -0
- data/test/controller/webservice_test.rb +273 -0
- data/test/fixtures/_top_level_partial.html.erb +1 -0
- data/test/fixtures/_top_level_partial_only.erb +1 -0
- data/test/fixtures/addresses/list.erb +1 -0
- data/test/fixtures/alternate_helpers/foo_helper.rb +3 -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_rhtml.rhtml +1 -0
- data/test/fixtures/content_type/render_default_for_rjs.rjs +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/_developer.erb +1 -0
- data/test/fixtures/developers_projects.yml +13 -0
- data/test/fixtures/failsafe/500.html +1 -0
- data/test/fixtures/fun/games/_game.erb +1 -0
- data/test/fixtures/fun/games/hello_world.erb +1 -0
- data/test/fixtures/fun/serious/games/_game.erb +1 -0
- data/test/fixtures/functional_caching/_partial.erb +3 -0
- data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
- data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
- data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -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/inline_fragment_cached.html.erb +2 -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/abs_path_layout.rhtml +1 -0
- data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
- data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -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/_column.html.erb +2 -0
- data/test/fixtures/layouts/block_with_layout.erb +3 -0
- data/test/fixtures/layouts/builder.builder +3 -0
- data/test/fixtures/layouts/default_html.html.erb +1 -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/xhr.html.erb +2 -0
- data/test/fixtures/layouts/yield.erb +2 -0
- data/test/fixtures/localized/hello_world.de.html +1 -0
- data/test/fixtures/localized/hello_world.en.html +1 -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/empty +10 -0
- data/test/fixtures/multipart/hello.txt +1 -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/none +9 -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/projects/_project.erb +1 -0
- data/test/fixtures/public/404.html +1 -0
- data/test/fixtures/public/500.da.html +1 -0
- data/test/fixtures/public/500.html +1 -0
- data/test/fixtures/public/absolute/test.css +23 -0
- data/test/fixtures/public/absolute/test.js +63 -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/controls.js +1 -0
- data/test/fixtures/public/javascripts/dragdrop.js +1 -0
- data/test/fixtures/public/javascripts/effects.js +1 -0
- data/test/fixtures/public/javascripts/prototype.js +1 -0
- data/test/fixtures/public/javascripts/robber.js +1 -0
- data/test/fixtures/public/javascripts/subdir/subdir.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/subdir/subdir.css +1 -0
- data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
- data/test/fixtures/quiz/questions/_question.html.erb +1 -0
- data/test/fixtures/replies.yml +15 -0
- data/test/fixtures/replies/_reply.erb +1 -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/all_types_with_layout.js.rjs +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/session_autoload_test/session_autoload_test/foo.rb +10 -0
- data/test/fixtures/shared.html.erb +1 -0
- data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
- data/test/fixtures/test/_counter.html.erb +1 -0
- data/test/fixtures/test/_customer.erb +1 -0
- data/test/fixtures/test/_customer_counter.erb +1 -0
- data/test/fixtures/test/_customer_counter_with_as.erb +1 -0
- data/test/fixtures/test/_customer_greeting.erb +1 -0
- data/test/fixtures/test/_customer_with_var.erb +1 -0
- data/test/fixtures/test/_form.erb +1 -0
- data/test/fixtures/test/_from_helper.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_block_with_args.html.erb +3 -0
- data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
- data/test/fixtures/test/_local_inspector.html.erb +1 -0
- data/test/fixtures/test/_one.html.erb +1 -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/_partial_with_only_html_version.html.erb +1 -0
- data/test/fixtures/test/_person.erb +2 -0
- data/test/fixtures/test/_raise.html.erb +1 -0
- data/test/fixtures/test/_two.html.erb +1 -0
- data/test/fixtures/test/_utf8_partial.html.erb +1 -0
- data/test/fixtures/test/_utf8_partial_magic.html.erb +2 -0
- data/test/fixtures/test/action_talk_to_layout.erb +2 -0
- data/test/fixtures/test/array_translation.erb +1 -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/dont_pick_me +1 -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/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.da.html.erb +1 -0
- data/test/fixtures/test/hello_world.erb +1 -0
- data/test/fixtures/test/hello_world.erb~ +1 -0
- data/test/fixtures/test/hello_world.pt-BR.html.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/hyphen-ated.erb +1 -0
- data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
- data/test/fixtures/test/list.erb +1 -0
- data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
- data/test/fixtures/test/malformed/malformed.erb~ +1 -0
- data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
- data/test/fixtures/test/nested_layout.erb +3 -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_explicit_html_template.js.rjs +1 -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_implicit_html_template.js.rjs +1 -0
- data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
- data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
- data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
- data/test/fixtures/test/render_to_string_test.erb +1 -0
- data/test/fixtures/test/scoped_array_translation.erb +1 -0
- data/test/fixtures/test/sub_template_raise.html.erb +1 -0
- data/test/fixtures/test/template.erb +1 -0
- data/test/fixtures/test/translation.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/test/using_layout_around_block_with_args.html.erb +1 -0
- data/test/fixtures/test/utf8.html.erb +4 -0
- data/test/fixtures/test/utf8_magic.html.erb +5 -0
- data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +5 -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_i18n_test.rb +51 -0
- data/test/template/active_record_helper_test.rb +302 -0
- data/test/template/asset_tag_helper_test.rb +770 -0
- data/test/template/atom_feed_helper_test.rb +315 -0
- data/test/template/benchmark_helper_test.rb +86 -0
- data/test/template/compiled_templates_test.rb +204 -0
- data/test/template/date_helper_i18n_test.rb +121 -0
- data/test/template/date_helper_test.rb +2603 -0
- data/test/template/erb_util_test.rb +36 -0
- data/test/template/form_helper_test.rb +1447 -0
- data/test/template/form_options_helper_i18n_test.rb +27 -0
- data/test/template/form_options_helper_test.rb +811 -0
- data/test/template/form_tag_helper_test.rb +356 -0
- data/test/template/javascript_helper_test.rb +106 -0
- data/test/template/number_helper_i18n_test.rb +69 -0
- data/test/template/number_helper_test.rb +132 -0
- data/test/template/prototype_helper_test.rb +639 -0
- data/test/template/raw_output_helper_test.rb +21 -0
- data/test/template/record_tag_helper_test.rb +58 -0
- data/test/template/render_test.rb +329 -0
- data/test/template/sanitize_helper_test.rb +57 -0
- data/test/template/scriptaculous_helper_test.rb +90 -0
- data/test/template/tag_helper_test.rb +98 -0
- data/test/template/template_test.rb +32 -0
- data/test/template/test_test.rb +54 -0
- data/test/template/text_helper_test.rb +597 -0
- data/test/template/translation_helper_test.rb +95 -0
- data/test/template/url_helper_test.rb +641 -0
- data/test/testing_sandbox.rb +15 -0
- data/test/view/test_case_test.rb +176 -0
- metadata +519 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
require 'abstract_unit'
|
|
2
|
+
|
|
3
|
+
class MimeTypeTest < Test::Unit::TestCase
|
|
4
|
+
Mime::Type.register "image/png", :png
|
|
5
|
+
Mime::Type.register "application/pdf", :pdf
|
|
6
|
+
|
|
7
|
+
def test_parse_single
|
|
8
|
+
Mime::LOOKUP.keys.each do |mime_type|
|
|
9
|
+
assert_equal [Mime::Type.lookup(mime_type)], Mime::Type.parse(mime_type)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_parse_without_q
|
|
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
|
+
assert_equal expect, Mime::Type.parse(accept)
|
|
17
|
+
end
|
|
18
|
+
|
|
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,application/pdf,*/*; q=0.2"
|
|
21
|
+
expect = [Mime::HTML, Mime::XML, Mime::PNG, Mime::PDF, Mime::TEXT, Mime::YAML, Mime::ALL]
|
|
22
|
+
assert_equal expect, Mime::Type.parse(accept)
|
|
23
|
+
end
|
|
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
|
+
|
|
32
|
+
# Accept header send with user HTTP_USER_AGENT: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1)
|
|
33
|
+
def test_parse_crappy_broken_acceptlines2
|
|
34
|
+
accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, , pronto/1.00.00, sslvpn/1.00.00.00, */*"
|
|
35
|
+
expect = ['image/gif', 'image/x-xbitmap', 'image/jpeg','image/pjpeg', 'application/x-shockwave-flash', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint', 'application/msword', 'pronto/1.00.00', 'sslvpn/1.00.00.00', Mime::ALL ]
|
|
36
|
+
assert_equal expect, Mime::Type.parse(accept).collect { |c| c.to_s }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def test_custom_type
|
|
40
|
+
Mime::Type.register("image/gif", :gif)
|
|
41
|
+
assert_nothing_raised do
|
|
42
|
+
Mime::GIF
|
|
43
|
+
assert_equal Mime::GIF, Mime::SET.last
|
|
44
|
+
end
|
|
45
|
+
ensure
|
|
46
|
+
Mime.module_eval { remove_const :GIF if const_defined?(:GIF) }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def test_type_should_be_equal_to_symbol
|
|
50
|
+
assert_equal Mime::HTML, 'application/xhtml+xml'
|
|
51
|
+
assert_equal Mime::HTML, :html
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_type_convenience_methods
|
|
55
|
+
# Don't test Mime::ALL, since it Mime::ALL#html? == true
|
|
56
|
+
types = Mime::SET.to_a.map(&:to_sym).uniq - [:all]
|
|
57
|
+
|
|
58
|
+
# Remove custom Mime::Type instances set in other tests, like Mime::GIF and Mime::IPHONE
|
|
59
|
+
types.delete_if { |type| !Mime.const_defined?(type.to_s.upcase) }
|
|
60
|
+
|
|
61
|
+
types.each do |type|
|
|
62
|
+
mime = Mime.const_get(type.to_s.upcase)
|
|
63
|
+
assert mime.send("#{type}?"), "#{mime.inspect} is not #{type}?"
|
|
64
|
+
invalid_types = types - [type]
|
|
65
|
+
invalid_types.delete(:html) if Mime::Type.html_types.include?(type)
|
|
66
|
+
invalid_types.each { |other_type| assert !mime.send("#{other_type}?"), "#{mime.inspect} is #{other_type}?" }
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def test_mime_all_is_html
|
|
71
|
+
assert Mime::ALL.all?, "Mime::ALL is not all?"
|
|
72
|
+
assert Mime::ALL.html?, "Mime::ALL is not html?"
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def test_verifiable_mime_types
|
|
76
|
+
all_types = Mime::SET.to_a.map(&:to_sym)
|
|
77
|
+
all_types.uniq!
|
|
78
|
+
# Remove custom Mime::Type instances set in other tests, like Mime::GIF and Mime::IPHONE
|
|
79
|
+
all_types.delete_if { |type| !Mime.const_defined?(type.to_s.upcase) }
|
|
80
|
+
verified, unverified = all_types.partition { |type| Mime::Type.browser_generated_types.include? type }
|
|
81
|
+
assert verified.each { |type| assert Mime.const_get(type.to_s.upcase).verify_request?, "Verifiable Mime Type is not verified: #{type.inspect}" }
|
|
82
|
+
assert unverified.each { |type| assert !Mime.const_get(type.to_s.upcase).verify_request?, "Nonverifiable Mime Type is verified: #{type.inspect}" }
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_regexp_matcher
|
|
86
|
+
assert Mime::JS =~ "text/javascript"
|
|
87
|
+
assert Mime::JS =~ "application/javascript"
|
|
88
|
+
assert Mime::JS !~ "text/html"
|
|
89
|
+
assert !(Mime::JS !~ "text/javascript")
|
|
90
|
+
assert !(Mime::JS !~ "application/javascript")
|
|
91
|
+
assert Mime::HTML =~ 'application/xhtml+xml'
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'abstract_unit'
|
|
2
|
+
|
|
3
|
+
class OutputEscapingTest < ActiveSupport::TestCase
|
|
4
|
+
|
|
5
|
+
test "escape_html shouldn't die when passed nil" do
|
|
6
|
+
assert ERB::Util.h(nil).blank?
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
test "escapeHTML should escape strings" do
|
|
10
|
+
assert_equal "<>"", ERB::Util.h("<>\"")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
test "escapeHTML shouldn't touch explicitly safe strings" do
|
|
14
|
+
# TODO this seems easier to compose and reason about, but
|
|
15
|
+
# this should be verified
|
|
16
|
+
assert_equal "<", ERB::Util.h("<".html_safe)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
require 'abstract_unit'
|
|
2
|
+
|
|
3
|
+
class Article
|
|
4
|
+
attr_reader :id
|
|
5
|
+
def save; @id = 1 end
|
|
6
|
+
def new_record?; @id.nil? end
|
|
7
|
+
def name
|
|
8
|
+
model = self.class.name.downcase
|
|
9
|
+
@id.nil? ? "new #{model}" : "#{model} ##{@id}"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class Response < Article
|
|
14
|
+
def post_id; 1 end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class Tag < Article
|
|
18
|
+
def response_id; 1 end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class Tax
|
|
22
|
+
attr_reader :id
|
|
23
|
+
def save; @id = 1 end
|
|
24
|
+
def new_record?; @id.nil? end
|
|
25
|
+
def name
|
|
26
|
+
model = self.class.name.downcase
|
|
27
|
+
@id.nil? ? "new #{model}" : "#{model} ##{@id}"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class Fax < Tax
|
|
32
|
+
def store_id; 1 end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# TODO: test nested models
|
|
36
|
+
class Response::Nested < Response; end
|
|
37
|
+
|
|
38
|
+
class PolymorphicRoutesTest < ActiveSupport::TestCase
|
|
39
|
+
include ActionController::PolymorphicRoutes
|
|
40
|
+
|
|
41
|
+
def setup
|
|
42
|
+
@article = Article.new
|
|
43
|
+
@response = Response.new
|
|
44
|
+
@tax = Tax.new
|
|
45
|
+
@fax = Fax.new
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_with_record
|
|
49
|
+
@article.save
|
|
50
|
+
expects(:article_url).with(@article)
|
|
51
|
+
polymorphic_url(@article)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_with_new_record
|
|
55
|
+
expects(:articles_url).with()
|
|
56
|
+
@article.expects(:new_record?).returns(true)
|
|
57
|
+
polymorphic_url(@article)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def test_with_record_and_action
|
|
61
|
+
expects(:new_article_url).with()
|
|
62
|
+
@article.expects(:new_record?).never
|
|
63
|
+
polymorphic_url(@article, :action => 'new')
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_url_helper_prefixed_with_new
|
|
67
|
+
expects(:new_article_url).with()
|
|
68
|
+
new_polymorphic_url(@article)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def test_url_helper_prefixed_with_edit
|
|
72
|
+
@article.save
|
|
73
|
+
expects(:edit_article_url).with(@article)
|
|
74
|
+
edit_polymorphic_url(@article)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def test_url_helper_prefixed_with_edit_with_url_options
|
|
78
|
+
@article.save
|
|
79
|
+
expects(:edit_article_url).with(@article, :param1 => '10')
|
|
80
|
+
edit_polymorphic_url(@article, :param1 => '10')
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def test_url_helper_with_url_options
|
|
84
|
+
@article.save
|
|
85
|
+
expects(:article_url).with(@article, :param1 => '10')
|
|
86
|
+
polymorphic_url(@article, :param1 => '10')
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def test_formatted_url_helper_is_deprecated
|
|
90
|
+
expects(:articles_url).with(:format => :pdf)
|
|
91
|
+
assert_deprecated do
|
|
92
|
+
formatted_polymorphic_url([@article, :pdf])
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_format_option
|
|
97
|
+
@article.save
|
|
98
|
+
expects(:article_url).with(@article, :format => :pdf)
|
|
99
|
+
polymorphic_url(@article, :format => :pdf)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def test_format_option_with_url_options
|
|
103
|
+
@article.save
|
|
104
|
+
expects(:article_url).with(@article, :format => :pdf, :param1 => '10')
|
|
105
|
+
polymorphic_url(@article, :format => :pdf, :param1 => '10')
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def test_id_and_format_option
|
|
109
|
+
@article.save
|
|
110
|
+
expects(:article_url).with(:id => @article, :format => :pdf)
|
|
111
|
+
polymorphic_url(:id => @article, :format => :pdf)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def test_with_nested
|
|
115
|
+
@response.save
|
|
116
|
+
expects(:article_response_url).with(@article, @response)
|
|
117
|
+
polymorphic_url([@article, @response])
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def test_with_nested_unsaved
|
|
121
|
+
expects(:article_responses_url).with(@article)
|
|
122
|
+
polymorphic_url([@article, @response])
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def test_new_with_array_and_namespace
|
|
126
|
+
expects(:new_admin_article_url).with()
|
|
127
|
+
polymorphic_url([:admin, @article], :action => 'new')
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def test_unsaved_with_array_and_namespace
|
|
131
|
+
expects(:admin_articles_url).with()
|
|
132
|
+
polymorphic_url([:admin, @article])
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def test_nested_unsaved_with_array_and_namespace
|
|
136
|
+
@article.save
|
|
137
|
+
expects(:admin_article_url).with(@article)
|
|
138
|
+
polymorphic_url([:admin, @article])
|
|
139
|
+
expects(:admin_article_responses_url).with(@article)
|
|
140
|
+
polymorphic_url([:admin, @article, @response])
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def test_nested_with_array_and_namespace
|
|
144
|
+
@response.save
|
|
145
|
+
expects(:admin_article_response_url).with(@article, @response)
|
|
146
|
+
polymorphic_url([:admin, @article, @response])
|
|
147
|
+
|
|
148
|
+
# a ridiculously long named route tests correct ordering of namespaces and nesting:
|
|
149
|
+
@tag = Tag.new
|
|
150
|
+
@tag.save
|
|
151
|
+
expects(:site_admin_article_response_tag_url).with(@article, @response, @tag)
|
|
152
|
+
polymorphic_url([:site, :admin, @article, @response, @tag])
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def test_nesting_with_array_ending_in_singleton_resource
|
|
156
|
+
expects(:article_response_url).with(@article)
|
|
157
|
+
polymorphic_url([@article, :response])
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def test_nesting_with_array_containing_singleton_resource
|
|
161
|
+
@tag = Tag.new
|
|
162
|
+
@tag.save
|
|
163
|
+
expects(:article_response_tag_url).with(@article, @tag)
|
|
164
|
+
polymorphic_url([@article, :response, @tag])
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def test_nesting_with_array_containing_namespace_and_singleton_resource
|
|
168
|
+
@tag = Tag.new
|
|
169
|
+
@tag.save
|
|
170
|
+
expects(:admin_article_response_tag_url).with(@article, @tag)
|
|
171
|
+
polymorphic_url([:admin, @article, :response, @tag])
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def test_nesting_with_array_containing_singleton_resource_and_format
|
|
175
|
+
@tag = Tag.new
|
|
176
|
+
@tag.save
|
|
177
|
+
expects(:article_response_tag_url).with(@article, @tag, :format => :pdf)
|
|
178
|
+
polymorphic_url([@article, :response, @tag], :format => :pdf)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def test_nesting_with_array_containing_singleton_resource_and_format_option
|
|
182
|
+
@tag = Tag.new
|
|
183
|
+
@tag.save
|
|
184
|
+
expects(:article_response_tag_url).with(@article, @tag, :format => :pdf)
|
|
185
|
+
polymorphic_url([@article, :response, @tag], :format => :pdf)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def test_nesting_with_array_containing_nil
|
|
189
|
+
expects(:article_response_url).with(@article)
|
|
190
|
+
polymorphic_url([@article, nil, :response])
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def test_with_array_containing_single_object
|
|
194
|
+
@article.save
|
|
195
|
+
expects(:article_url).with(@article)
|
|
196
|
+
polymorphic_url([nil, @article])
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def test_with_array_containing_single_name
|
|
200
|
+
@article.save
|
|
201
|
+
expects(:articles_url)
|
|
202
|
+
polymorphic_url([:articles])
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# TODO: Needs to be updated to correctly know about whether the object is in a hash or not
|
|
206
|
+
def xtest_with_hash
|
|
207
|
+
expects(:article_url).with(@article)
|
|
208
|
+
@article.save
|
|
209
|
+
polymorphic_url(:id => @article)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def test_polymorphic_path_accepts_options
|
|
213
|
+
expects(:new_article_path).with()
|
|
214
|
+
polymorphic_path(@article, :action => :new)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def test_polymorphic_path_does_not_modify_arguments
|
|
218
|
+
expects(:admin_article_responses_url).with(@article)
|
|
219
|
+
path = [:admin, @article, @response]
|
|
220
|
+
assert_no_difference 'path.size' do
|
|
221
|
+
polymorphic_url(path)
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
# Tests for names where .plural.singular doesn't round-trip
|
|
226
|
+
def test_with_irregular_plural_record
|
|
227
|
+
@tax.save
|
|
228
|
+
expects(:taxis_url).with(@tax)
|
|
229
|
+
polymorphic_url(@tax)
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def test_with_irregular_plural_new_record
|
|
233
|
+
expects(:taxes_url).with()
|
|
234
|
+
@tax.expects(:new_record?).returns(true)
|
|
235
|
+
polymorphic_url(@tax)
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def test_with_irregular_plural_record_and_action
|
|
239
|
+
expects(:new_taxis_url).with()
|
|
240
|
+
@tax.expects(:new_record?).never
|
|
241
|
+
polymorphic_url(@tax, :action => 'new')
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def test_irregular_plural_url_helper_prefixed_with_new
|
|
245
|
+
expects(:new_taxis_url).with()
|
|
246
|
+
new_polymorphic_url(@tax)
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def test_irregular_plural_url_helper_prefixed_with_edit
|
|
250
|
+
@tax.save
|
|
251
|
+
expects(:edit_taxis_url).with(@tax)
|
|
252
|
+
edit_polymorphic_url(@tax)
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def test_with_nested_irregular_plurals
|
|
256
|
+
@fax.save
|
|
257
|
+
expects(:taxis_faxis_url).with(@tax, @fax)
|
|
258
|
+
polymorphic_url([@tax, @fax])
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
def test_with_nested_unsaved_irregular_plurals
|
|
262
|
+
expects(:taxis_faxes_url).with(@tax)
|
|
263
|
+
polymorphic_url([@tax, @fax])
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
def test_new_with_irregular_plural_array_and_namespace
|
|
267
|
+
expects(:new_admin_taxis_url).with()
|
|
268
|
+
polymorphic_url([:admin, @tax], :action => 'new')
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def test_unsaved_with_irregular_plural_array_and_namespace
|
|
272
|
+
expects(:admin_taxes_url).with()
|
|
273
|
+
polymorphic_url([:admin, @tax])
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
def test_nesting_with_irregular_plurals_and_array_ending_in_singleton_resource
|
|
277
|
+
expects(:taxis_faxis_url).with(@tax)
|
|
278
|
+
polymorphic_url([@tax, :faxis])
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def test_with_array_containing_single_irregular_plural_object
|
|
282
|
+
@tax.save
|
|
283
|
+
expects(:taxis_url).with(@tax)
|
|
284
|
+
polymorphic_url([nil, @tax])
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def test_with_array_containing_single_name_irregular_plural
|
|
288
|
+
@tax.save
|
|
289
|
+
expects(:taxes_url)
|
|
290
|
+
polymorphic_url([:taxes])
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
def test_with_array_containing_symbols
|
|
294
|
+
expects(:new_article_url).with()
|
|
295
|
+
polymorphic_url([:new, :article])
|
|
296
|
+
end
|
|
297
|
+
end
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
require 'abstract_unit'
|
|
2
|
+
|
|
3
|
+
class BaseRackTest < ActiveSupport::TestCase
|
|
4
|
+
def setup
|
|
5
|
+
@env = {
|
|
6
|
+
"HTTP_MAX_FORWARDS" => "10",
|
|
7
|
+
"SERVER_NAME" => "glu.ttono.us",
|
|
8
|
+
"FCGI_ROLE" => "RESPONDER",
|
|
9
|
+
"AUTH_TYPE" => "Basic",
|
|
10
|
+
"HTTP_X_FORWARDED_HOST" => "glu.ttono.us",
|
|
11
|
+
"HTTP_ACCEPT_CHARSET" => "UTF-8",
|
|
12
|
+
"HTTP_ACCEPT_ENCODING" => "gzip, deflate",
|
|
13
|
+
"HTTP_CACHE_CONTROL" => "no-cache, max-age=0",
|
|
14
|
+
"HTTP_PRAGMA" => "no-cache",
|
|
15
|
+
"HTTP_USER_AGENT" => "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en)",
|
|
16
|
+
"PATH_INFO" => "/homepage/",
|
|
17
|
+
"HTTP_ACCEPT_LANGUAGE" => "en",
|
|
18
|
+
"HTTP_NEGOTIATE" => "trans",
|
|
19
|
+
"HTTP_HOST" => "glu.ttono.us:8007",
|
|
20
|
+
"HTTP_REFERER" => "http://www.google.com/search?q=glu.ttono.us",
|
|
21
|
+
"HTTP_FROM" => "googlebot",
|
|
22
|
+
"SERVER_PROTOCOL" => "HTTP/1.1",
|
|
23
|
+
"REDIRECT_URI" => "/dispatch.fcgi",
|
|
24
|
+
"SCRIPT_NAME" => "/dispatch.fcgi",
|
|
25
|
+
"SERVER_ADDR" => "207.7.108.53",
|
|
26
|
+
"REMOTE_ADDR" => "207.7.108.53",
|
|
27
|
+
"REMOTE_HOST" => "google.com",
|
|
28
|
+
"REMOTE_IDENT" => "kevin",
|
|
29
|
+
"REMOTE_USER" => "kevin",
|
|
30
|
+
"SERVER_SOFTWARE" => "lighttpd/1.4.5",
|
|
31
|
+
"HTTP_COOKIE" => "_session_id=c84ace84796670c052c6ceb2451fb0f2; is_admin=yes",
|
|
32
|
+
"HTTP_X_FORWARDED_SERVER" => "glu.ttono.us",
|
|
33
|
+
"REQUEST_URI" => "/admin",
|
|
34
|
+
"DOCUMENT_ROOT" => "/home/kevinc/sites/typo/public",
|
|
35
|
+
"PATH_TRANSLATED" => "/home/kevinc/sites/typo/public/homepage/",
|
|
36
|
+
"SERVER_PORT" => "8007",
|
|
37
|
+
"QUERY_STRING" => "",
|
|
38
|
+
"REMOTE_PORT" => "63137",
|
|
39
|
+
"GATEWAY_INTERFACE" => "CGI/1.1",
|
|
40
|
+
"HTTP_X_FORWARDED_FOR" => "65.88.180.234",
|
|
41
|
+
"HTTP_ACCEPT" => "*/*",
|
|
42
|
+
"SCRIPT_FILENAME" => "/home/kevinc/sites/typo/public/dispatch.fcgi",
|
|
43
|
+
"REDIRECT_STATUS" => "200",
|
|
44
|
+
"REQUEST_METHOD" => "GET"
|
|
45
|
+
}
|
|
46
|
+
@request = ActionController::Request.new(@env)
|
|
47
|
+
# some Nokia phone browsers omit the space after the semicolon separator.
|
|
48
|
+
# some developers have grown accustomed to using comma in cookie values.
|
|
49
|
+
@alt_cookie_fmt_request = ActionController::Request.new(@env.merge({"HTTP_COOKIE"=>"_session_id=c84ace847,96670c052c6ceb2451fb0f2;is_admin=yes"}))
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def default_test; end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def set_content_data(data)
|
|
57
|
+
@request.env['REQUEST_METHOD'] = 'POST'
|
|
58
|
+
@request.env['CONTENT_LENGTH'] = data.length
|
|
59
|
+
@request.env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=utf-8'
|
|
60
|
+
@request.env['rack.input'] = StringIO.new(data)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
class RackRequestTest < BaseRackTest
|
|
65
|
+
def test_proxy_request
|
|
66
|
+
assert_equal 'glu.ttono.us', @request.host_with_port
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def test_http_host
|
|
70
|
+
@env.delete "HTTP_X_FORWARDED_HOST"
|
|
71
|
+
@env['HTTP_HOST'] = "rubyonrails.org:8080"
|
|
72
|
+
assert_equal "rubyonrails.org", @request.host
|
|
73
|
+
assert_equal "rubyonrails.org:8080", @request.host_with_port
|
|
74
|
+
|
|
75
|
+
@env['HTTP_X_FORWARDED_HOST'] = "www.firsthost.org, www.secondhost.org"
|
|
76
|
+
assert_equal "www.secondhost.org", @request.host
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def test_http_host_with_default_port_overrides_server_port
|
|
80
|
+
@env.delete "HTTP_X_FORWARDED_HOST"
|
|
81
|
+
@env['HTTP_HOST'] = "rubyonrails.org"
|
|
82
|
+
assert_equal "rubyonrails.org", @request.host_with_port
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_host_with_port_defaults_to_server_name_if_no_host_headers
|
|
86
|
+
@env.delete "HTTP_X_FORWARDED_HOST"
|
|
87
|
+
@env.delete "HTTP_HOST"
|
|
88
|
+
assert_equal "glu.ttono.us:8007", @request.host_with_port
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def test_host_with_port_falls_back_to_server_addr_if_necessary
|
|
92
|
+
@env.delete "HTTP_X_FORWARDED_HOST"
|
|
93
|
+
@env.delete "HTTP_HOST"
|
|
94
|
+
@env.delete "SERVER_NAME"
|
|
95
|
+
assert_equal "207.7.108.53", @request.host
|
|
96
|
+
assert_equal 8007, @request.port
|
|
97
|
+
assert_equal "207.7.108.53:8007", @request.host_with_port
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def test_host_with_port_if_http_standard_port_is_specified
|
|
101
|
+
@env['HTTP_X_FORWARDED_HOST'] = "glu.ttono.us:80"
|
|
102
|
+
assert_equal "glu.ttono.us", @request.host_with_port
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def test_host_with_port_if_https_standard_port_is_specified
|
|
106
|
+
@env['HTTP_X_FORWARDED_PROTO'] = "https"
|
|
107
|
+
@env['HTTP_X_FORWARDED_HOST'] = "glu.ttono.us:443"
|
|
108
|
+
assert_equal "glu.ttono.us", @request.host_with_port
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def test_host_if_ipv6_reference
|
|
112
|
+
@env.delete "HTTP_X_FORWARDED_HOST"
|
|
113
|
+
@env['HTTP_HOST'] = "[2001:1234:5678:9abc:def0::dead:beef]"
|
|
114
|
+
assert_equal "[2001:1234:5678:9abc:def0::dead:beef]", @request.host
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def test_host_if_ipv6_reference_with_port
|
|
118
|
+
@env.delete "HTTP_X_FORWARDED_HOST"
|
|
119
|
+
@env['HTTP_HOST'] = "[2001:1234:5678:9abc:def0::dead:beef]:8008"
|
|
120
|
+
assert_equal "[2001:1234:5678:9abc:def0::dead:beef]", @request.host
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def test_cgi_environment_variables
|
|
124
|
+
assert_equal "Basic", @request.auth_type
|
|
125
|
+
assert_equal 0, @request.content_length
|
|
126
|
+
assert_equal nil, @request.content_type
|
|
127
|
+
assert_equal "CGI/1.1", @request.gateway_interface
|
|
128
|
+
assert_equal "*/*", @request.accept
|
|
129
|
+
assert_equal "UTF-8", @request.accept_charset
|
|
130
|
+
assert_equal "gzip, deflate", @request.accept_encoding
|
|
131
|
+
assert_equal "en", @request.accept_language
|
|
132
|
+
assert_equal "no-cache, max-age=0", @request.cache_control
|
|
133
|
+
assert_equal "googlebot", @request.from
|
|
134
|
+
assert_equal "glu.ttono.us", @request.host
|
|
135
|
+
assert_equal "trans", @request.negotiate
|
|
136
|
+
assert_equal "no-cache", @request.pragma
|
|
137
|
+
assert_equal "http://www.google.com/search?q=glu.ttono.us", @request.referer
|
|
138
|
+
assert_equal "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en)", @request.user_agent
|
|
139
|
+
assert_equal "/homepage/", @request.path_info
|
|
140
|
+
assert_equal "/home/kevinc/sites/typo/public/homepage/", @request.path_translated
|
|
141
|
+
assert_equal "", @request.query_string
|
|
142
|
+
assert_equal "207.7.108.53", @request.remote_addr
|
|
143
|
+
assert_equal "google.com", @request.remote_host
|
|
144
|
+
assert_equal "kevin", @request.remote_ident
|
|
145
|
+
assert_equal "kevin", @request.remote_user
|
|
146
|
+
assert_equal :get, @request.request_method
|
|
147
|
+
assert_equal "/dispatch.fcgi", @request.script_name
|
|
148
|
+
assert_equal "glu.ttono.us", @request.server_name
|
|
149
|
+
assert_equal 8007, @request.server_port
|
|
150
|
+
assert_equal "HTTP/1.1", @request.server_protocol
|
|
151
|
+
assert_equal "lighttpd", @request.server_software
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def test_cookie_syntax_resilience
|
|
155
|
+
cookies = @request.cookies
|
|
156
|
+
assert_equal "c84ace84796670c052c6ceb2451fb0f2", cookies["_session_id"], cookies.inspect
|
|
157
|
+
assert_equal "yes", cookies["is_admin"], cookies.inspect
|
|
158
|
+
|
|
159
|
+
alt_cookies = @alt_cookie_fmt_request.cookies
|
|
160
|
+
#assert_equal "c84ace847,96670c052c6ceb2451fb0f2", alt_cookies["_session_id"], alt_cookies.inspect
|
|
161
|
+
assert_equal "yes", alt_cookies["is_admin"], alt_cookies.inspect
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
class RackRequestParamsParsingTest < BaseRackTest
|
|
166
|
+
def test_doesnt_break_when_content_type_has_charset
|
|
167
|
+
set_content_data 'flamenco=love'
|
|
168
|
+
|
|
169
|
+
assert_equal({"flamenco"=> "love"}, @request.request_parameters)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def test_doesnt_interpret_request_uri_as_query_string_when_missing
|
|
173
|
+
@request.env['REQUEST_URI'] = 'foo'
|
|
174
|
+
assert_equal({}, @request.query_parameters)
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
class RackRequestContentTypeTest < BaseRackTest
|
|
179
|
+
def test_html_content_type_verification
|
|
180
|
+
@request.env['CONTENT_TYPE'] = Mime::HTML.to_s
|
|
181
|
+
assert @request.content_type.verify_request?
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def test_xml_content_type_verification
|
|
185
|
+
@request.env['CONTENT_TYPE'] = Mime::XML.to_s
|
|
186
|
+
assert !@request.content_type.verify_request?
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
class RackRequestNeedsRewoundTest < BaseRackTest
|
|
191
|
+
def test_body_should_be_rewound
|
|
192
|
+
data = 'foo'
|
|
193
|
+
@env['rack.input'] = StringIO.new(data)
|
|
194
|
+
@env['CONTENT_LENGTH'] = data.length
|
|
195
|
+
@env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=utf-8'
|
|
196
|
+
|
|
197
|
+
# Read the request body by parsing params.
|
|
198
|
+
request = ActionController::Request.new(@env)
|
|
199
|
+
request.request_parameters
|
|
200
|
+
|
|
201
|
+
# Should have rewound the body.
|
|
202
|
+
assert_equal 0, request.body.pos
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
class RackResponseTest < BaseRackTest
|
|
207
|
+
def setup
|
|
208
|
+
super
|
|
209
|
+
@response = ActionController::Response.new
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def test_simple_output
|
|
213
|
+
@response.body = "Hello, World!"
|
|
214
|
+
@response.prepare!
|
|
215
|
+
|
|
216
|
+
status, headers, body = @response.to_a
|
|
217
|
+
assert_equal 200, status
|
|
218
|
+
assert_equal({
|
|
219
|
+
"Content-Type" => "text/html; charset=utf-8",
|
|
220
|
+
"Cache-Control" => "private, max-age=0, must-revalidate",
|
|
221
|
+
"ETag" => '"65a8e27d8879283831b664bd8b7f0ad4"',
|
|
222
|
+
"Content-Length" => "13"
|
|
223
|
+
}, headers)
|
|
224
|
+
|
|
225
|
+
parts = []
|
|
226
|
+
body.each { |part| parts << part }
|
|
227
|
+
assert_equal ["Hello, World!"], parts
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def test_utf8_output
|
|
231
|
+
@response.body = [1090, 1077, 1089, 1090].pack("U*")
|
|
232
|
+
@response.prepare!
|
|
233
|
+
|
|
234
|
+
status, headers, body = @response.to_a
|
|
235
|
+
assert_equal 200, status
|
|
236
|
+
assert_equal({
|
|
237
|
+
"Content-Type" => "text/html; charset=utf-8",
|
|
238
|
+
"Cache-Control" => "private, max-age=0, must-revalidate",
|
|
239
|
+
"ETag" => '"ebb5e89e8a94e9dd22abf5d915d112b2"',
|
|
240
|
+
"Content-Length" => "8"
|
|
241
|
+
}, headers)
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def test_streaming_block
|
|
245
|
+
@response.body = Proc.new do |response, output|
|
|
246
|
+
5.times { |n| output.write(n) }
|
|
247
|
+
end
|
|
248
|
+
@response.prepare!
|
|
249
|
+
|
|
250
|
+
status, headers, body = @response.to_a
|
|
251
|
+
assert_equal 200, status
|
|
252
|
+
assert_equal({
|
|
253
|
+
"Content-Type" => "text/html; charset=utf-8",
|
|
254
|
+
"Cache-Control" => "no-cache"
|
|
255
|
+
}, headers)
|
|
256
|
+
|
|
257
|
+
parts = []
|
|
258
|
+
body.each { |part| parts << part }
|
|
259
|
+
assert_equal ["0", "1", "2", "3", "4"], parts
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
def test_streaming_block_with_flush_is_deprecated
|
|
263
|
+
@response.body = Proc.new do |response, output|
|
|
264
|
+
5.times do |n|
|
|
265
|
+
output.write(n)
|
|
266
|
+
output.flush
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
assert_deprecated(/output.flush is no longer needed/) do
|
|
271
|
+
@response.prepare!
|
|
272
|
+
status, headers, body = @response.to_a
|
|
273
|
+
|
|
274
|
+
parts = []
|
|
275
|
+
body.each { |part| parts << part }
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
class RackResponseHeadersTest < BaseRackTest
|
|
281
|
+
def setup
|
|
282
|
+
super
|
|
283
|
+
@response = ActionController::Response.new
|
|
284
|
+
@response.status = "200 OK"
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def test_content_type
|
|
288
|
+
[204, 304].each do |c|
|
|
289
|
+
@response.status = c.to_s
|
|
290
|
+
assert !response_headers.has_key?("Content-Type"), "#{c} should not have Content-Type header"
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
[200, 302, 404, 500].each do |c|
|
|
294
|
+
@response.status = c.to_s
|
|
295
|
+
assert response_headers.has_key?("Content-Type"), "#{c} did not have Content-Type header"
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def test_status
|
|
300
|
+
assert !response_headers.has_key?('Status')
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
private
|
|
304
|
+
def response_headers
|
|
305
|
+
@response.prepare!
|
|
306
|
+
@response.to_a[1]
|
|
307
|
+
end
|
|
308
|
+
end
|