Module: Devise::TestHelpers
- Defined in:
- lib/devise/test_helpers.rb
Overview
Devise::TestHelpers provides a facility to test controllers in isolation when using ActionController::TestCase allowing you to quickly sign_in or sign_out a user. Do not use Devise::TestHelpers in integration tests.
Notice you should not test Warden specific behavior (like Warden callbacks) using Devise::TestHelpers since it is a stub of the actual behavior. Such callbacks should be tested in your integration suite instead.
Instance Method Summary collapse
- 
  
    
      #_catch_warden(&block)  ⇒ Object 
    
    
  
  
  
  
  protected
  
  
  
  
    Catch warden continuations and handle like the middleware would. 
- #_process_unauthenticated(env, options = {}) ⇒ Object protected
- 
  
    
      #process  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Override process to consider warden. 
- 
  
    
      #setup_controller_for_warden  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    We need to setup the environment variables and the response in the controller. 
- 
  
    
      #sign_in(resource_or_scope, resource = nil)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    sign_in a given resource by storing its keys in the session. 
- 
  
    
      #sign_out(resource_or_scope)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Sign out a given resource or scope by calling logout on Warden. 
- 
  
    
      #warden  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Quick access to Warden::Proxy. 
Instance Method Details
#_catch_warden(&block) ⇒ Object (protected)
Catch warden continuations and handle like the middleware would. Returns nil when interrupted, otherwise the normal result of the block.
| 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | # File 'lib/devise/test_helpers.rb', line 71 def _catch_warden(&block) result = catch(:warden, &block) env = @controller.request.env result ||= {} # Set the response. In production, the rack result is returned # from Warden::Manager#call, which the following is modelled on. case result when Array if result.first == 401 && intercept_401?(env) # does this happen during testing? _process_unauthenticated(env) else result end when Hash _process_unauthenticated(env, result) else result end end | 
#_process_unauthenticated(env, options = {}) ⇒ Object (protected)
| 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | # File 'lib/devise/test_helpers.rb', line 94 def _process_unauthenticated(env, = {}) [:action] ||= :unauthenticated proxy = env['warden'] result = [:result] || proxy.result ret = case result when :redirect body = proxy. || "You are being redirected to #{proxy.headers['Location']}" [proxy.status, proxy.headers, [body]] when :custom proxy.custom_response else env["PATH_INFO"] = "/#{[:action]}" env["warden.options"] = Warden::Manager._run_callbacks(:before_failure, env, ) status, headers, response = Devise.warden_config[:failure_app].call(env).to_a @controller.send :render, :status => status, :text => response.body, :content_type => headers["Content-Type"], :location => headers["Location"] 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) # ensure the controller response is set to our response. @controller.response ||= @response @response.status = ret.first @response.headers = ret.second @response.body = ret.third end ret end | 
#process ⇒ Object
Override process to consider warden.
| 17 18 19 20 | # File 'lib/devise/test_helpers.rb', line 17 def process(*) # Make sure we always return @response, a la ActionController::TestCase::Behaviour#process, even if warden interrupts _catch_warden { super } || @response end | 
#setup_controller_for_warden ⇒ Object
We need to setup the environment variables and the response in the controller.
| 23 24 25 | # File 'lib/devise/test_helpers.rb', line 23 def setup_controller_for_warden #:nodoc: @request.env['action_controller.instance'] = @controller end | 
#sign_in(resource_or_scope, resource = nil) ⇒ Object
sign_in a given resource by storing its keys in the session. This method bypass any warden authentication callback.
Examples:
sign_in :user, @user   # sign_in(scope, resource)
sign_in @user          # sign_in(resource)
| 45 46 47 48 49 50 | # File 'lib/devise/test_helpers.rb', line 45 def sign_in(resource_or_scope, resource=nil) scope ||= Devise::Mapping.find_scope!(resource_or_scope) resource ||= resource_or_scope warden.instance_variable_get(:@users).delete(scope) warden.session_serializer.store(resource, scope) end | 
#sign_out(resource_or_scope) ⇒ Object
Sign out a given resource or scope by calling logout on Warden. This method bypass any warden logout callback.
Examples:
sign_out :user     # sign_out(scope)
sign_out @user     # sign_out(resource)
| 60 61 62 63 64 65 | # File 'lib/devise/test_helpers.rb', line 60 def sign_out(resource_or_scope) scope = Devise::Mapping.find_scope!(resource_or_scope) @controller.instance_variable_set(:"@current_#{scope}", nil) user = warden.instance_variable_get(:@users).delete(scope) warden.session_serializer.delete(scope, user) end | 
#warden ⇒ Object
Quick access to Warden::Proxy.
| 28 29 30 31 32 33 34 35 | # File 'lib/devise/test_helpers.rb', line 28 def warden #:nodoc: @warden ||= begin manager = Warden::Manager.new(nil) do |config| config.merge! Devise.warden_config end @request.env['warden'] = Warden::Proxy.new(@request.env, manager) end end |