diff --git a/app/models/user.rb b/app/models/user.rb index 6c40003..557453d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -12,4 +12,12 @@ class User < ActiveRecord::Base attr_accessible :name, :email + + email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i + + validates :name, :presence => true, + :length => { :maximum => 50 } + validates :email, :presence => true, + :format => { :with => email_regex }, + :uniqueness => { :case_sensitive => false } end diff --git a/db/migrate/20100822012431_add_email_uniqueness_index.rb b/db/migrate/20100822012431_add_email_uniqueness_index.rb new file mode 100644 index 0000000..95c5122 --- /dev/null +++ b/db/migrate/20100822012431_add_email_uniqueness_index.rb @@ -0,0 +1,9 @@ +class AddEmailUniquenessIndex < ActiveRecord::Migration + def self.up + add_index :users, :email, :unique => true + end + + def self.down + remove_index :users, :email + end +end diff --git a/db/schema.rb b/db/schema.rb index aef486a..400d256 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20100821203213) do +ActiveRecord::Schema.define(:version => 20100822012431) do create_table "users", :force => true do |t| t.string "name" @@ -19,4 +19,6 @@ t.datetime "updated_at" end + add_index "users", ["email"], :name => "index_users_on_email", :unique => true + end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 44032b4..b08980c 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1,5 +1,57 @@ require 'spec_helper' describe User do - pending "add some examples to (or delete) #{__FILE__}" + + before(:each) do + @attr = { :name => "Example User", :email => "user@example.com" } + end + + it "should create a new instance given a valid attribute" do + User.create!(@attr) + end + + it "should require a name" do + no_name_user = User.new(@attr.merge(:name => "")) + no_name_user.should_not be_valid + end + + it "should require an email address" do + no_email_user = User.new(@attr.merge(:email => "")) + no_email_user.should_not be_valid + end + + it "should reject names that are too long" do + long_name = "a" * 51 + long_name_user = User.new(@attr.merge(:name => long_name)) + long_name_user.should_not be_valid + end + + it "should accept valid email addresses" do + addresses = %w[user@foo.com THE_USER@foo.bar.org first.last@foo.jp] + addresses.each do |address| + valid_email_user = User.new(@attr.merge(:email => address)) + valid_email_user.should be_valid + end + end + + it "should reject invalid email addresses" do + addresses = %w[user@foo,com user_at_foo.org example.user@foo.] + addresses.each do |address| + invalid_email_user = User.new(@attr.merge(:email => address)) + invalid_email_user.should_not be_valid + end + end + + it "should reject duplicate email addresses" do + User.create!(@attr) + user_with_duplicate_email = User.new(@attr) + user_with_duplicate_email.should_not be_valid + end + + it "should reject email addresses identical up to case" do + upcased_email = @attr[:email].upcase + User.create!(@attr.merge(:email => upcased_email)) + user_with_duplicate_email = User.new(@attr) + user_with_duplicate_email.should_not be_valid + end end