module ActionController::TestCase::Behavior
Constants
- REQUEST_KWARGS
Attributes
Public Instance Methods
# File lib/action_controller/test_case.rb, line 620 def build_response(klass) klass.create end
# File lib/action_controller/test_case.rb, line 580 def controller_class_name @controller.class.anonymous? ? "anonymous" : @controller.class.controller_path end
Simulate a DELETE request with the given parameters and set/volley the
response. See get for more details.
# File lib/action_controller/test_case.rb, line 414 def delete(action, *args) process_with_kwargs("DELETE", action, *args) end
# File lib/action_controller/test_case.rb, line 584 def generated_path(generated_extras) generated_extras[0] end
Simulate a GET request with the given parameters.
-
action: The controller action to call. -
params: The hash with HTTP parameters that you want to pass. This may benil. -
body: The request body with a string that is appropriately encoded (application/x-www-form-urlencodedormultipart/form-data). -
session: A hash of parameters to store in the session. This may benil. -
flash: A hash of parameters to store in the flash. This may benil.
You can also simulate POST, PATCH, PUT, DELETE, and HEAD requests with
post, patch, put,
delete, and head. Example sending parameters,
session and setting a flash message:
get :show, params: { id: 7 }, session: { user_id: 1 }, flash: { notice: 'This is flash message' }
Note that the request method is not verified. The different methods are available to make the tests more expressive.
# File lib/action_controller/test_case.rb, line 388 def get(action, *args) res = process_with_kwargs("GET", action, *args) cookies.update res.cookies res end
Simulate a HEAD request with the given parameters and set/volley the
response. See get for more details.
# File lib/action_controller/test_case.rb, line 420 def head(action, *args) process_with_kwargs("HEAD", action, *args) end
Simulate a PATCH request with the given parameters and set/volley the
response. See get for more details.
# File lib/action_controller/test_case.rb, line 402 def patch(action, *args) process_with_kwargs("PATCH", action, *args) end
Simulate a POST request with the given parameters and set/volley the
response. See get for more details.
# File lib/action_controller/test_case.rb, line 396 def post(action, *args) process_with_kwargs("POST", action, *args) end
Simulate an HTTP request to action by specifying request
method, parameters and set/volley the response.
-
action: The controller action to call. -
method: Request method used to send the HTTP request. Possible values areGET,POST,PATCH,PUT,DELETE,HEAD. Defaults toGET. Can be a symbol. -
params: The hash with HTTP parameters that you want to pass. This may benil. -
body: The request body with a string that is appropriately encoded (application/x-www-form-urlencodedormultipart/form-data). -
session: A hash of parameters to store in the session. This may benil. -
flash: A hash of parameters to store in the flash. This may benil. -
format: Request format. Defaults tonil. Can be string or symbol. -
as: Content type. Defaults tonil. Must be a symbol that corresponds to a mime type.
Example calling create action and sending two params:
process :create, method: 'POST', params: { user: { name: 'Gaurish Sharma', email: 'user@example.com' } }, session: { user_id: 1 }, flash: { notice: 'This is flash message' }
To simulate GET, POST, PATCH,
PUT, DELETE and HEAD requests prefer
using get, post, patch, put, delete and head methods respectively which will
make tests more expressive.
Note that the request method is not verified.
# File lib/action_controller/test_case.rb, line 469 def process(action, *args) check_required_ivars if kwarg_request?(args) parameters, session, body, flash, http_method, format, xhr, as = args[0].values_at(:params, :session, :body, :flash, :method, :format, :xhr, :as) else http_method, parameters, session, flash = args format = nil if parameters.is_a?(String) && http_method != 'HEAD' body = parameters parameters = nil end if parameters || session || flash non_kwarg_request_warning end end if body @request.set_header 'RAW_POST_DATA', body end if http_method http_method = http_method.to_s.upcase else http_method = "GET" end parameters ||= {} @html_document = nil self.cookies.update @request.cookies self.cookies.update_cookies_from_jar @request.set_header 'HTTP_COOKIE', cookies.to_header @request.delete_header 'action_dispatch.cookies' @request = TestRequest.new scrub_env!(@request.env), @request.session @response = build_response @response_klass @response.request = @request @controller.recycle! @request.set_header 'REQUEST_METHOD', http_method if as @request.content_type = Mime[as].to_s format ||= as end if format parameters[:format] = format end parameters = parameters.symbolize_keys generated_extras = @routes.generate_extras(parameters.merge(controller: controller_class_name, action: action.to_s)) generated_path = generated_path(generated_extras) query_string_keys = query_parameter_names(generated_extras) @request.assign_parameters(@routes, controller_class_name, action.to_s, parameters, generated_path, query_string_keys) @request.session.update(session) if session @request.flash.update(flash || {}) if xhr @request.set_header 'HTTP_X_REQUESTED_WITH', 'XMLHttpRequest' @request.fetch_header('HTTP_ACCEPT') do |k| @request.set_header k, [Mime[:js], Mime[:html], Mime[:xml], 'text/xml', '*/*'].join(', ') end end @request.fetch_header("SCRIPT_NAME") do |k| @request.set_header k, @controller.config.relative_url_root end begin @controller.recycle! @controller.dispatch(action, @request, @response) ensure @request = @controller.request @response = @controller.response @request.delete_header 'HTTP_COOKIE' if @request.have_cookie_jar? unless @request.cookie_jar.committed? @request.cookie_jar.write(@response) self.cookies.update(@request.cookie_jar.instance_variable_get(:@cookies)) end end @response.prepare! if flash_value = @request.flash.to_session_value @request.session['flash'] = flash_value else @request.session.delete('flash') end if xhr @request.delete_header 'HTTP_X_REQUESTED_WITH' @request.delete_header 'HTTP_ACCEPT' end @request.query_string = '' @response.sent! end @response end
Simulate a PUT request with the given parameters and set/volley the
response. See get for more details.
# File lib/action_controller/test_case.rb, line 408 def put(action, *args) process_with_kwargs("PUT", action, *args) end
# File lib/action_controller/test_case.rb, line 588 def query_parameter_names(generated_extras) generated_extras[1] + [:controller, :action] end
# File lib/action_controller/test_case.rb, line 592 def setup_controller_request_and_response @controller = nil unless defined? @controller @response_klass = ActionDispatch::TestResponse if klass = self.class.controller_class if klass < ActionController::Live @response_klass = LiveTestResponse end unless @controller begin @controller = klass.new rescue warn "could not construct controller #{klass}" if $VERBOSE end end end @request = TestRequest.create @response = build_response @response_klass @response.request = @request if @controller @controller.request = @request @controller.params = {} end end
# File lib/action_controller/test_case.rb, line 424 def xml_http_request(*args) ActiveSupport::Deprecation.warn(" `xhr` and `xml_http_request` are deprecated and will be removed in Rails 5.1. Switch to e.g. `post :create, params: { comment: { body: 'Honey bunny' } }, xhr: true`. ".strip_heredoc) @request.env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest' @request.env['HTTP_ACCEPT'] ||= [Mime[:js], Mime[:html], Mime[:xml], 'text/xml', '*/*'].join(', ') __send__(*args).tap do @request.env.delete 'HTTP_X_REQUESTED_WITH' @request.env.delete 'HTTP_ACCEPT' end end
Private Instance Methods
# File lib/action_controller/test_case.rb, line 681 def check_required_ivars # Sanity check for required instance variables so we can give an # understandable error message. [:@routes, :@controller, :@request, :@response].each do |iv_name| if !instance_variable_defined?(iv_name) || instance_variable_get(iv_name).nil? raise "#{iv_name} is nil: make sure you set it in your test's setup method." end end end
# File lib/action_controller/test_case.rb, line 677 def document_root_element html_document.root end
# File lib/action_controller/test_case.rb, line 691 def html_format?(parameters) return true unless parameters.key?(:format) Mime.fetch(parameters[:format]) { Mime['html'] }.html? end
# File lib/action_controller/test_case.rb, line 656 def kwarg_request?(args) args[0].respond_to?(:keys) && ( (args[0].key?(:format) && args[0].keys.size == 1) || args[0].keys.any? { |k| REQUEST_KWARGS.include?(k) } ) end
# File lib/action_controller/test_case.rb, line 663 def non_kwarg_request_warning ActiveSupport::Deprecation.warn(" Using positional arguments in functional tests has been deprecated, in favor of keyword arguments, and will be removed in Rails 5.1. Deprecated style: get :show, { id: 1 }, nil, { notice: "This is a flash message" } New keyword style: get :show, params: { id: 1 }, flash: { notice: "This is a flash message" }, session: nil # Can safely be omitted. ".strip_heredoc) end
# File lib/action_controller/test_case.rb, line 643 def process_with_kwargs(http_method, action, *args) if kwarg_request?(args) args.first.merge!(method: http_method) process(action, *args) else non_kwarg_request_warning if args.any? args = args.unshift(http_method) process(action, *args) end end
# File lib/action_controller/test_case.rb, line 634 def scrub_env!(env) env.delete_if { |k, v| k =~ /^(action_dispatch|rack)\.request/ } env.delete_if { |k, v| k =~ /^action_dispatch\.rescue/ } env.delete 'action_dispatch.request.query_parameters' env.delete 'action_dispatch.request.request_parameters' env['rack.input'] = StringIO.new env end