Added User#unconfirmed_email and #confirm_email_token with specs

This commit is contained in:
Sebastian 2011-06-01 11:39:38 +02:00
parent cd404b9210
commit 5b408ecca3
5 changed files with 112 additions and 1 deletions

View file

@ -23,6 +23,7 @@ class User < ActiveRecord::Base
validates_format_of :username, :with => /\A[A-Za-z0-9_]+\z/
validates_length_of :username, :maximum => 32
validates_inclusion_of :language, :in => AVAILABLE_LANGUAGE_CODES
validates_format_of :unconfirmed_email, :with => Devise.email_regexp, :allow_blank => true
validates_presence_of :person, :unless => proc {|user| user.invitation_token.present?}
validates_associated :person
@ -43,6 +44,7 @@ class User < ActiveRecord::Base
before_save do
person.save if person && person.changed?
end
before_save :guard_unconfirmed_email
attr_accessible :getting_started, :password, :password_confirmation, :language, :disable_mail
@ -349,4 +351,12 @@ class User < ActiveRecord::Base
mentioned_person.delete
end
end
def guard_unconfirmed_email
self.unconfirmed_email = nil if unconfirmed_email.blank? || unconfirmed_email == email
if unconfirmed_email_changed?
self.confirm_email_token = unconfirmed_email ? ActiveSupport::SecureRandom.hex(15) : nil
end
end
end

View file

@ -0,0 +1,9 @@
class AddUnconfirmedEmailToUsers < ActiveRecord::Migration
def self.up
add_column :users, :unconfirmed_email, :string, :default => nil, :null => true
end
def self.down
remove_column :users, :unconfirmed_email
end
end

View file

@ -0,0 +1,9 @@
class AddConfirmEmailTokenToUsers < ActiveRecord::Migration
def self.up
add_column :users, :confirm_email_token, :string, :limit => 30
end
def self.down
remove_column :users, :confirm_email_token
end
end

View file

@ -10,7 +10,7 @@
#
# It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20110527135552) do
ActiveRecord::Schema.define(:version => 20110601091059) do
create_table "aspect_memberships", :force => true do |t|
t.integer "aspect_id", :null => false
@ -369,6 +369,8 @@ ActiveRecord::Schema.define(:version => 20110527135552) do
t.integer "invited_by_id"
t.string "invited_by_type"
t.string "authentication_token", :limit => 30
t.string "unconfirmed_email"
t.string "confirm_email_token", :limit => 30
end
add_index "users", ["authentication_token"], :name => "index_users_on_authentication_token", :unique => true

View file

@ -34,6 +34,7 @@ describe User do
new_user.id.should_not == alice.id
end
end
describe "validation" do
describe "of associated person" do
it "fails if person is not valid" do
@ -120,6 +121,26 @@ describe User do
end
end
describe "of unconfirmed_email" do
it "unconfirmed_email address can be nil/blank" do
alice.unconfirmed_email = nil
alice.should be_valid
alice.unconfirmed_email = ""
alice.should be_valid
end
it "does NOT require a unique unconfirmed_email address" do
eve.update_attribute :unconfirmed_email, "new@email.com"
alice.unconfirmed_email = "new@email.com"
alice.should be_valid
end
it "requires a vaild unconfirmed_email address" do
alice.unconfirmed_email = "somebody@anywhere"
alice.should_not be_valid
end
end
describe "of language" do
after do
I18n.locale = :en
@ -593,4 +614,64 @@ describe User do
end
end
end
context 'change email' do
let(:user){ alice }
describe "#unconfirmed_email" do
it "is nil by default" do
user.unconfirmed_email.should eql(nil)
end
it "forces blank to nil" do
user.unconfirmed_email = ""
user.save!
user.unconfirmed_email.should eql(nil)
end
it "is ignored if it equals email" do
user.unconfirmed_email = user.email
user.save!
user.unconfirmed_email.should eql(nil)
end
it "allows change to valid new email" do
user.unconfirmed_email = "alice@newmail.com"
user.save!
user.unconfirmed_email.should eql("alice@newmail.com")
end
end
describe "#confirm_email_token" do
it "is nil by default" do
user.confirm_email_token.should eql(nil)
end
it "is autofilled when unconfirmed_email is set to new email" do
user.unconfirmed_email = "alice@newmail.com"
user.save!
user.confirm_email_token.should_not be_blank
user.confirm_email_token.size.should eql(30)
end
it "is set back to nil when unconfirmed_email is empty" do
user.unconfirmed_email = "alice@newmail.com"
user.save!
user.confirm_email_token.should_not be_blank
user.unconfirmed_email = nil
user.save!
user.confirm_email_token.should eql(nil)
end
it "generates new token on every new unconfirmed_email" do
user.unconfirmed_email = "alice@newmail.com"
user.save!
first_token = user.confirm_email_token
user.unconfirmed_email = "alice@andanotherone.com"
user.save!
user.confirm_email_token.should_not eql(first_token)
user.confirm_email_token.size.should eql(30)
end
end
end
end