actionpack 2.3.18 → 3.0.0.beta
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of actionpack might be problematic. Click here for more details.
- data/CHANGELOG +15 -64
- data/README +39 -48
- data/lib/abstract_controller.rb +22 -0
- data/lib/abstract_controller/base.rb +191 -0
- data/lib/abstract_controller/callbacks.rb +113 -0
- data/lib/abstract_controller/collector.rb +30 -0
- data/lib/abstract_controller/compatibility.rb +18 -0
- data/lib/abstract_controller/helpers.rb +163 -0
- data/lib/abstract_controller/layouts.rb +413 -0
- data/lib/abstract_controller/localized_cache.rb +49 -0
- data/lib/abstract_controller/logger.rb +13 -0
- data/lib/abstract_controller/rendering.rb +238 -0
- data/lib/{action_controller → abstract_controller}/translation.rb +1 -1
- data/lib/action_controller.rb +68 -102
- data/lib/action_controller/base.rb +77 -1409
- data/lib/action_controller/caching.rb +58 -45
- data/lib/action_controller/caching/actions.rb +100 -114
- data/lib/action_controller/caching/fragments.rb +17 -19
- data/lib/action_controller/caching/pages.rb +12 -6
- data/lib/action_controller/caching/sweeping.rb +42 -0
- data/lib/action_controller/deprecated.rb +5 -0
- data/lib/action_controller/deprecated/dispatcher.rb +28 -0
- data/lib/action_controller/deprecated/integration_test.rb +2 -0
- data/lib/action_controller/deprecated/performance_test.rb +1 -0
- data/lib/action_controller/metal.rb +125 -0
- data/lib/action_controller/metal/compatibility.rb +141 -0
- data/lib/action_controller/metal/conditional_get.rb +86 -0
- data/lib/action_controller/metal/configuration.rb +28 -0
- data/lib/action_controller/metal/cookies.rb +17 -0
- data/lib/action_controller/metal/exceptions.rb +46 -0
- data/lib/action_controller/metal/flash.rb +28 -0
- data/lib/action_controller/metal/head.rb +33 -0
- data/lib/action_controller/metal/helpers.rb +116 -0
- data/lib/action_controller/metal/hide_actions.rb +50 -0
- data/lib/action_controller/{http_authentication.rb → metal/http_authentication.rb} +18 -15
- data/lib/action_controller/metal/instrumentation.rb +99 -0
- data/lib/action_controller/metal/mime_responds.rb +300 -0
- data/lib/action_controller/metal/rack_delegation.rb +35 -0
- data/lib/action_controller/metal/redirecting.rb +90 -0
- data/lib/action_controller/metal/renderers.rb +95 -0
- data/lib/action_controller/metal/rendering.rb +69 -0
- data/lib/action_controller/metal/request_forgery_protection.rb +115 -0
- data/lib/action_controller/metal/rescue.rb +13 -0
- data/lib/action_controller/metal/responder.rb +220 -0
- data/lib/action_controller/{session_management.rb → metal/session_management.rb} +5 -14
- data/lib/action_controller/{streaming.rb → metal/streaming.rb} +13 -12
- data/lib/action_controller/metal/testing.rb +42 -0
- data/lib/action_controller/metal/url_for.rb +157 -0
- data/lib/action_controller/{verification.rb → metal/verification.rb} +41 -41
- data/lib/action_controller/middleware.rb +38 -0
- data/lib/action_controller/polymorphic_routes.rb +20 -26
- data/lib/action_controller/railtie.rb +30 -0
- data/lib/action_controller/railties/subscriber.rb +63 -0
- data/lib/action_controller/record_identifier.rb +3 -16
- data/lib/action_controller/test_case.rb +156 -18
- data/lib/action_controller/url_rewriter.rb +47 -200
- data/lib/action_controller/vendor/html-scanner.rb +16 -12
- data/lib/action_controller/vendor/html-scanner/html/node.rb +1 -1
- data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +12 -9
- data/lib/action_dispatch.rb +88 -0
- data/lib/action_dispatch/http/cache.rb +123 -0
- data/lib/action_dispatch/http/filter_parameters.rb +98 -0
- data/lib/{action_controller → action_dispatch/http}/headers.rb +8 -8
- data/lib/action_dispatch/http/mime_negotiation.rb +101 -0
- data/lib/{action_controller → action_dispatch/http}/mime_type.rb +30 -11
- data/lib/{action_controller → action_dispatch/http}/mime_types.rb +5 -3
- data/lib/action_dispatch/http/parameters.rb +49 -0
- data/lib/action_dispatch/http/request.rb +223 -0
- data/lib/action_dispatch/http/response.rb +209 -0
- data/lib/action_dispatch/http/upload.rb +48 -0
- data/lib/action_dispatch/http/url.rb +129 -0
- data/lib/action_dispatch/middleware/callbacks.rb +50 -0
- data/lib/action_dispatch/middleware/cascade.rb +29 -0
- data/lib/action_dispatch/middleware/cookies.rb +216 -0
- data/lib/{action_controller → action_dispatch/middleware}/flash.rb +51 -90
- data/lib/action_dispatch/middleware/head.rb +18 -0
- data/lib/action_dispatch/middleware/params_parser.rb +78 -0
- data/lib/action_dispatch/middleware/rescue.rb +26 -0
- data/lib/action_dispatch/middleware/session/abstract_store.rb +209 -0
- data/lib/{action_controller → action_dispatch/middleware}/session/cookie_store.rb +56 -60
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +47 -0
- data/lib/action_dispatch/middleware/show_exceptions.rb +173 -0
- data/lib/{action_controller/middleware_stack.rb → action_dispatch/middleware/stack.rb} +23 -13
- data/lib/action_dispatch/middleware/static.rb +44 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_request_and_response.erb +10 -3
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_trace.erb +4 -4
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +10 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/layout.erb +2 -2
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/missing_template.erb +0 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/routing_error.erb +0 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/template_error.erb +3 -3
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/unknown_action.erb +0 -0
- data/lib/action_dispatch/railtie.rb +15 -0
- data/lib/action_dispatch/routing.rb +217 -0
- data/lib/action_dispatch/routing/deprecated_mapper.rb +877 -0
- data/lib/action_dispatch/routing/mapper.rb +649 -0
- data/lib/action_dispatch/routing/route.rb +55 -0
- data/lib/action_dispatch/routing/route_set.rb +445 -0
- data/lib/action_dispatch/testing/assertions.rb +21 -0
- data/lib/action_dispatch/testing/assertions/dom.rb +37 -0
- data/lib/{action_controller/assertions/model_assertions.rb → action_dispatch/testing/assertions/model.rb} +2 -4
- data/lib/action_dispatch/testing/assertions/response.rb +154 -0
- data/lib/{action_controller/assertions/routing_assertions.rb → action_dispatch/testing/assertions/routing.rb} +72 -34
- data/lib/{action_controller/assertions/selector_assertions.rb → action_dispatch/testing/assertions/selector.rb} +14 -11
- data/lib/{action_controller/assertions/tag_assertions.rb → action_dispatch/testing/assertions/tag.rb} +25 -14
- data/lib/{action_controller → action_dispatch/testing}/integration.rb +173 -406
- data/lib/action_dispatch/testing/performance_test.rb +17 -0
- data/lib/action_dispatch/testing/test_process.rb +42 -0
- data/lib/action_dispatch/testing/test_request.rb +83 -0
- data/lib/action_dispatch/testing/test_response.rb +136 -0
- data/lib/action_pack/version.rb +3 -3
- data/lib/action_view.rb +29 -26
- data/lib/action_view/base.rb +101 -148
- data/lib/action_view/context.rb +44 -0
- data/lib/action_view/helpers.rb +6 -4
- data/lib/action_view/helpers/{active_record_helper.rb → active_model_helper.rb} +63 -63
- data/lib/action_view/helpers/asset_tag_helper.rb +166 -31
- data/lib/action_view/helpers/cache_helper.rb +1 -1
- data/lib/action_view/helpers/capture_helper.rb +40 -8
- data/lib/action_view/helpers/csrf_helper.rb +2 -4
- data/lib/action_view/helpers/date_helper.rb +14 -15
- data/lib/action_view/helpers/form_helper.rb +121 -24
- data/lib/action_view/helpers/form_options_helper.rb +26 -25
- data/lib/action_view/helpers/form_tag_helper.rb +42 -33
- data/lib/action_view/helpers/javascript_helper.rb +1 -109
- data/lib/action_view/helpers/number_helper.rb +4 -1
- data/lib/action_view/helpers/prototype_helper.rb +75 -499
- data/lib/action_view/helpers/raw_output_helper.rb +1 -1
- data/lib/action_view/helpers/record_tag_helper.rb +3 -3
- data/lib/action_view/helpers/sanitize_helper.rb +3 -2
- data/lib/action_view/helpers/scriptaculous_helper.rb +89 -53
- data/lib/action_view/helpers/tag_helper.rb +12 -13
- data/lib/action_view/helpers/text_helper.rb +33 -38
- data/lib/action_view/helpers/translation_helper.rb +11 -35
- data/lib/action_view/helpers/url_helper.rb +140 -134
- data/lib/action_view/locale/en.yml +34 -28
- data/lib/action_view/paths.rb +27 -24
- data/lib/action_view/railtie.rb +17 -0
- data/lib/action_view/railties/subscriber.rb +24 -0
- data/lib/action_view/{partials.rb → render/partials.rb} +161 -51
- data/lib/action_view/render/rendering.rb +117 -0
- data/lib/action_view/template.rb +88 -217
- data/lib/action_view/template/error.rb +105 -0
- data/lib/action_view/template/handler.rb +41 -0
- data/lib/action_view/template/handlers.rb +54 -0
- data/lib/action_view/{template_handlers → template/handlers}/builder.rb +6 -6
- data/lib/action_view/template/handlers/erb.rb +58 -0
- data/lib/action_view/{template_handlers → template/handlers}/rjs.rb +8 -3
- data/lib/action_view/template/resolver.rb +164 -0
- data/lib/action_view/template/text.rb +40 -0
- data/lib/action_view/test_case.rb +18 -18
- metadata +165 -420
- data/RUNNING_UNIT_TESTS +0 -24
- data/Rakefile +0 -158
- data/install.rb +0 -30
- data/lib/action_controller/assertions/dom_assertions.rb +0 -55
- data/lib/action_controller/assertions/response_assertions.rb +0 -169
- data/lib/action_controller/benchmarking.rb +0 -107
- data/lib/action_controller/caching/sweeper.rb +0 -45
- data/lib/action_controller/cgi_ext.rb +0 -15
- data/lib/action_controller/cgi_ext/cookie.rb +0 -112
- data/lib/action_controller/cgi_ext/query_extension.rb +0 -22
- data/lib/action_controller/cgi_ext/stdinput.rb +0 -24
- data/lib/action_controller/cgi_process.rb +0 -77
- data/lib/action_controller/cookies.rb +0 -197
- data/lib/action_controller/dispatcher.rb +0 -133
- data/lib/action_controller/failsafe.rb +0 -87
- data/lib/action_controller/filters.rb +0 -680
- data/lib/action_controller/helpers.rb +0 -225
- data/lib/action_controller/layout.rb +0 -286
- data/lib/action_controller/middlewares.rb +0 -14
- data/lib/action_controller/mime_responds.rb +0 -193
- data/lib/action_controller/params_parser.rb +0 -77
- data/lib/action_controller/performance_test.rb +0 -15
- data/lib/action_controller/rack_lint_patch.rb +0 -36
- data/lib/action_controller/reloader.rb +0 -54
- data/lib/action_controller/request.rb +0 -518
- data/lib/action_controller/request_forgery_protection.rb +0 -116
- data/lib/action_controller/rescue.rb +0 -183
- data/lib/action_controller/resources.rb +0 -682
- data/lib/action_controller/response.rb +0 -237
- data/lib/action_controller/routing.rb +0 -388
- data/lib/action_controller/routing/builder.rb +0 -197
- data/lib/action_controller/routing/optimisations.rb +0 -130
- data/lib/action_controller/routing/recognition_optimisation.rb +0 -167
- data/lib/action_controller/routing/route.rb +0 -265
- data/lib/action_controller/routing/route_set.rb +0 -503
- data/lib/action_controller/routing/routing_ext.rb +0 -49
- data/lib/action_controller/routing/segments.rb +0 -343
- data/lib/action_controller/session/abstract_store.rb +0 -276
- data/lib/action_controller/session/mem_cache_store.rb +0 -60
- data/lib/action_controller/status_codes.rb +0 -88
- data/lib/action_controller/string_coercion.rb +0 -29
- data/lib/action_controller/templates/rescues/diagnostics.erb +0 -11
- data/lib/action_controller/test_process.rb +0 -580
- data/lib/action_controller/uploaded_file.rb +0 -44
- data/lib/action_view/helpers/benchmark_helper.rb +0 -54
- data/lib/action_view/inline_template.rb +0 -19
- data/lib/action_view/reloadable_template.rb +0 -117
- data/lib/action_view/renderable.rb +0 -109
- data/lib/action_view/renderable_partial.rb +0 -53
- data/lib/action_view/template_error.rb +0 -99
- data/lib/action_view/template_handler.rb +0 -34
- data/lib/action_view/template_handlers.rb +0 -48
- data/lib/action_view/template_handlers/erb.rb +0 -25
- data/lib/actionpack.rb +0 -2
- data/test/abstract_unit.rb +0 -78
- data/test/active_record_unit.rb +0 -104
- data/test/activerecord/active_record_store_test.rb +0 -221
- data/test/activerecord/render_partial_with_record_identification_test.rb +0 -188
- data/test/adv_attr_test.rb +0 -20
- data/test/controller/action_pack_assertions_test.rb +0 -545
- data/test/controller/addresses_render_test.rb +0 -37
- data/test/controller/assert_select_test.rb +0 -735
- data/test/controller/base_test.rb +0 -217
- data/test/controller/benchmark_test.rb +0 -32
- data/test/controller/caching_test.rb +0 -743
- data/test/controller/capture_test.rb +0 -66
- data/test/controller/content_type_test.rb +0 -178
- 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 +0 -208
- data/test/controller/deprecation/deprecated_base_methods_test.rb +0 -32
- data/test/controller/dispatcher_test.rb +0 -144
- data/test/controller/dom_assertions_test.rb +0 -53
- data/test/controller/failsafe_test.rb +0 -60
- data/test/controller/fake_controllers.rb +0 -33
- data/test/controller/fake_models.rb +0 -19
- data/test/controller/filter_params_test.rb +0 -52
- data/test/controller/filters_test.rb +0 -885
- data/test/controller/flash_test.rb +0 -174
- data/test/controller/header_test.rb +0 -14
- data/test/controller/helper_test.rb +0 -224
- data/test/controller/html-scanner/cdata_node_test.rb +0 -15
- data/test/controller/html-scanner/document_test.rb +0 -148
- data/test/controller/html-scanner/node_test.rb +0 -89
- data/test/controller/html-scanner/sanitizer_test.rb +0 -300
- data/test/controller/html-scanner/tag_node_test.rb +0 -238
- data/test/controller/html-scanner/text_node_test.rb +0 -50
- data/test/controller/html-scanner/tokenizer_test.rb +0 -131
- data/test/controller/http_basic_authentication_test.rb +0 -113
- data/test/controller/http_digest_authentication_test.rb +0 -254
- data/test/controller/integration_test.rb +0 -526
- data/test/controller/layout_test.rb +0 -215
- data/test/controller/localized_templates_test.rb +0 -24
- data/test/controller/logging_test.rb +0 -46
- data/test/controller/middleware_stack_test.rb +0 -90
- data/test/controller/mime_responds_test.rb +0 -536
- data/test/controller/mime_type_test.rb +0 -93
- data/test/controller/output_escaping_test.rb +0 -19
- data/test/controller/polymorphic_routes_test.rb +0 -297
- data/test/controller/rack_test.rb +0 -308
- data/test/controller/record_identifier_test.rb +0 -139
- data/test/controller/redirect_test.rb +0 -285
- data/test/controller/reloader_test.rb +0 -125
- data/test/controller/render_test.rb +0 -1783
- data/test/controller/request/json_params_parsing_test.rb +0 -65
- data/test/controller/request/multipart_params_parsing_test.rb +0 -177
- data/test/controller/request/query_string_parsing_test.rb +0 -129
- data/test/controller/request/test_request_test.rb +0 -35
- data/test/controller/request/url_encoded_params_parsing_test.rb +0 -146
- data/test/controller/request/xml_params_parsing_test.rb +0 -103
- data/test/controller/request_forgery_protection_test.rb +0 -233
- data/test/controller/request_test.rb +0 -398
- data/test/controller/rescue_test.rb +0 -541
- data/test/controller/resources_test.rb +0 -1393
- data/test/controller/routing_test.rb +0 -2592
- data/test/controller/selector_test.rb +0 -628
- data/test/controller/send_file_test.rb +0 -171
- data/test/controller/session/abstract_store_test.rb +0 -64
- data/test/controller/session/cookie_store_test.rb +0 -354
- data/test/controller/session/mem_cache_store_test.rb +0 -187
- data/test/controller/session/test_session_test.rb +0 -58
- data/test/controller/test_test.rb +0 -700
- data/test/controller/translation_test.rb +0 -26
- data/test/controller/url_rewriter_test.rb +0 -395
- data/test/controller/verification_test.rb +0 -270
- data/test/controller/view_paths_test.rb +0 -141
- data/test/controller/webservice_test.rb +0 -273
- data/test/fixtures/_top_level_partial.html.erb +0 -1
- data/test/fixtures/_top_level_partial_only.erb +0 -1
- data/test/fixtures/addresses/list.erb +0 -1
- data/test/fixtures/alternate_helpers/foo_helper.rb +0 -3
- data/test/fixtures/bad_customers/_bad_customer.html.erb +0 -1
- data/test/fixtures/companies.yml +0 -24
- data/test/fixtures/company.rb +0 -10
- data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +0 -1
- data/test/fixtures/content_type/render_default_for_rhtml.rhtml +0 -1
- data/test/fixtures/content_type/render_default_for_rjs.rjs +0 -1
- data/test/fixtures/content_type/render_default_for_rxml.rxml +0 -1
- data/test/fixtures/customers/_customer.html.erb +0 -1
- data/test/fixtures/db_definitions/sqlite.sql +0 -49
- data/test/fixtures/developer.rb +0 -9
- data/test/fixtures/developers.yml +0 -21
- data/test/fixtures/developers/_developer.erb +0 -1
- data/test/fixtures/developers_projects.yml +0 -13
- data/test/fixtures/failsafe/500.html +0 -1
- data/test/fixtures/fun/games/_game.erb +0 -1
- data/test/fixtures/fun/games/hello_world.erb +0 -1
- data/test/fixtures/fun/serious/games/_game.erb +0 -1
- data/test/fixtures/functional_caching/_partial.erb +0 -3
- data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +0 -3
- data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +0 -6
- data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +0 -5
- data/test/fixtures/functional_caching/fragment_cached.html.erb +0 -2
- data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +0 -1
- data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +0 -2
- data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +0 -1
- data/test/fixtures/good_customers/_good_customer.html.erb +0 -1
- data/test/fixtures/helpers/abc_helper.rb +0 -5
- data/test/fixtures/helpers/fun/games_helper.rb +0 -3
- data/test/fixtures/helpers/fun/pdf_helper.rb +0 -3
- data/test/fixtures/layout_tests/abs_path_layout.rhtml +0 -1
- data/test/fixtures/layout_tests/alt/hello.rhtml +0 -1
- data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
- data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +0 -1
- data/test/fixtures/layout_tests/layouts/item.rhtml +0 -1
- data/test/fixtures/layout_tests/layouts/layout_test.rhtml +0 -1
- data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +0 -1
- data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +0 -1
- data/test/fixtures/layout_tests/views/hello.rhtml +0 -1
- data/test/fixtures/layouts/_column.html.erb +0 -2
- data/test/fixtures/layouts/block_with_layout.erb +0 -3
- data/test/fixtures/layouts/builder.builder +0 -3
- data/test/fixtures/layouts/default_html.html.erb +0 -1
- data/test/fixtures/layouts/partial_with_layout.erb +0 -3
- data/test/fixtures/layouts/standard.erb +0 -1
- data/test/fixtures/layouts/talk_from_action.erb +0 -2
- data/test/fixtures/layouts/xhr.html.erb +0 -2
- data/test/fixtures/layouts/yield.erb +0 -2
- data/test/fixtures/localized/hello_world.de.html +0 -1
- data/test/fixtures/localized/hello_world.en.html +0 -1
- data/test/fixtures/mascot.rb +0 -3
- data/test/fixtures/mascots.yml +0 -4
- data/test/fixtures/mascots/_mascot.html.erb +0 -1
- data/test/fixtures/multipart/binary_file +0 -0
- data/test/fixtures/multipart/boundary_problem_file +0 -10
- data/test/fixtures/multipart/bracketed_param +0 -5
- data/test/fixtures/multipart/empty +0 -10
- data/test/fixtures/multipart/hello.txt +0 -1
- data/test/fixtures/multipart/large_text_file +0 -10
- data/test/fixtures/multipart/mixed_files +0 -0
- data/test/fixtures/multipart/mona_lisa.jpg +0 -0
- data/test/fixtures/multipart/none +0 -9
- data/test/fixtures/multipart/single_parameter +0 -5
- data/test/fixtures/multipart/text_file +0 -10
- data/test/fixtures/override/test/hello_world.erb +0 -1
- data/test/fixtures/override2/layouts/test/sub.erb +0 -1
- data/test/fixtures/post_test/layouts/post.html.erb +0 -1
- data/test/fixtures/post_test/layouts/super_post.iphone.erb +0 -1
- data/test/fixtures/post_test/post/index.html.erb +0 -1
- data/test/fixtures/post_test/post/index.iphone.erb +0 -1
- data/test/fixtures/post_test/super_post/index.html.erb +0 -1
- data/test/fixtures/post_test/super_post/index.iphone.erb +0 -1
- data/test/fixtures/project.rb +0 -3
- data/test/fixtures/projects.yml +0 -7
- data/test/fixtures/projects/_project.erb +0 -1
- data/test/fixtures/public/404.html +0 -1
- data/test/fixtures/public/500.da.html +0 -1
- data/test/fixtures/public/500.html +0 -1
- data/test/fixtures/public/absolute/test.css +0 -23
- data/test/fixtures/public/absolute/test.js +0 -63
- data/test/fixtures/public/images/rails.png +0 -0
- data/test/fixtures/public/javascripts/application.js +0 -1
- data/test/fixtures/public/javascripts/bank.js +0 -1
- data/test/fixtures/public/javascripts/controls.js +0 -1
- data/test/fixtures/public/javascripts/dragdrop.js +0 -1
- data/test/fixtures/public/javascripts/effects.js +0 -1
- data/test/fixtures/public/javascripts/prototype.js +0 -1
- data/test/fixtures/public/javascripts/robber.js +0 -1
- data/test/fixtures/public/javascripts/subdir/subdir.js +0 -1
- data/test/fixtures/public/javascripts/version.1.0.js +0 -1
- data/test/fixtures/public/stylesheets/bank.css +0 -1
- data/test/fixtures/public/stylesheets/robber.css +0 -1
- data/test/fixtures/public/stylesheets/subdir/subdir.css +0 -1
- data/test/fixtures/public/stylesheets/version.1.0.css +0 -1
- data/test/fixtures/quiz/questions/_question.html.erb +0 -1
- data/test/fixtures/replies.yml +0 -15
- data/test/fixtures/replies/_reply.erb +0 -1
- data/test/fixtures/reply.rb +0 -7
- data/test/fixtures/respond_to/all_types_with_layout.html.erb +0 -1
- data/test/fixtures/respond_to/all_types_with_layout.js.rjs +0 -1
- data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +0 -1
- data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +0 -1
- data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +0 -1
- data/test/fixtures/respond_to/layouts/missing.html.erb +0 -1
- data/test/fixtures/respond_to/layouts/standard.html.erb +0 -1
- data/test/fixtures/respond_to/layouts/standard.iphone.erb +0 -1
- data/test/fixtures/respond_to/using_defaults.html.erb +0 -1
- data/test/fixtures/respond_to/using_defaults.js.rjs +0 -1
- data/test/fixtures/respond_to/using_defaults.xml.builder +0 -1
- data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +0 -1
- data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +0 -1
- data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +0 -1
- data/test/fixtures/scope/test/modgreet.erb +0 -1
- data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +0 -10
- data/test/fixtures/shared.html.erb +0 -1
- data/test/fixtures/symlink_parent/symlinked_layout.erb +0 -5
- data/test/fixtures/test/_counter.html.erb +0 -1
- data/test/fixtures/test/_customer.erb +0 -1
- data/test/fixtures/test/_customer_counter.erb +0 -1
- data/test/fixtures/test/_customer_counter_with_as.erb +0 -1
- data/test/fixtures/test/_customer_greeting.erb +0 -1
- data/test/fixtures/test/_customer_with_var.erb +0 -1
- data/test/fixtures/test/_form.erb +0 -1
- data/test/fixtures/test/_from_helper.erb +0 -1
- data/test/fixtures/test/_hash_greeting.erb +0 -1
- data/test/fixtures/test/_hash_object.erb +0 -2
- data/test/fixtures/test/_hello.builder +0 -1
- data/test/fixtures/test/_labelling_form.erb +0 -1
- data/test/fixtures/test/_layout_for_block_with_args.html.erb +0 -3
- data/test/fixtures/test/_layout_for_partial.html.erb +0 -3
- data/test/fixtures/test/_local_inspector.html.erb +0 -1
- data/test/fixtures/test/_one.html.erb +0 -1
- data/test/fixtures/test/_partial.erb +0 -1
- data/test/fixtures/test/_partial.html.erb +0 -1
- data/test/fixtures/test/_partial.js.erb +0 -1
- data/test/fixtures/test/_partial_for_use_in_layout.html.erb +0 -1
- data/test/fixtures/test/_partial_only.erb +0 -1
- data/test/fixtures/test/_partial_with_only_html_version.html.erb +0 -1
- data/test/fixtures/test/_person.erb +0 -2
- data/test/fixtures/test/_raise.html.erb +0 -1
- data/test/fixtures/test/_two.html.erb +0 -1
- data/test/fixtures/test/_utf8_partial.html.erb +0 -1
- data/test/fixtures/test/_utf8_partial_magic.html.erb +0 -2
- data/test/fixtures/test/action_talk_to_layout.erb +0 -2
- data/test/fixtures/test/array_translation.erb +0 -1
- data/test/fixtures/test/calling_partial_with_layout.html.erb +0 -1
- data/test/fixtures/test/capturing.erb +0 -4
- data/test/fixtures/test/content_for.erb +0 -2
- data/test/fixtures/test/content_for_concatenated.erb +0 -3
- data/test/fixtures/test/content_for_with_parameter.erb +0 -2
- data/test/fixtures/test/delete_with_js.rjs +0 -2
- data/test/fixtures/test/dont_pick_me +0 -1
- data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +0 -1
- data/test/fixtures/test/enum_rjs_test.rjs +0 -6
- data/test/fixtures/test/formatted_html_erb.html.erb +0 -1
- data/test/fixtures/test/formatted_xml_erb.builder +0 -1
- data/test/fixtures/test/formatted_xml_erb.html.erb +0 -1
- data/test/fixtures/test/formatted_xml_erb.xml.erb +0 -1
- data/test/fixtures/test/greeting.erb +0 -1
- data/test/fixtures/test/greeting.js.rjs +0 -1
- data/test/fixtures/test/hello.builder +0 -4
- data/test/fixtures/test/hello_world.da.html.erb +0 -1
- data/test/fixtures/test/hello_world.erb +0 -1
- data/test/fixtures/test/hello_world.erb~ +0 -1
- data/test/fixtures/test/hello_world.pt-BR.html.erb +0 -1
- data/test/fixtures/test/hello_world_container.builder +0 -3
- data/test/fixtures/test/hello_world_from_rxml.builder +0 -4
- data/test/fixtures/test/hello_world_with_layout_false.erb +0 -1
- data/test/fixtures/test/hello_xml_world.builder +0 -11
- data/test/fixtures/test/hyphen-ated.erb +0 -1
- data/test/fixtures/test/implicit_content_type.atom.builder +0 -2
- data/test/fixtures/test/list.erb +0 -1
- data/test/fixtures/test/malformed/malformed.en.html.erb~ +0 -1
- data/test/fixtures/test/malformed/malformed.erb~ +0 -1
- data/test/fixtures/test/malformed/malformed.html.erb~ +0 -1
- data/test/fixtures/test/nested_layout.erb +0 -3
- data/test/fixtures/test/non_erb_block_content_for.builder +0 -4
- data/test/fixtures/test/potential_conflicts.erb +0 -4
- data/test/fixtures/test/render_explicit_html_template.js.rjs +0 -1
- data/test/fixtures/test/render_file_from_template.html.erb +0 -1
- data/test/fixtures/test/render_file_with_ivar.erb +0 -1
- data/test/fixtures/test/render_file_with_locals.erb +0 -1
- data/test/fixtures/test/render_implicit_html_template.js.rjs +0 -1
- data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +0 -1
- data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +0 -1
- data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +0 -1
- data/test/fixtures/test/render_to_string_test.erb +0 -1
- data/test/fixtures/test/scoped_array_translation.erb +0 -1
- data/test/fixtures/test/sub_template_raise.html.erb +0 -1
- data/test/fixtures/test/template.erb +0 -1
- data/test/fixtures/test/translation.erb +0 -1
- data/test/fixtures/test/update_element_with_capture.erb +0 -9
- data/test/fixtures/test/using_layout_around_block.html.erb +0 -1
- data/test/fixtures/test/using_layout_around_block_with_args.html.erb +0 -1
- data/test/fixtures/test/utf8.html.erb +0 -4
- data/test/fixtures/test/utf8_magic.html.erb +0 -5
- data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +0 -5
- data/test/fixtures/topic.rb +0 -3
- data/test/fixtures/topics.yml +0 -22
- data/test/fixtures/topics/_topic.html.erb +0 -1
- data/test/template/active_record_helper_i18n_test.rb +0 -51
- data/test/template/active_record_helper_test.rb +0 -302
- data/test/template/asset_tag_helper_test.rb +0 -770
- data/test/template/atom_feed_helper_test.rb +0 -315
- data/test/template/benchmark_helper_test.rb +0 -86
- data/test/template/compiled_templates_test.rb +0 -204
- data/test/template/date_helper_i18n_test.rb +0 -121
- data/test/template/date_helper_test.rb +0 -2603
- data/test/template/erb_util_test.rb +0 -36
- data/test/template/form_helper_test.rb +0 -1447
- data/test/template/form_options_helper_i18n_test.rb +0 -27
- data/test/template/form_options_helper_test.rb +0 -811
- data/test/template/form_tag_helper_test.rb +0 -356
- data/test/template/javascript_helper_test.rb +0 -106
- data/test/template/number_helper_i18n_test.rb +0 -69
- data/test/template/number_helper_test.rb +0 -132
- data/test/template/prototype_helper_test.rb +0 -639
- data/test/template/raw_output_helper_test.rb +0 -21
- data/test/template/record_tag_helper_test.rb +0 -58
- data/test/template/render_test.rb +0 -329
- data/test/template/sanitize_helper_test.rb +0 -57
- data/test/template/scriptaculous_helper_test.rb +0 -90
- data/test/template/tag_helper_test.rb +0 -98
- data/test/template/template_test.rb +0 -32
- data/test/template/test_test.rb +0 -54
- data/test/template/text_helper_test.rb +0 -601
- data/test/template/translation_helper_test.rb +0 -95
- data/test/template/url_helper_test.rb +0 -641
- data/test/testing_sandbox.rb +0 -15
- data/test/view/test_case_test.rb +0 -176
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
require 'action_controller/vendor/html-scanner'
|
2
|
+
|
3
|
+
module ActionDispatch
|
2
4
|
module Assertions
|
3
5
|
# Pair of assertions to testing elements in the HTML output of the response.
|
4
6
|
module TagAssertions
|
@@ -76,10 +78,10 @@ module ActionController
|
|
76
78
|
# # Assert that there is a "span" containing between 2 and 4 "em" tags
|
77
79
|
# # as immediate children
|
78
80
|
# assert_tag :tag => "span",
|
79
|
-
# :children => { :count => 2..4, :only => { :tag => "em" } }
|
81
|
+
# :children => { :count => 2..4, :only => { :tag => "em" } }
|
80
82
|
#
|
81
83
|
# # Get funky: assert that there is a "div", with an "ul" ancestor
|
82
|
-
# # and an "li" parent (with "class" = "enum"), and containing a
|
84
|
+
# # and an "li" parent (with "class" = "enum"), and containing a
|
83
85
|
# # "span" descendant that contains text matching /hello world/
|
84
86
|
# assert_tag :tag => "div",
|
85
87
|
# :ancestor => { :tag => "ul" },
|
@@ -94,13 +96,11 @@ module ActionController
|
|
94
96
|
# that allow optional closing tags (p, li, td). <em>You must explicitly
|
95
97
|
# close all of your tags to use these assertions.</em>
|
96
98
|
def assert_tag(*opts)
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
assert tag, "expected tag, but no tag found matching #{opts.inspect} in:\n#{@response.body.inspect}"
|
101
|
-
end
|
99
|
+
opts = opts.size > 1 ? opts.last.merge({ :tag => opts.first.to_s }) : opts.first
|
100
|
+
tag = find_tag(opts)
|
101
|
+
assert tag, "expected tag, but no tag found matching #{opts.inspect} in:\n#{@response.body.inspect}"
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
# Identical to +assert_tag+, but asserts that a matching tag does _not_
|
105
105
|
# exist. (See +assert_tag+ for a full discussion of the syntax.)
|
106
106
|
#
|
@@ -116,11 +116,22 @@ module ActionController
|
|
116
116
|
# assert_no_tag :tag => "p",
|
117
117
|
# :children => { :count => 1..3, :only => { :tag => "img" } }
|
118
118
|
def assert_no_tag(*opts)
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
119
|
+
opts = opts.size > 1 ? opts.last.merge({ :tag => opts.first.to_s }) : opts.first
|
120
|
+
tag = find_tag(opts)
|
121
|
+
assert !tag, "expected no tag, but found tag matching #{opts.inspect} in:\n#{@response.body.inspect}"
|
122
|
+
end
|
123
|
+
|
124
|
+
def find_tag(conditions)
|
125
|
+
html_document.find(conditions)
|
126
|
+
end
|
127
|
+
|
128
|
+
def find_all_tag(conditions)
|
129
|
+
html_document.find_all(conditions)
|
130
|
+
end
|
131
|
+
|
132
|
+
def html_document
|
133
|
+
xml = @response.content_type =~ /xml$/
|
134
|
+
@html_document ||= HTML::Document.new(@response.body, false, xml)
|
124
135
|
end
|
125
136
|
end
|
126
137
|
end
|
@@ -1,10 +1,118 @@
|
|
1
1
|
require 'stringio'
|
2
2
|
require 'uri'
|
3
|
-
require 'active_support/
|
4
|
-
require '
|
3
|
+
require 'active_support/core_ext/object/metaclass'
|
4
|
+
require 'rack/test'
|
5
5
|
|
6
|
-
module
|
6
|
+
module ActionDispatch
|
7
7
|
module Integration #:nodoc:
|
8
|
+
module RequestHelpers
|
9
|
+
# Performs a GET request with the given parameters.
|
10
|
+
#
|
11
|
+
# - +path+: The URI (as a String) on which you want to perform a GET
|
12
|
+
# request.
|
13
|
+
# - +parameters+: The HTTP parameters that you want to pass. This may
|
14
|
+
# be +nil+,
|
15
|
+
# a Hash, or a String that is appropriately encoded
|
16
|
+
# (<tt>application/x-www-form-urlencoded</tt> or
|
17
|
+
# <tt>multipart/form-data</tt>).
|
18
|
+
# - +headers+: Additional HTTP headers to pass, as a Hash. The keys will
|
19
|
+
# automatically be upcased, with the prefix 'HTTP_' added if needed.
|
20
|
+
#
|
21
|
+
# This method returns an Response object, which one can use to
|
22
|
+
# inspect the details of the response. Furthermore, if this method was
|
23
|
+
# called from an ActionDispatch::IntegrationTest object, then that
|
24
|
+
# object's <tt>@response</tt> instance variable will point to the same
|
25
|
+
# response object.
|
26
|
+
#
|
27
|
+
# You can also perform POST, PUT, DELETE, and HEAD requests with +post+,
|
28
|
+
# +put+, +delete+, and +head+.
|
29
|
+
def get(path, parameters = nil, headers = nil)
|
30
|
+
process :get, path, parameters, headers
|
31
|
+
end
|
32
|
+
|
33
|
+
# Performs a POST request with the given parameters. See get() for more
|
34
|
+
# details.
|
35
|
+
def post(path, parameters = nil, headers = nil)
|
36
|
+
process :post, path, parameters, headers
|
37
|
+
end
|
38
|
+
|
39
|
+
# Performs a PUT request with the given parameters. See get() for more
|
40
|
+
# details.
|
41
|
+
def put(path, parameters = nil, headers = nil)
|
42
|
+
process :put, path, parameters, headers
|
43
|
+
end
|
44
|
+
|
45
|
+
# Performs a DELETE request with the given parameters. See get() for
|
46
|
+
# more details.
|
47
|
+
def delete(path, parameters = nil, headers = nil)
|
48
|
+
process :delete, path, parameters, headers
|
49
|
+
end
|
50
|
+
|
51
|
+
# Performs a HEAD request with the given parameters. See get() for more
|
52
|
+
# details.
|
53
|
+
def head(path, parameters = nil, headers = nil)
|
54
|
+
process :head, path, parameters, headers
|
55
|
+
end
|
56
|
+
|
57
|
+
# Performs an XMLHttpRequest request with the given parameters, mirroring
|
58
|
+
# a request from the Prototype library.
|
59
|
+
#
|
60
|
+
# The request_method is :get, :post, :put, :delete or :head; the
|
61
|
+
# parameters are +nil+, a hash, or a url-encoded or multipart string;
|
62
|
+
# the headers are a hash. Keys are automatically upcased and prefixed
|
63
|
+
# with 'HTTP_' if not already.
|
64
|
+
def xml_http_request(request_method, path, parameters = nil, headers = nil)
|
65
|
+
headers ||= {}
|
66
|
+
headers['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
|
67
|
+
headers['HTTP_ACCEPT'] ||= [Mime::JS, Mime::HTML, Mime::XML, 'text/xml', Mime::ALL].join(', ')
|
68
|
+
process(request_method, path, parameters, headers)
|
69
|
+
end
|
70
|
+
alias xhr :xml_http_request
|
71
|
+
|
72
|
+
# Follow a single redirect response. If the last response was not a
|
73
|
+
# redirect, an exception will be raised. Otherwise, the redirect is
|
74
|
+
# performed on the location header.
|
75
|
+
def follow_redirect!
|
76
|
+
raise "not a redirect! #{status} #{status_message}" unless redirect?
|
77
|
+
get(response.location)
|
78
|
+
status
|
79
|
+
end
|
80
|
+
|
81
|
+
# Performs a request using the specified method, following any subsequent
|
82
|
+
# redirect. Note that the redirects are followed until the response is
|
83
|
+
# not a redirect--this means you may run into an infinite loop if your
|
84
|
+
# redirect loops back to itself.
|
85
|
+
def request_via_redirect(http_method, path, parameters = nil, headers = nil)
|
86
|
+
process(http_method, path, parameters, headers)
|
87
|
+
follow_redirect! while redirect?
|
88
|
+
status
|
89
|
+
end
|
90
|
+
|
91
|
+
# Performs a GET request, following any subsequent redirect.
|
92
|
+
# See +request_via_redirect+ for more information.
|
93
|
+
def get_via_redirect(path, parameters = nil, headers = nil)
|
94
|
+
request_via_redirect(:get, path, parameters, headers)
|
95
|
+
end
|
96
|
+
|
97
|
+
# Performs a POST request, following any subsequent redirect.
|
98
|
+
# See +request_via_redirect+ for more information.
|
99
|
+
def post_via_redirect(path, parameters = nil, headers = nil)
|
100
|
+
request_via_redirect(:post, path, parameters, headers)
|
101
|
+
end
|
102
|
+
|
103
|
+
# Performs a PUT request, following any subsequent redirect.
|
104
|
+
# See +request_via_redirect+ for more information.
|
105
|
+
def put_via_redirect(path, parameters = nil, headers = nil)
|
106
|
+
request_via_redirect(:put, path, parameters, headers)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Performs a DELETE request, following any subsequent redirect.
|
110
|
+
# See +request_via_redirect+ for more information.
|
111
|
+
def delete_via_redirect(path, parameters = nil, headers = nil)
|
112
|
+
request_via_redirect(:delete, path, parameters, headers)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
8
116
|
# An integration Session instance represents a set of requests and responses
|
9
117
|
# performed sequentially by some virtual user. Because you can instantiate
|
10
118
|
# multiple sessions and run them side-by-side, you can also mimic (to some
|
@@ -14,24 +122,18 @@ module ActionController
|
|
14
122
|
# IntegrationTest#open_session, rather than instantiating
|
15
123
|
# Integration::Session directly.
|
16
124
|
class Session
|
17
|
-
|
18
|
-
include ActionController::TestCase::Assertions
|
19
|
-
include ActionController::TestProcess
|
20
|
-
|
21
|
-
# Rack application to use
|
22
|
-
attr_accessor :application
|
125
|
+
DEFAULT_HOST = "www.example.com"
|
23
126
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
# The status message that accompanied the status code of the last request.
|
28
|
-
attr_reader :status_message
|
127
|
+
include Test::Unit::Assertions
|
128
|
+
include TestProcess, RequestHelpers, Assertions
|
29
129
|
|
30
|
-
|
31
|
-
|
130
|
+
%w( status status_message headers body redirect? ).each do |method|
|
131
|
+
delegate method, :to => :response, :allow_nil => true
|
132
|
+
end
|
32
133
|
|
33
|
-
|
34
|
-
|
134
|
+
%w( path ).each do |method|
|
135
|
+
delegate method, :to => :request, :allow_nil => true
|
136
|
+
end
|
35
137
|
|
36
138
|
# The hostname used in the last request.
|
37
139
|
attr_accessor :host
|
@@ -44,10 +146,9 @@ module ActionController
|
|
44
146
|
|
45
147
|
# A map of the cookies returned by the last response, and which will be
|
46
148
|
# sent with the next request.
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
attr_reader :headers
|
149
|
+
def cookies
|
150
|
+
@mock_session.cookie_jar
|
151
|
+
end
|
51
152
|
|
52
153
|
# A reference to the controller instance used by the last request.
|
53
154
|
attr_reader :controller
|
@@ -61,12 +162,9 @@ module ActionController
|
|
61
162
|
# A running counter of the number of requests processed.
|
62
163
|
attr_accessor :request_count
|
63
164
|
|
64
|
-
class MultiPartNeededException < Exception
|
65
|
-
end
|
66
|
-
|
67
165
|
# Create and initialize a new Session instance.
|
68
|
-
def initialize(app
|
69
|
-
@
|
166
|
+
def initialize(app)
|
167
|
+
@app = app
|
70
168
|
reset!
|
71
169
|
end
|
72
170
|
|
@@ -76,14 +174,12 @@ module ActionController
|
|
76
174
|
#
|
77
175
|
# session.reset!
|
78
176
|
def reset!
|
79
|
-
@status = @path = @headers = nil
|
80
|
-
@result = @status_message = nil
|
81
177
|
@https = false
|
82
|
-
@
|
178
|
+
@mock_session = Rack::MockSession.new(@app, DEFAULT_HOST)
|
83
179
|
@controller = @request = @response = nil
|
84
180
|
@request_count = 0
|
85
181
|
|
86
|
-
self.host =
|
182
|
+
self.host = DEFAULT_HOST
|
87
183
|
self.remote_addr = "127.0.0.1"
|
88
184
|
self.accept = "text/xml,application/xml,application/xhtml+xml," +
|
89
185
|
"text/html;q=0.9,text/plain;q=0.8,image/png," +
|
@@ -91,12 +187,12 @@ module ActionController
|
|
91
187
|
|
92
188
|
unless defined? @named_routes_configured
|
93
189
|
# install the named routes in this session instance.
|
94
|
-
klass =
|
95
|
-
Routing::Routes.install_helpers(klass)
|
190
|
+
klass = metaclass
|
191
|
+
ActionController::Routing::Routes.install_helpers(klass)
|
96
192
|
|
97
193
|
# the helpers are made protected by default--we make them public for
|
98
194
|
# easier access during testing and troubleshooting.
|
99
|
-
klass.module_eval { public *Routing::Routes.named_routes.helpers }
|
195
|
+
klass.module_eval { public *ActionController::Routing::Routes.named_routes.helpers }
|
100
196
|
@named_routes_configured = true
|
101
197
|
end
|
102
198
|
end
|
@@ -125,117 +221,6 @@ module ActionController
|
|
125
221
|
@host = name
|
126
222
|
end
|
127
223
|
|
128
|
-
# Follow a single redirect response. If the last response was not a
|
129
|
-
# redirect, an exception will be raised. Otherwise, the redirect is
|
130
|
-
# performed on the location header.
|
131
|
-
def follow_redirect!
|
132
|
-
raise "not a redirect! #{@status} #{@status_message}" unless redirect?
|
133
|
-
get(interpret_uri(headers['location']))
|
134
|
-
status
|
135
|
-
end
|
136
|
-
|
137
|
-
# Performs a request using the specified method, following any subsequent
|
138
|
-
# redirect. Note that the redirects are followed until the response is
|
139
|
-
# not a redirect--this means you may run into an infinite loop if your
|
140
|
-
# redirect loops back to itself.
|
141
|
-
def request_via_redirect(http_method, path, parameters = nil, headers = nil)
|
142
|
-
send(http_method, path, parameters, headers)
|
143
|
-
follow_redirect! while redirect?
|
144
|
-
status
|
145
|
-
end
|
146
|
-
|
147
|
-
# Performs a GET request, following any subsequent redirect.
|
148
|
-
# See +request_via_redirect+ for more information.
|
149
|
-
def get_via_redirect(path, parameters = nil, headers = nil)
|
150
|
-
request_via_redirect(:get, path, parameters, headers)
|
151
|
-
end
|
152
|
-
|
153
|
-
# Performs a POST request, following any subsequent redirect.
|
154
|
-
# See +request_via_redirect+ for more information.
|
155
|
-
def post_via_redirect(path, parameters = nil, headers = nil)
|
156
|
-
request_via_redirect(:post, path, parameters, headers)
|
157
|
-
end
|
158
|
-
|
159
|
-
# Performs a PUT request, following any subsequent redirect.
|
160
|
-
# See +request_via_redirect+ for more information.
|
161
|
-
def put_via_redirect(path, parameters = nil, headers = nil)
|
162
|
-
request_via_redirect(:put, path, parameters, headers)
|
163
|
-
end
|
164
|
-
|
165
|
-
# Performs a DELETE request, following any subsequent redirect.
|
166
|
-
# See +request_via_redirect+ for more information.
|
167
|
-
def delete_via_redirect(path, parameters = nil, headers = nil)
|
168
|
-
request_via_redirect(:delete, path, parameters, headers)
|
169
|
-
end
|
170
|
-
|
171
|
-
# Returns +true+ if the last response was a redirect.
|
172
|
-
def redirect?
|
173
|
-
status/100 == 3
|
174
|
-
end
|
175
|
-
|
176
|
-
# Performs a GET request with the given parameters.
|
177
|
-
#
|
178
|
-
# - +path+: The URI (as a String) on which you want to perform a GET
|
179
|
-
# request.
|
180
|
-
# - +parameters+: The HTTP parameters that you want to pass. This may
|
181
|
-
# be +nil+,
|
182
|
-
# a Hash, or a String that is appropriately encoded
|
183
|
-
# (<tt>application/x-www-form-urlencoded</tt> or
|
184
|
-
# <tt>multipart/form-data</tt>).
|
185
|
-
# - +headers+: Additional HTTP headers to pass, as a Hash. The keys will
|
186
|
-
# automatically be upcased, with the prefix 'HTTP_' added if needed.
|
187
|
-
#
|
188
|
-
# This method returns an Response object, which one can use to
|
189
|
-
# inspect the details of the response. Furthermore, if this method was
|
190
|
-
# called from an ActionController::IntegrationTest object, then that
|
191
|
-
# object's <tt>@response</tt> instance variable will point to the same
|
192
|
-
# response object.
|
193
|
-
#
|
194
|
-
# You can also perform POST, PUT, DELETE, and HEAD requests with +post+,
|
195
|
-
# +put+, +delete+, and +head+.
|
196
|
-
def get(path, parameters = nil, headers = nil)
|
197
|
-
process :get, path, parameters, headers
|
198
|
-
end
|
199
|
-
|
200
|
-
# Performs a POST request with the given parameters. See get() for more
|
201
|
-
# details.
|
202
|
-
def post(path, parameters = nil, headers = nil)
|
203
|
-
process :post, path, parameters, headers
|
204
|
-
end
|
205
|
-
|
206
|
-
# Performs a PUT request with the given parameters. See get() for more
|
207
|
-
# details.
|
208
|
-
def put(path, parameters = nil, headers = nil)
|
209
|
-
process :put, path, parameters, headers
|
210
|
-
end
|
211
|
-
|
212
|
-
# Performs a DELETE request with the given parameters. See get() for
|
213
|
-
# more details.
|
214
|
-
def delete(path, parameters = nil, headers = nil)
|
215
|
-
process :delete, path, parameters, headers
|
216
|
-
end
|
217
|
-
|
218
|
-
# Performs a HEAD request with the given parameters. See get() for more
|
219
|
-
# details.
|
220
|
-
def head(path, parameters = nil, headers = nil)
|
221
|
-
process :head, path, parameters, headers
|
222
|
-
end
|
223
|
-
|
224
|
-
# Performs an XMLHttpRequest request with the given parameters, mirroring
|
225
|
-
# a request from the Prototype library.
|
226
|
-
#
|
227
|
-
# The request_method is :get, :post, :put, :delete or :head; the
|
228
|
-
# parameters are +nil+, a hash, or a url-encoded or multipart string;
|
229
|
-
# the headers are a hash. Keys are automatically upcased and prefixed
|
230
|
-
# with 'HTTP_' if not already.
|
231
|
-
def xml_http_request(request_method, path, parameters = nil, headers = nil)
|
232
|
-
headers ||= {}
|
233
|
-
headers['X-Requested-With'] = 'XMLHttpRequest'
|
234
|
-
headers['Accept'] ||= [Mime::JS, Mime::HTML, Mime::XML, 'text/xml', Mime::ALL].join(', ')
|
235
|
-
process(request_method, path, parameters, headers)
|
236
|
-
end
|
237
|
-
alias xhr :xml_http_request
|
238
|
-
|
239
224
|
# Returns the URL for the given options, according to the rules specified
|
240
225
|
# in the application's routes.
|
241
226
|
def url_for(options)
|
@@ -245,135 +230,55 @@ module ActionController
|
|
245
230
|
end
|
246
231
|
|
247
232
|
private
|
248
|
-
# Tailors the session based on the given URI, setting the HTTPS value
|
249
|
-
# and the hostname.
|
250
|
-
def interpret_uri(path)
|
251
|
-
location = URI.parse(path)
|
252
|
-
https! URI::HTTPS === location if location.scheme
|
253
|
-
host! location.host if location.host
|
254
|
-
location.query ? "#{location.path}?#{location.query}" : location.path
|
255
|
-
end
|
256
233
|
|
257
234
|
# Performs the actual request.
|
258
|
-
def process(method, path, parameters = nil,
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
if method == :get
|
266
|
-
env["QUERY_STRING"] = data
|
267
|
-
data = nil
|
235
|
+
def process(method, path, parameters = nil, rack_environment = nil)
|
236
|
+
if path =~ %r{://}
|
237
|
+
location = URI.parse(path)
|
238
|
+
https! URI::HTTPS === location if location.scheme
|
239
|
+
host! location.host if location.host
|
240
|
+
path = location.query ? "#{location.path}?#{location.query}" : location.path
|
268
241
|
end
|
269
242
|
|
270
|
-
|
243
|
+
unless ActionController::Base < ActionController::Testing
|
244
|
+
ActionController::Base.class_eval do
|
245
|
+
include ActionController::Testing
|
246
|
+
end
|
247
|
+
end
|
271
248
|
|
272
|
-
|
273
|
-
|
274
|
-
|
249
|
+
env = {
|
250
|
+
:method => method,
|
251
|
+
:params => parameters,
|
275
252
|
|
276
|
-
env.update(
|
277
|
-
"REQUEST_METHOD" => method.to_s.upcase,
|
278
253
|
"SERVER_NAME" => host,
|
279
254
|
"SERVER_PORT" => (https? ? "443" : "80"),
|
280
255
|
"HTTPS" => https? ? "on" : "off",
|
281
256
|
"rack.url_scheme" => https? ? "https" : "http",
|
282
|
-
"SCRIPT_NAME" => "",
|
283
257
|
|
284
258
|
"REQUEST_URI" => path,
|
285
|
-
"PATH_INFO" => path,
|
286
259
|
"HTTP_HOST" => host,
|
287
260
|
"REMOTE_ADDR" => remote_addr,
|
288
261
|
"CONTENT_TYPE" => "application/x-www-form-urlencoded",
|
289
|
-
"CONTENT_LENGTH" => data ? data.length.to_s : nil,
|
290
262
|
"HTTP_ACCEPT" => accept,
|
291
263
|
|
292
|
-
"
|
293
|
-
|
294
|
-
"rack.errors" => StringIO.new,
|
295
|
-
"rack.multithread" => true,
|
296
|
-
"rack.multiprocess" => true,
|
297
|
-
"rack.run_once" => false
|
298
|
-
)
|
299
|
-
|
300
|
-
env['HTTP_COOKIE'] = encode_cookies if cookies.any?
|
264
|
+
"action_dispatch.show_exceptions" => false
|
265
|
+
}
|
301
266
|
|
302
|
-
(
|
303
|
-
key = key.to_s.upcase.gsub(/-/, "_")
|
304
|
-
key = "HTTP_#{key}" unless env.has_key?(key) || key =~ /^HTTP_/
|
267
|
+
(rack_environment || {}).each do |key, value|
|
305
268
|
env[key] = value
|
306
269
|
end
|
307
270
|
|
308
|
-
|
309
|
-
|
310
|
-
ActionController::Base.class_eval { include mod }
|
311
|
-
end
|
312
|
-
end
|
313
|
-
|
314
|
-
ActionController::Base.clear_last_instantiation!
|
271
|
+
session = Rack::Test::Session.new(@mock_session)
|
272
|
+
session.request(path, env)
|
315
273
|
|
316
|
-
app = Rack::Lint.new(@application)
|
317
|
-
status, headers, body = app.call(env)
|
318
274
|
@request_count += 1
|
319
|
-
|
275
|
+
@request = ActionDispatch::Request.new(session.last_request.env)
|
276
|
+
@response = ActionDispatch::TestResponse.from_response(@mock_session.last_response)
|
320
277
|
@html_document = nil
|
321
278
|
|
322
|
-
@
|
323
|
-
@status_message = StatusCodes::STATUS_CODES[@status]
|
324
|
-
|
325
|
-
@headers = Rack::Utils::HeaderHash.new(headers)
|
326
|
-
|
327
|
-
cookies = @headers['Set-Cookie']
|
328
|
-
cookies = cookies.to_s.split("\n") unless cookies.is_a?(Array)
|
329
|
-
cookies.each do |cookie|
|
330
|
-
name, value = cookie.match(/^([^=]*)=([^;]*);/)[1,2]
|
331
|
-
@cookies[name] = value
|
332
|
-
end
|
333
|
-
|
334
|
-
@body = ""
|
335
|
-
if body.respond_to?(:to_str)
|
336
|
-
@body << body
|
337
|
-
else
|
338
|
-
body.each { |part| @body << part }
|
339
|
-
end
|
340
|
-
|
341
|
-
if @controller = ActionController::Base.last_instantiation
|
342
|
-
@request = @controller.request
|
343
|
-
@response = @controller.response
|
344
|
-
@controller.send(:set_test_assigns)
|
345
|
-
else
|
346
|
-
# Decorate responses from Rack Middleware and Rails Metal
|
347
|
-
# as an Response for the purposes of integration testing
|
348
|
-
@response = Response.new
|
349
|
-
@response.status = status.to_s
|
350
|
-
@response.headers.replace(@headers)
|
351
|
-
@response.body = @body
|
352
|
-
end
|
353
|
-
|
354
|
-
# Decorate the response with the standard behavior of the
|
355
|
-
# TestResponse so that things like assert_response can be
|
356
|
-
# used in integration tests.
|
357
|
-
@response.extend(TestResponseBehavior)
|
358
|
-
|
359
|
-
body.close if body.respond_to?(:close)
|
360
|
-
|
361
|
-
return @status
|
362
|
-
rescue MultiPartNeededException
|
363
|
-
boundary = "----------XnJLe9ZIbbGUYtzPQJ16u1"
|
364
|
-
status = process(method, path,
|
365
|
-
multipart_body(parameters, boundary),
|
366
|
-
(headers || {}).merge(
|
367
|
-
{"CONTENT_TYPE" => "multipart/form-data; boundary=#{boundary}"}))
|
368
|
-
return status
|
369
|
-
end
|
279
|
+
@controller = session.last_request.env['action_controller.instance']
|
370
280
|
|
371
|
-
|
372
|
-
# request.
|
373
|
-
def encode_cookies
|
374
|
-
cookies.inject("") do |string, (name, value)|
|
375
|
-
string << "#{name}=#{value}; "
|
376
|
-
end
|
281
|
+
return response.status
|
377
282
|
end
|
378
283
|
|
379
284
|
# Get a temporary URL writer object
|
@@ -386,118 +291,13 @@ module ActionController
|
|
386
291
|
"SERVER_PORT" => https? ? "443" : "80",
|
387
292
|
"HTTPS" => https? ? "on" : "off"
|
388
293
|
}
|
389
|
-
UrlRewriter.new(Request.new(env), {})
|
390
|
-
end
|
391
|
-
|
392
|
-
def name_with_prefix(prefix, name)
|
393
|
-
prefix ? "#{prefix}[#{name}]" : name.to_s
|
294
|
+
ActionController::UrlRewriter.new(ActionDispatch::Request.new(env), {})
|
394
295
|
end
|
395
|
-
|
396
|
-
# Convert the given parameters to a request string. The parameters may
|
397
|
-
# be a string, +nil+, or a Hash.
|
398
|
-
def requestify(parameters, prefix=nil)
|
399
|
-
if TestUploadedFile === parameters
|
400
|
-
raise MultiPartNeededException
|
401
|
-
elsif Hash === parameters
|
402
|
-
return nil if parameters.empty?
|
403
|
-
parameters.map { |k,v|
|
404
|
-
requestify(v, name_with_prefix(prefix, k))
|
405
|
-
}.join("&")
|
406
|
-
elsif Array === parameters
|
407
|
-
parameters.map { |v|
|
408
|
-
requestify(v, name_with_prefix(prefix, ""))
|
409
|
-
}.join("&")
|
410
|
-
elsif prefix.nil?
|
411
|
-
parameters
|
412
|
-
else
|
413
|
-
"#{CGI.escape(prefix)}=#{CGI.escape(parameters.to_s)}"
|
414
|
-
end
|
415
|
-
end
|
416
|
-
|
417
|
-
def multipart_requestify(params, first=true)
|
418
|
-
Array.new.tap do |p|
|
419
|
-
params.each do |key, value|
|
420
|
-
k = first ? key.to_s : "[#{key.to_s}]"
|
421
|
-
if Hash === value
|
422
|
-
multipart_requestify(value, false).each do |subkey, subvalue|
|
423
|
-
p << [k + subkey, subvalue]
|
424
|
-
end
|
425
|
-
elsif Array === value
|
426
|
-
value.each do |element|
|
427
|
-
if Hash === element || Array === element
|
428
|
-
multipart_requestify(element, false).each do |subkey, subvalue|
|
429
|
-
p << ["#{k}[]#{subkey}", subvalue]
|
430
|
-
end
|
431
|
-
else
|
432
|
-
p << ["#{k}[]", element]
|
433
|
-
end
|
434
|
-
end
|
435
|
-
else
|
436
|
-
p << [k, value]
|
437
|
-
end
|
438
|
-
end
|
439
|
-
end
|
440
|
-
end
|
441
|
-
|
442
|
-
def multipart_body(params, boundary)
|
443
|
-
multipart_requestify(params).map do |key, value|
|
444
|
-
if value.respond_to?(:original_filename)
|
445
|
-
File.open(value.path, "rb") do |f|
|
446
|
-
f.set_encoding(Encoding::BINARY) if f.respond_to?(:set_encoding)
|
447
|
-
|
448
|
-
<<-EOF
|
449
|
-
--#{boundary}\r
|
450
|
-
Content-Disposition: form-data; name="#{key}"; filename="#{CGI.escape(value.original_filename)}"\r
|
451
|
-
Content-Type: #{value.content_type}\r
|
452
|
-
Content-Length: #{File.stat(value.path).size}\r
|
453
|
-
\r
|
454
|
-
#{f.read}\r
|
455
|
-
EOF
|
456
|
-
end
|
457
|
-
else
|
458
|
-
<<-EOF
|
459
|
-
--#{boundary}\r
|
460
|
-
Content-Disposition: form-data; name="#{key}"\r
|
461
|
-
\r
|
462
|
-
#{value}\r
|
463
|
-
EOF
|
464
|
-
end
|
465
|
-
end.join("")+"--#{boundary}--\r"
|
466
|
-
end
|
467
|
-
|
468
|
-
end
|
469
|
-
|
470
|
-
# A module used to extend ActionController::Base, so that integration tests
|
471
|
-
# can capture the controller used to satisfy a request.
|
472
|
-
module ControllerCapture #:nodoc:
|
473
|
-
def self.included(base)
|
474
|
-
base.extend(ClassMethods)
|
475
|
-
base.class_eval do
|
476
|
-
class << self
|
477
|
-
alias_method_chain :new, :capture
|
478
|
-
end
|
479
|
-
end
|
480
|
-
end
|
481
|
-
|
482
|
-
module ClassMethods #:nodoc:
|
483
|
-
mattr_accessor :last_instantiation
|
484
|
-
|
485
|
-
def clear_last_instantiation!
|
486
|
-
self.last_instantiation = nil
|
487
|
-
end
|
488
|
-
|
489
|
-
def new_with_capture(*args)
|
490
|
-
controller = new_without_capture(*args)
|
491
|
-
self.last_instantiation ||= controller
|
492
|
-
controller
|
493
|
-
end
|
494
|
-
end
|
495
296
|
end
|
496
297
|
|
497
298
|
module Runner
|
498
|
-
def
|
499
|
-
|
500
|
-
@integration_session = nil
|
299
|
+
def app
|
300
|
+
@app
|
501
301
|
end
|
502
302
|
|
503
303
|
# Reset the current session. This is useful for testing multiple sessions
|
@@ -512,7 +312,7 @@ EOF
|
|
512
312
|
reset! unless @integration_session
|
513
313
|
# reset the html_document variable, but only for new get/post calls
|
514
314
|
@html_document = nil unless %w(cookies assigns).include?(method)
|
515
|
-
@integration_session.__send__(method, *args)
|
315
|
+
returning @integration_session.__send__(method, *args) do
|
516
316
|
copy_session_variables!
|
517
317
|
end
|
518
318
|
end
|
@@ -528,15 +328,15 @@ EOF
|
|
528
328
|
# By default, a single session is automatically created for you, but you
|
529
329
|
# can use this method to open multiple sessions that ought to be tested
|
530
330
|
# simultaneously.
|
531
|
-
def open_session(
|
532
|
-
session = Integration::Session.new(
|
331
|
+
def open_session(app = nil)
|
332
|
+
session = Integration::Session.new(app || self.app)
|
533
333
|
|
534
334
|
# delegate the fixture accessors back to the test instance
|
535
335
|
extras = Module.new { attr_accessor :delegate, :test_result }
|
536
336
|
if self.class.respond_to?(:fixture_table_names)
|
537
337
|
self.class.fixture_table_names.each do |table_name|
|
538
338
|
name = table_name.tr(".", "_")
|
539
|
-
next unless respond_to?(name
|
339
|
+
next unless respond_to?(name)
|
540
340
|
extras.__send__(:define_method, name) { |*args|
|
541
341
|
delegate.send(name, *args)
|
542
342
|
}
|
@@ -568,7 +368,7 @@ EOF
|
|
568
368
|
def method_missing(sym, *args, &block)
|
569
369
|
reset! unless @integration_session
|
570
370
|
if @integration_session.respond_to?(sym)
|
571
|
-
@integration_session.__send__(sym, *args, &block)
|
371
|
+
returning @integration_session.__send__(sym, *args, &block) do
|
572
372
|
copy_session_variables!
|
573
373
|
end
|
574
374
|
else
|
@@ -586,7 +386,7 @@ EOF
|
|
586
386
|
# At its simplest, you simply extend IntegrationTest and write your tests
|
587
387
|
# using the get/post methods:
|
588
388
|
#
|
589
|
-
# require "
|
389
|
+
# require "test_helper"
|
590
390
|
#
|
591
391
|
# class ExampleTest < ActionController::IntegrationTest
|
592
392
|
# fixtures :people
|
@@ -610,7 +410,7 @@ EOF
|
|
610
410
|
# powerful testing DSL that is specific for your application. You can even
|
611
411
|
# reference any named routes you happen to have defined!
|
612
412
|
#
|
613
|
-
# require "
|
413
|
+
# require "test_helper"
|
614
414
|
#
|
615
415
|
# class AdvancedTest < ActionController::IntegrationTest
|
616
416
|
# fixtures :people, :rooms
|
@@ -656,53 +456,20 @@ EOF
|
|
656
456
|
class IntegrationTest < ActiveSupport::TestCase
|
657
457
|
include Integration::Runner
|
658
458
|
|
659
|
-
|
660
|
-
# as a symbol (:default_test), which causes regex test filters
|
661
|
-
# (like "ruby test.rb -n /foo/") to fail because =~ doesn't work on
|
662
|
-
# symbols.
|
663
|
-
def initialize(name) #:nodoc:
|
664
|
-
super(name.to_s)
|
665
|
-
end
|
459
|
+
@@app = nil
|
666
460
|
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
def run(*args) #:nodoc:
|
672
|
-
return if @method_name == "default_test"
|
673
|
-
super
|
461
|
+
def self.app
|
462
|
+
# DEPRECATE Rails application fallback
|
463
|
+
# This should be set by the initializer
|
464
|
+
@@app || (defined?(Rails.application) && Rails.application) || nil
|
674
465
|
end
|
675
466
|
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
# ActionController::IntegrationTest, since by the time the value is set on
|
680
|
-
# TestCase, IntegrationTest has already been defined and cannot inherit
|
681
|
-
# changes to those variables. So, we make those two attributes
|
682
|
-
# copy-on-write.
|
683
|
-
|
684
|
-
class << self
|
685
|
-
def use_transactional_fixtures=(flag) #:nodoc:
|
686
|
-
@_use_transactional_fixtures = true
|
687
|
-
@use_transactional_fixtures = flag
|
688
|
-
end
|
689
|
-
|
690
|
-
def use_instantiated_fixtures=(flag) #:nodoc:
|
691
|
-
@_use_instantiated_fixtures = true
|
692
|
-
@use_instantiated_fixtures = flag
|
693
|
-
end
|
694
|
-
|
695
|
-
def use_transactional_fixtures #:nodoc:
|
696
|
-
@_use_transactional_fixtures ?
|
697
|
-
@use_transactional_fixtures :
|
698
|
-
superclass.use_transactional_fixtures
|
699
|
-
end
|
467
|
+
def self.app=(app)
|
468
|
+
@@app = app
|
469
|
+
end
|
700
470
|
|
701
|
-
|
702
|
-
|
703
|
-
@use_instantiated_fixtures :
|
704
|
-
superclass.use_instantiated_fixtures
|
705
|
-
end
|
471
|
+
def app
|
472
|
+
super || self.class.app
|
706
473
|
end
|
707
474
|
end
|
708
475
|
end
|