From 5e33de7e5605555435ff130bec3eacb0b03770af Mon Sep 17 00:00:00 2001 From: ilya Date: Fri, 13 Aug 2010 09:47:08 -0700 Subject: [PATCH] unfriended method in the user --- app/models/person.rb | 7 ++-- app/models/user.rb | 17 ++++++--- spec/helpers/application_helper_spec.rb | 6 ++++ spec/models/user_spec.rb | 46 ++++++++++++++++++++++--- 4 files changed, 66 insertions(+), 10 deletions(-) diff --git a/app/models/person.rb b/app/models/person.rb index ace5c8e87..d703c0479 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -15,7 +15,7 @@ class Person key :owner_id, ObjectId - key :user_refs, Integer, :default => 0 + key :user_refs, Integer, :default => 0 belongs_to :owner, :class_name => 'User' one :profile, :class_name => 'Profile' @@ -27,7 +27,7 @@ class Person timestamps! before_validation :clean_url - + before_create :check_for_owner validates_presence_of :email, :url, :profile, :serialized_key validates_format_of :url, :with => /^(https?):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(\.[a-z]{2,5})?(:[0-9]{1,5})?(\/.*)?$/ix @@ -124,6 +124,9 @@ class Person private + def check_for_owner + self.user_refs += 1 unless self.owner_id.nil? + end def remove_all_traces self.posts.delete_all end diff --git a/app/models/user.rb b/app/models/user.rb index 9fef4edfb..5f341e9da 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -82,7 +82,6 @@ class User Rails.logger.debug("#{self.real_name}'s friend request has been accepted") friend_request.destroy else - friend_request.person.user_refs += 1 friend_request.person.save pending_requests << friend_request @@ -94,15 +93,25 @@ class User def unfriend(friend_id) bad_friend = Person.first(:_id => friend_id) - self.friend_ids.delete( friend_id ) - self.save if bad_friend Retraction.for(self).push_to_url(bad_friend.receive_url) - bad_friend.update_attributes(:user_refs => bad_friend.user_refs - 1) + bad_friend.user_refs -= 1 + (bad_friend.user_refs > 0 || bad_friend.owner.nil? == false) ? bad_friend.save : bad_friend.destroy end + self.save + end + + def unfriended_by friend_id + bad_friend = Person.first(:_id => friend_id) + + self.friend_ids.delete( friend_id ) + bad_friend.user_refs -= 1 + + (bad_friend.user_refs > 0 || bad_friend.owner.nil? == false) ? bad_friend.save : bad_friend.destroy + self.save end def send_request(rel_hash) diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index d03987740..639eb254a 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -15,4 +15,10 @@ describe ApplicationHelper do it "should provide a correct show path for a given user" do person_url(@user).should == "/users/#{@user.id}" end + + it 'should be able to give me the terse url for webfinger' do + @user.person.url = "http://example.com/" + + terse_url( @user.person.url ).should == 'example.com' + end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 62cb7dad1..e6b22016e 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -53,11 +53,7 @@ describe User do @user.send_friend_request_to( friend.receive_url ).should be nil end - it 'should be able to give me the terse url for webfinger' do - @user.person.url = "http://example.com/" - @user.terse_url.should == 'example.com' - end describe 'multiple users accepting/rejecting the same person' do before do @@ -232,4 +228,46 @@ describe User do StatusMessage.all.size.should == 1 end end + + describe 'unfriending' do + before do + @user = Factory.create :user + @user2 = Factory.create :user + + @user.friends << @user2.person + @user.person.user_refs += 1 + @user2.friends << @user.person + + @user2.person.user_refs += 1 + + @user2.person.save + @user.person.save + end + + it 'should unfriend the other user on the same seed' do + person = @user2.person + person.url = @user.person.url + person.save + + @user.friends.count.should == 1 + @user2.friends.count.should == 1 + + @user.person.user_refs.should == 2 + + @user2.person.user_refs.should == 2 + + @user2.unfriend @user.person.id + @user2.friends.count.should be 0 + + @user.person.reload + @user.person.user_refs.should == 1 + + @user.unfriended_by @user2.person.id + + @user2.person.reload + @user2.person.user_refs.should == 1 + end + + + end end