From 83b23a0ffe8a380b4c085c8f450d25b72865ad8c Mon Sep 17 00:00:00 2001
From: Sarah Mei <sarahmei@gmail.com>
Date: Sat, 16 Oct 2010 22:36:26 -0700
Subject: [PATCH] Error message for duplicate username; refactor User
 validation specs.

---
 config/locales/diaspora/en.yml |  7 +++
 spec/factories.rb              |  2 +-
 spec/models/user_spec.rb       | 87 ++++++++++++++++++----------------
 3 files changed, 55 insertions(+), 41 deletions(-)

diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml
index 9d438feec6..78cb658825 100644
--- a/config/locales/diaspora/en.yml
+++ b/config/locales/diaspora/en.yml
@@ -6,6 +6,13 @@
 # See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
 
 en:
+  activemodel:
+      errors:
+          models:
+              user:
+                  attributes:
+                      username:
+                          taken: "is already taken."
   hello: "Hello world"
   application:
       helper:
diff --git a/spec/factories.rb b/spec/factories.rb
index 5e5c32b106..c66fa4f869 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -32,7 +32,7 @@ Factory.define :user do |u|
   u.password_confirmation "bluepin7"
   u.serialized_private_key  OpenSSL::PKey::RSA.generate(1024).export
   u.after_build do |user|
-    user.person = Factory(:person, :owner_id => user._id,
+    user.person = Factory.build(:person, :owner_id => user._id,
                           :serialized_public_key => user.encryption_key.public_key.export,
                           :diaspora_handle => "#{user.username}@#{APP_CONFIG[:pod_url].gsub(/(https?:|www\.)\/\//, '').chop!}")
   end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 4f8b836b2a..561da20768 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -5,40 +5,47 @@
 require 'spec_helper'
 
 describe User do
-  let(:user)   { Factory(:user) }
+  let(:user) { Factory(:user) }
   let(:aspect) { user.aspect(:name => 'heroes') }
-  let(:user2)   { Factory(:user) }
+  let(:user2) { Factory(:user) }
   let(:aspect2) { user2.aspect(:name => 'stuff') }
-  let(:user3)   { Factory(:user) }
+  let(:user3) { Factory(:user) }
   let(:aspect3) { user3.aspect(:name => 'stuff') }
 
-  describe "validations" do
-    it "requires a username" do
-      user = Factory.build(:user, :username => nil)
-      user.should_not be_valid
-    end
-    it "downcases the username" do
-      user = Factory.build(:user, :username => "ALLUPPERCASE")
-      user.valid?
-      user.username.should == "alluppercase"
-
-      user = Factory.build(:user, :username => "someUPPERCASE")
-      user.valid?
-      user.username.should == "someuppercase"
+  describe "validation" do
+
+    describe "of passwords" do
+      it "fails if password doesn't match confirmation" do
+        user = Factory.build(:user, :password => "password", :password_confirmation => "nope")
+        user.should_not be_valid
+      end
+
+      it "succeeds if password matches confirmation" do
+        user = Factory.build(:user, :password => "password", :password_confirmation => "password")
+        user.should be_valid
+      end
     end
 
-    it "confirms the password" do
-      pending "I cannot figure out why this doesn't work. --Raphael"
-      user = User.instantiate!( 
-        :email => "tom@tom.joindiaspora.com",
-        :username => "tom",
-        :password => "evankorth",
-        :password_confirmation => "potatoes",
-        :person => Person.new(
-          :profile => Profile.new( :first_name => "Alexander", :last_name => "Hamiltom" ))
-                  )
-      user.created_at.should be_nil
-      user.valid?.should be_false
+    describe "of username" do
+      it "requires a username" do
+        user = Factory.build(:user, :username => nil)
+        user.should_not be_valid
+      end
+
+      it "requires a unique username" do
+        duplicate_user = Factory.build(:user, :username => user.username)
+        duplicate_user.should_not be_valid
+      end
+
+      it "downcases the username" do
+        user = Factory.build(:user, :username => "ALLUPPERCASE")
+        user.valid?
+        user.username.should == "alluppercase"
+
+        user = Factory.build(:user, :username => "someUPPERCASE")
+        user.valid?
+        user.username.should == "someuppercase"
+      end
     end
   end
 
@@ -50,10 +57,10 @@ describe User do
 
   context 'profiles' do
     it 'should be able to update their profile and send it to their friends' do
-      updated_profile = { :profile => {
-                            :first_name => 'bob',
-                            :last_name => 'billytown',
-                            :image_url => "http://clown.com"} }
+      updated_profile = {:profile => {
+        :first_name => 'bob',
+        :last_name => 'billytown',
+        :image_url => "http://clown.com"}}
 
       user.update_profile(updated_profile).should be true
       user.profile.image_url.should == "http://clown.com"
@@ -70,7 +77,7 @@ describe User do
     it 'should not delete an aspect with friends' do
       friend_users(user, aspect, user2, aspect2)
       aspect.reload
-      proc{user.drop_aspect(aspect)}.should raise_error /Aspect not empty/
+      proc { user.drop_aspect(aspect) }.should raise_error /Aspect not empty/
       user.aspects.include?(aspect).should == true
     end
   end
@@ -80,27 +87,27 @@ describe User do
       friend_users(user, aspect, user2, aspect2)
       friend_users(user, aspect, user3, aspect3)
     end
-    
+
     it 'should unfriend everyone' do
       user.should_receive(:unfriend_everyone)
       user.destroy
     end
-    
+
     it 'should remove person' do
       user.should_receive(:remove_person)
       user.destroy
     end
 
-    
+
     it 'should remove all aspects' do
       pending "this should use :dependant => :destroy on the many assoc...but that screws this test suite..."
       aspects = user.aspects
       user.destroy
-      proc{ aspects.reload }.should raise_error /does not exist/
+      proc { aspects.reload }.should raise_error /does not exist/
 
     end
 
-   
+
     describe '#remove_person' do
       it 'should remove the person object' do
         person = user.person
@@ -113,7 +120,7 @@ describe User do
         message = user.post(:status_message, :message => "hi", :to => aspect.id)
         user.reload
         user.destroy
-        proc{ message.reload }.should raise_error /does not exist/
+        proc { message.reload }.should raise_error /does not exist/
       end
     end
 
@@ -128,7 +135,7 @@ describe User do
         user.destroy
       end
 
-      it 'should unfriend local people' do 
+      it 'should unfriend local people' do
         user2.friends.count.should be 1
         user.destroy
         user2.reload
-- 
GitLab