2010-03-26 10:27:19 +00:00
require 'test_helper'
2009-10-09 12:03:01 +00:00
2009-10-20 13:08:40 +00:00
class Configurable < User
2010-09-25 14:08:46 +00:00
devise :database_authenticatable , :encryptable , :confirmable , :rememberable , :timeoutable , :lockable ,
2011-12-11 19:18:02 +00:00
:stretches = > 15 , :pepper = > 'abcdef' , :allow_unconfirmed_access_for = > 5 . days ,
2010-01-13 18:51:20 +00:00
:remember_for = > 7 . days , :timeout_in = > 15 . minutes , :unlock_in = > 10 . days
2009-10-20 13:08:40 +00:00
end
2011-04-09 20:47:06 +00:00
class WithValidation < Admin
devise :database_authenticatable , :validatable , :password_length = > 2 .. 6
end
2011-06-22 00:45:07 +00:00
class UserWithValidation < User
validates_presence_of :username
end
2011-04-16 11:15:31 +00:00
class Several < Admin
devise :validatable
devise :lockable
end
2010-04-15 06:34:49 +00:00
class Inheritable < Admin
end
2009-10-10 00:11:58 +00:00
class ActiveRecordTest < ActiveSupport :: TestCase
2009-10-20 13:08:40 +00:00
def include_module? ( klass , mod )
klass . devise_modules . include? ( mod ) &&
klass . included_modules . include? ( Devise :: Models :: const_get ( mod . to_s . classify ) )
end
def assert_include_modules ( klass , * modules )
modules . each do | mod |
assert include_module? ( klass , mod )
end
2009-11-24 17:18:42 +00:00
( Devise :: ALL - modules ) . each do | mod |
2009-10-20 13:08:40 +00:00
assert_not include_module? ( klass , mod )
end
end
2010-04-15 06:34:49 +00:00
test 'can cherry pick modules' do
2011-12-11 18:53:07 +00:00
assert_include_modules Admin , :database_authenticatable , :registerable , :timeoutable , :recoverable , :lockable , :encryptable , :confirmable
2010-03-25 12:29:09 +00:00
end
2011-08-06 12:28:19 +00:00
test 'validations options are not applied too late' do
validators = WithValidation . validators_on :password
length = validators . find { | v | v . kind == :length }
assert_equal 2 , length . options [ :minimum ]
assert_equal 6 , length . options [ :maximum ]
end
2011-04-16 11:15:31 +00:00
2011-08-06 12:28:19 +00:00
test 'validations are applied just once' do
validators = Several . validators_on :password
assert_equal 1 , validators . select { | v | v . kind == :length } . length
2011-04-09 20:47:06 +00:00
end
2010-04-15 06:34:49 +00:00
test 'chosen modules are inheritable' do
2011-12-11 18:53:07 +00:00
assert_include_modules Inheritable , :database_authenticatable , :registerable , :timeoutable , :recoverable , :lockable , :encryptable , :confirmable
2010-04-15 06:34:49 +00:00
end
2010-03-25 12:29:09 +00:00
test 'order of module inclusion' do
2011-12-11 18:53:07 +00:00
correct_module_order = [ :database_authenticatable , :encryptable , :recoverable , :registerable , :confirmable , :lockable , :timeoutable ]
incorrect_module_order = [ :database_authenticatable , :timeoutable , :registerable , :recoverable , :lockable , :encryptable , :confirmable ]
2010-03-25 12:29:09 +00:00
assert_include_modules Admin , * incorrect_module_order
# get module constants from symbol list
module_constants = correct_module_order . collect { | mod | Devise :: Models :: const_get ( mod . to_s . classify ) }
# confirm that they adhere to the order in ALL
# get included modules, filter out the noise, and reverse the order
assert_equal module_constants , ( Admin . included_modules & module_constants ) . reverse
2009-10-09 12:03:01 +00:00
end
2011-01-14 21:38:35 +00:00
test 'raise error on invalid module' do
assert_raise NameError do
2011-01-14 23:10:46 +00:00
# Mix valid an invalid modules.
Configurable . class_eval { devise :database_authenticatable , :doesnotexit }
2011-01-14 21:38:35 +00:00
end
end
2009-10-20 13:08:40 +00:00
test 'set a default value for stretches' do
2009-11-23 00:32:54 +00:00
assert_equal 15 , Configurable . stretches
2009-10-09 12:03:01 +00:00
end
2009-10-20 13:08:40 +00:00
test 'set a default value for pepper' do
2009-11-23 00:32:54 +00:00
assert_equal 'abcdef' , Configurable . pepper
2009-10-22 11:49:19 +00:00
end
2011-12-11 19:18:02 +00:00
test 'set a default value for allow_unconfirmed_access_for' do
assert_equal 5 . days , Configurable . allow_unconfirmed_access_for
2009-10-22 11:49:19 +00:00
end
test 'set a default value for remember_for' do
2009-11-23 00:32:54 +00:00
assert_equal 7 . days , Configurable . remember_for
2009-10-09 12:03:01 +00:00
end
2009-10-22 21:26:10 +00:00
2009-11-25 02:11:49 +00:00
test 'set a default value for timeout_in' do
assert_equal 15 . minutes , Configurable . timeout_in
2009-11-23 00:19:29 +00:00
end
2010-01-13 18:51:20 +00:00
test 'set a default value for unlock_in' do
assert_equal 10 . days , Configurable . unlock_in
end
2009-10-22 21:26:10 +00:00
test 'set null fields on migrations' do
Admin . create!
end
2009-10-09 12:03:01 +00:00
end
2012-02-17 16:37:44 +00:00
class CheckFieldsTest < ActiveSupport :: TestCase
test 'checks if the class respond_to the required fields' do
Player = Class . new do
extend Devise :: Models
2012-02-19 00:50:59 +00:00
def self . before_validation ( instance )
2012-02-17 16:37:44 +00:00
end
devise :database_authenticatable
attr_accessor :encrypted_password , :email
end
assert_nothing_raised Devise :: Models :: MissingAttribute do
Devise :: Models . check_fields! ( Player )
end
end
2012-02-21 12:31:38 +00:00
test 'raises Devise::Models::MissingAtrribute and shows the missing attribute if the class doesn\'t respond_to one of the attributes' do
2012-02-17 16:37:44 +00:00
Clown = Class . new do
extend Devise :: Models
def self . before_validation ( instance )
end
devise :database_authenticatable
attr_accessor :encrypted_password
end
2012-02-22 15:48:41 +00:00
assert_raise_with_message Devise :: Models :: MissingAttribute , " The following attribute(s) is (are) missing on your model: email " do
2012-02-17 16:37:44 +00:00
Devise :: Models . check_fields! ( Clown )
end
end
2012-02-21 12:31:38 +00:00
test 'raises Devise::Models::MissingAtrribute with all the missing attributes if there is more than one' do
Magician = Class . new do
extend Devise :: Models
def self . before_validation ( instance )
end
devise :database_authenticatable
end
2012-02-22 15:48:41 +00:00
exception = assert_raise_with_message Devise :: Models :: MissingAttribute , " The following attribute(s) is (are) missing on your model: encrypted_password, email " do
2012-02-21 12:31:38 +00:00
Devise :: Models . check_fields! ( Magician )
end
end
end