Method: Devise::Test::ControllerHelpers#_process_unauthenticated

Defined in:
lib/devise/test/controller_helpers.rb

#_process_unauthenticated(env, options = {}) ⇒ Object (protected)



126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/devise/test/controller_helpers.rb', line 126

def _process_unauthenticated(env, options = {})
  options[:action] ||= :unauthenticated
  proxy = request.env['warden']
  result = options[:result] || proxy.result

  ret = case result
  when :redirect
    body = proxy.message || "You are being redirected to #{proxy.headers['Location']}"
    [proxy.status, proxy.headers, [body]]
  when :custom
    proxy.custom_response
  else
    request.env["PATH_INFO"] = "/#{options[:action]}"
    request.env["warden.options"] = options
    Warden::Manager._run_callbacks(:before_failure, env, options)

    status, headers, response = Devise.warden_config[:failure_app].call(env).to_a
    @controller.response.headers.merge!(headers)
    @controller.status = status
    @controller.response_body = response.body
    nil # causes process return @response
  end

  # ensure that the controller response is set up. In production, this is
  # not necessary since warden returns the results to rack. However, at
  # testing time, we want the response to be available to the testing
  # framework to verify what would be returned to rack.
  if ret.is_a?(Array)
    status, headers, body = *ret
    # ensure the controller response is set to our response.
    @controller.response ||= @response
    @response.status = status
    @response.headers.merge!(headers)
    @response.body = body
  end

  ret
end