module ActionController::TestCase::Behavior

def build_response(klass)

def build_response(klass)
  klass.create
end

def check_required_ivars

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

def controller_class_name

def controller_class_name
  @controller.class.anonymous? ? "anonymous" : @controller.class.controller_path
end

def delete(action, *args)

See +get+ for more details.
Simulate a DELETE request with the given parameters and set/volley the response.
def delete(action, *args)
  process_with_kwargs("DELETE", action, *args)
end

def document_root_element

def document_root_element
  html_document.root
end

def generated_path(generated_extras)

def generated_path(generated_extras)
  generated_extras[0]
end

def get(action, *args)

available to make the tests more expressive.
Note that the request method is not verified. The different methods are

flash: { notice: 'This is flash message' }
session: { user_id: 1 },
params: { id: 7 },
get :show,

Example sending parameters, session and setting a flash message:
+post+, +patch+, +put+, +delete+, and +head+.
You can also simulate POST, PATCH, PUT, DELETE, and HEAD requests with

- +flash+: A hash of parameters to store in the flash. This may be +nil+.
- +session+: A hash of parameters to store in the session. This may be +nil+.
(application/x-www-form-urlencoded or multipart/form-data).
- +body+: The request body with a string that is appropriately encoded
- +params+: The hash with HTTP parameters that you want to pass. This may be +nil+.
- +action+: The controller action to call.

Simulate a GET request with the given parameters.
def get(action, *args)
  res = process_with_kwargs("GET", action, *args)
  cookies.update res.cookies
  res
end

def head(action, *args)

See +get+ for more details.
Simulate a HEAD request with the given parameters and set/volley the response.
def head(action, *args)
  process_with_kwargs("HEAD", action, *args)
end

def html_format?(parameters)

def html_format?(parameters)
  return true unless parameters.key?(:format)
  Mime.fetch(parameters[:format]) { Mime['html'] }.html?
end

def kwarg_request?(args)

def kwarg_request?(args)
  args.size == 1 && args[0].respond_to?(:keys) && (
    args[0].keys.all? { |k| FORMAT_KWARGS.include?(k) } ||
    args[0].keys.any? { |k| REQUEST_KWARGS.include?(k) }
  )
end

def non_kwarg_request_warning

def non_kwarg_request_warning
  ActiveSupport::Deprecation.warn(<<-MSG.strip_heredoc)
    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.
  MSG
end

def patch(action, *args)

See +get+ for more details.
Simulate a PATCH request with the given parameters and set/volley the response.
def patch(action, *args)
  process_with_kwargs("PATCH", action, *args)
end

def post(action, *args)

See +get+ for more details.
Simulate a POST request with the given parameters and set/volley the response.
def post(action, *args)
  process_with_kwargs("POST", action, *args)
end

def process(action, *args)

Note that the request method is not verified.

respectively which will make tests more expressive.
prefer using #get, #post, #patch, #put, #delete and #head methods
To simulate +GET+, +POST+, +PATCH+, +PUT+, +DELETE+ and +HEAD+ requests

flash: { notice: 'This is flash message' }
session: { user_id: 1 },
},
user: { name: 'Gaurish Sharma', email: 'user@example.com' }
params: {
method: 'POST',
process :create,

Example calling +create+ action and sending two params:

to a mime type.
- +as+: Content type. Defaults to +nil+. Must be a symbol that corresponds
- +format+: Request format. Defaults to +nil+. Can be string or symbol.
- +flash+: A hash of parameters to store in the flash. This may be +nil+.
- +session+: A hash of parameters to store in the session. This may be +nil+.
(application/x-www-form-urlencoded or multipart/form-data).
- +body+: The request body with a string that is appropriately encoded
- +params+: The hash with HTTP parameters that you want to pass. This may be +nil+.
are +GET+, +POST+, +PATCH+, +PUT+, +DELETE+, +HEAD+. Defaults to +GET+. Can be a symbol.
- +method+: Request method used to send the HTTP request. Possible values
- +action+: The controller action to call.

parameters and set/volley the response.
Simulate an HTTP request to +action+ by specifying request method,
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
    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

def process_with_kwargs(http_method, action, *args)

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

def put(action, *args)

See +get+ for more details.
Simulate a PUT request with the given parameters and set/volley the response.
def put(action, *args)
  process_with_kwargs("PUT", action, *args)
end

def query_parameter_names(generated_extras)

def query_parameter_names(generated_extras)
  generated_extras[1] + [:controller, :action]
end

def scrub_env!(env)

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

def setup_controller_request_and_response

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

def xml_http_request(*args)

def xml_http_request(*args)
  ActiveSupport::Deprecation.warn(<<-MSG.strip_heredoc)
    `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`.
  MSG
  @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