Skip to content

Commit

Permalink
Merge pull request #440 from haines/devise
Browse files Browse the repository at this point in the history
Improve Devise integration
  • Loading branch information
steveklabnik committed Jan 26, 2013
2 parents 7a04619 + 5c1aa5a commit b0902ab
Show file tree
Hide file tree
Showing 9 changed files with 249 additions and 35 deletions.
32 changes: 20 additions & 12 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,27 @@ platforms :jruby do
gem "activerecord-jdbcsqlite3-adapter"
end

case ENV["RAILS_VERSION"]
when "master"
gem "rails", github: "rails/rails"
gem "mongoid", github: "mongoid/mongoid", branch: "4.0.0-dev"
version = ENV["RAILS_VERSION"] || "3.2"

when "3.2", nil
gem "rails", "~> 3.2.0"
gem "mongoid", "~> 3.0.0"
rails = case version
when "master"
{github: "rails/rails"}
else
"~> #{version}.0"
end

when "3.1"
gem "rails", "~> 3.1.0"
gem "mongoid", "~> 3.0.0"
mongoid = case version
when "master"
{github: "mongoid/mongoid", branch: "4.0.0-dev"}
when "3.1", "3.2"
"~> 3.0.0"
end

when "3.0"
gem "rails", "~> 3.0.0"
devise = case version
when "3.1", "3.2"
"~> 2.2"
end

gem "rails", rails
gem "mongoid", mongoid if mongoid
gem "devise", devise if devise
40 changes: 18 additions & 22 deletions lib/draper/test/devise_helper.rb
Original file line number Diff line number Diff line change
@@ -1,33 +1,29 @@
module Draper
module DeviseHelper
def sign_in(user)
warden.stub :authenticate! => user
controller.stub :current_user => user
user
end

private
def sign_in(resource_or_scope, resource = nil)
scope = begin
Devise::Mapping.find_scope!(resource_or_scope)
rescue RuntimeError => e
# Draper 1.0 didn't require the mapping to exist
ActiveSupport::Deprecation.warn("#{e.message}.\nUse `sign_in :user, mock_user` instead.", caller)
:user
end

def request
@request ||= ::ActionDispatch::TestRequest.new
_stub_current_scope scope, resource || resource_or_scope
end

def controller
return @controller if @controller
@controller = ApplicationController.new
@controller.request = request
::Draper::ViewContext.current = @controller.view_context
@controller
def sign_out(resource_or_scope)
scope = Devise::Mapping.find_scope!(resource_or_scope)
_stub_current_scope scope, nil
end

# taken from Devise's helper but uses the request method instead of @request
# and we don't really need the rest of their helper
def warden
@warden ||= begin
manager = Warden::Manager.new(nil) do |config|
config.merge! Devise.warden_config
private

def _stub_current_scope(scope, resource)
Draper::ViewContext.current.controller.singleton_class.class_eval do
define_method "current_#{scope}" do
resource
end
request.env['warden'] = Warden::Proxy.new(request.env, manager)
end
end
end
Expand Down
5 changes: 5 additions & 0 deletions spec/dummy/app/models/admin.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
if defined?(Devise)
class Admin
extend Devise::Models
end
end
5 changes: 5 additions & 0 deletions spec/dummy/app/models/user.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
if defined?(Devise)
class User
extend Devise::Models
end
end
8 changes: 7 additions & 1 deletion spec/dummy/config/application.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
require File.expand_path('../boot', __FILE__)

def attempt_require(file)
require file
rescue LoadError
end

require 'rails/all'
require 'draper'
require 'mongoid' if Rails.version.to_f >= 3.1
attempt_require 'mongoid'
attempt_require 'devise'

module Dummy
class Application < Rails::Application
Expand Down
2 changes: 2 additions & 0 deletions spec/dummy/config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@
get "mail", on: :member
end
end

devise_for :users, :admins if defined?(Devise)
end
64 changes: 64 additions & 0 deletions spec/dummy/spec/decorators/devise_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
require 'spec_helper'

if defined?(Devise)
describe "A decorator spec" do
it "can sign in a real user" do
user = User.new
sign_in user

expect(helper.current_user).to be user
end

it "can sign in a mock user" do
user = double("User")
sign_in :user, user

expect(helper.current_user).to be user
end

it "can sign in a real admin" do
admin = Admin.new
sign_in admin

expect(helper.current_admin).to be admin
end

it "can sign in a mock admin" do
admin = double("Admin")
sign_in :admin, admin

expect(helper.current_admin).to be admin
end

it "can sign out a real user" do
user = User.new
sign_in user
sign_out user

expect(helper.current_user).to be_nil
end

it "can sign out a mock user" do
user = double("User")
sign_in :user, user
sign_out :user

expect(helper.current_user).to be_nil
end

it "can sign out without a user" do
sign_out :user

expect(helper.current_user).to be_nil
end

it "is backwards-compatible" do
user = double("User")
ActiveSupport::Deprecation.silence do
sign_in user
end

expect(helper.current_user).to be user
end
end
end
64 changes: 64 additions & 0 deletions spec/dummy/test/decorators/minitest/devise_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
require 'minitest_helper'

if defined?(Devise)
describe "A decorator test" do
it "can sign in a real user" do
user = User.new
sign_in user

assert_same user, helper.current_user
end

it "can sign in a mock user" do
user = Object.new
sign_in :user, user

assert_same user, helper.current_user
end

it "can sign in a real admin" do
admin = Admin.new
sign_in admin

assert_same admin, helper.current_admin
end

it "can sign in a mock admin" do
admin = Object.new
sign_in :admin, admin

assert_same admin, helper.current_admin
end

it "can sign out a real user" do
user = User.new
sign_in user
sign_out user

assert helper.current_user.nil?
end

it "can sign out a mock user" do
user = Object.new
sign_in :user, user
sign_out :user

assert helper.current_user.nil?
end

it "can sign out without a user" do
sign_out :user

assert helper.current_user.nil?
end

it "is backwards-compatible" do
user = Object.new
ActiveSupport::Deprecation.silence do
sign_in user
end

assert_same user, helper.current_user
end
end
end
64 changes: 64 additions & 0 deletions spec/dummy/test/decorators/test_unit/devise_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
require 'test_helper'

if defined?(Devise)
class DeviseTest < Draper::TestCase
def test_sign_in_a_real_user
user = User.new
sign_in user

assert_same user, helper.current_user
end

def test_sign_in_a_mock_user
user = Object.new
sign_in :user, user

assert_same user, helper.current_user
end

def test_sign_in_a_real_admin
admin = Admin.new
sign_in admin

assert_same admin, helper.current_admin
end

def test_sign_in_a_mock_admin
admin = Object.new
sign_in :admin, admin

assert_same admin, helper.current_admin
end

def test_sign_out_a_real_user
user = User.new
sign_in user
sign_out user

assert helper.current_user.nil?
end

def test_sign_out_a_mock_user
user = Object.new
sign_in :user, user
sign_out :user

assert helper.current_user.nil?
end

def test_sign_out_without_a_user
sign_out :user

assert helper.current_user.nil?
end

def test_backwards_compatibility
user = Object.new
ActiveSupport::Deprecation.silence do
sign_in user
end

assert_same user, helper.current_user
end
end
end

0 comments on commit b0902ab

Please sign in to comment.