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.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



10
11
12
13
14
# File 'lib/devise/test_helpers.rb', line 10

def self.included(base)
  base.class_eval do
    setup :setup_controller_for_warden, :warden if respond_to?(:setup)
  end
end

Instance Method Details

#processObject

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_wardenObject

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:

 :user, @user   # sign_in(scope, resource)
 @user          # sign_in(resource)


45
46
47
48
49
50
# File 'lib/devise/test_helpers.rb', line 45

def (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

#wardenObject

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