Module: Devise::Test::ControllerHelpers

Extended by:
ActiveSupport::Concern
Defined in:
lib/devise/test/controller_helpers.rb

Overview

`Devise::Test::ControllerHelpers` 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::Test::ControllerHelpers` in integration tests.

Examples

class PostsTest < ActionController::TestCase
  include Devise::Test::ControllerHelpers

  test 'authenticated users can GET index' do
     users(:bob)

    get :index
    assert_response :success
  end
end

Important: you should not test Warden specific behavior (like callbacks) using `Devise::Test::ControllerHelpers` since it is a stub of the actual behavior. Such callbacks should be tested in your integration suite instead.

Instance Method Summary collapse

Instance Method Details

#processObject

Override process to consider warden.


34
35
36
37
38
# File 'lib/devise/test/controller_helpers.rb', line 34

def process(*)
  _catch_warden { super }

  @response
end

#setup_controller_for_wardenObject

We need to set up the environment variables and the response in the controller.


43
44
45
# File 'lib/devise/test/controller_helpers.rb', line 43

def setup_controller_for_warden #:nodoc:
  @request.env['action_controller.instance'] = @controller
end

#sign_in(resource, deprecated = nil, scope: nil) ⇒ Object

sign_in a given resource by storing its keys in the session. This method bypass any warden authentication callback.

  • resource - The resource that should be authenticated

  • scope - An optional Symbol with the scope where the resource

    should be signed in with.
    

Examples:

sign_in users(:alice) sign_in users(:alice), scope: :admin


67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/devise/test/controller_helpers.rb', line 67

def (resource, deprecated = nil, scope: nil)
  if deprecated.present?
    scope = resource
    resource = deprecated

    ActiveSupport::Deprecation.warn <<-DEPRECATION.strip_heredoc
      [Devise] sign_in(:#{scope}, resource) on controller tests is deprecated and will be removed from Devise.
      Please use sign_in(resource, scope: :#{scope}) instead.
    DEPRECATION
  end

  scope ||= Devise::Mapping.find_scope!(resource)

  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)

92
93
94
95
96
97
# File 'lib/devise/test/controller_helpers.rb', line 92

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.


48
49
50
51
52
53
54
55
# File 'lib/devise/test/controller_helpers.rb', line 48

def warden #:nodoc:
  @request.env['warden'] ||= begin
    manager = Warden::Manager.new(nil) do |config|
      config.merge! Devise.warden_config
    end
    Warden::Proxy.new(@request.env, manager)
  end
end