Selectively add reconfirmable field in tests when necessary.

This commit is contained in:
Brian Rose 2011-08-12 12:13:31 -06:00
parent a7c5a2e65d
commit a1407565c8
6 changed files with 40 additions and 4 deletions

View File

@ -63,8 +63,12 @@ module Devise
unless_confirmed do
self.confirmation_token = nil
self.confirmed_at = Time.now
self.email = unconfirmed_email if unconfirmed_email.present?
self.unconfirmed_email = nil
if Devise.reconfirmable
self.email = unconfirmed_email if unconfirmed_email.present?
self.unconfirmed_email = nil
end
save
end
end
@ -146,7 +150,7 @@ module Devise
# Checks whether the record is confirmed or not or a new email has been added, yielding to the block
# if it's already confirmed, otherwise adds an error to email.
def unless_confirmed
unless confirmed? && unconfirmed_email.blank?
unless confirmed? && (Devise.reconfirmable ? unconfirmed_email.blank? : true)
yield
else
self.errors.add(:email, :already_confirmed)

View File

@ -38,6 +38,10 @@ module Devise
apply_devise_schema :confirmation_token, String
apply_devise_schema :confirmed_at, DateTime
apply_devise_schema :confirmation_sent_at, DateTime
end
# Creates unconfirmed_email
def reconfirmable
apply_devise_schema :unconfirmed_email, String
end

View File

@ -186,10 +186,12 @@ class ConfirmationOnChangeTest < ConfirmationTest
end
def setup
add_unconfirmed_email_column
Devise.reconfirmable = true
end
def teardown
remove_unconfirmed_email_column
Devise.reconfirmable = false
end

View File

@ -237,12 +237,14 @@ class ConfirmableTest < ActiveSupport::TestCase
end
end
class ConfirmableOnChangeTest < ConfirmableTest
class ReconfirmableTest < ConfirmableTest
def setup
add_unconfirmed_email_column
Devise.reconfirmable = true
end
def teardown
remove_unconfirmed_email_column
Devise.reconfirmable = false
end

View File

@ -106,6 +106,8 @@ class ValidatableTest < ActiveSupport::TestCase
end
test 'should check if email is unique in unconfirmed_email column' do
add_unconfirmed_email_column
swap Devise, :reconfirmable => [:username, :email] do
user = create_user
user.update_attributes({:email => 'new_test@email.com'})
@ -115,6 +117,8 @@ class ValidatableTest < ActiveSupport::TestCase
user = new_user(:email => 'new_test@email.com')
assert user.invalid?
end
remove_unconfirmed_email_column
end
test 'shuold not be included in objects with invalid API' do

View File

@ -57,4 +57,24 @@ class ActiveSupport::TestCase
object.send :"#{key}=", value
end
end
def add_unconfirmed_email_column
if DEVISE_ORM == :active_record
ActiveRecord::Base.connection.add_column(:users, :unconfirmed_email, :string)
User.reset_column_information
elsif DEVISE_ORM == :mongoid
User.field(:unconfirmed_email, :type => String)
end
end
def remove_unconfirmed_email_column
if DEVISE_ORM == :active_record
ActiveRecord::Base.connection.remove_column(:users, :unconfirmed_email)
User.reset_column_information
elsif DEVISE_ORM == :mongoid
User.fields.delete(:unconfirmed_email)
User.send(:undefine_attribute_methods)
User.send(:define_attribute_methods, User.fields.keys)
end
end
end