amistad 0.5.8 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +9 -0
- data/README.markdown +11 -7
- data/amistad.gemspec +4 -4
- data/lib/amistad.rb +0 -3
- data/lib/amistad/friend_model.rb +57 -40
- data/lib/amistad/friendship_model.rb +26 -7
- data/lib/amistad/version.rb +1 -1
- data/lib/generators/amistad/install/templates/create_friendships.rb +1 -1
- data/spec/friend_model_spec.rb +313 -190
- data/spec/friendship_model_spec.rb +113 -17
- data/spec/spec_helper.rb +3 -1
- metadata +12 -13
- data/.rspec +0 -4
data/CHANGELOG
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
Version 0.6.0 (06.01.2011)
|
2
|
+
--------------------------
|
3
|
+
- improved blocking and unblocking friends
|
4
|
+
- method is_friend_with? changed to friend_with?
|
5
|
+
- method is_connected_with? changed to connected_with?
|
6
|
+
- method was_invited_by? changed to invited_by?
|
7
|
+
- method has_invited? changed to invited?
|
8
|
+
- added method blocked?
|
9
|
+
|
1
10
|
Version 0.5.8 (08.12.2010)
|
2
11
|
--------------------------
|
3
12
|
- made find_any_friendship_with public
|
data/README.markdown
CHANGED
@@ -82,22 +82,22 @@ To get the pending friendships use :
|
|
82
82
|
|
83
83
|
It is also possible to check if two users are friends :
|
84
84
|
|
85
|
-
@john.
|
86
|
-
@victoria.
|
85
|
+
@john.friend_with? @jane #=> true
|
86
|
+
@victoria.friend_with? @john #=> false
|
87
87
|
|
88
88
|
You can also check if a user is somehow connected to another :
|
89
89
|
|
90
|
-
@john.
|
91
|
-
@victoria.
|
90
|
+
@john.connected_with? @jane #=> true
|
91
|
+
@victoria.connected_with? @john #=> true
|
92
92
|
|
93
93
|
You can also check if a user was invited by anoter :
|
94
94
|
|
95
|
-
@john.
|
96
|
-
@victoria.
|
95
|
+
@john.invited_by? @john #=> true
|
96
|
+
@victoria.invited_by? @john #=> false
|
97
97
|
|
98
98
|
You can also check if a user invited another :
|
99
99
|
|
100
|
-
@john.
|
100
|
+
@john.invited? @jane #=> true
|
101
101
|
|
102
102
|
You can also find the friends that two users have in common :
|
103
103
|
|
@@ -122,6 +122,10 @@ To get the blocked users :
|
|
122
122
|
|
123
123
|
@jane.blocked #=> [@john]
|
124
124
|
|
125
|
+
You can also check if a user is blocked :
|
126
|
+
|
127
|
+
@jane.blocked? @john #=> true
|
128
|
+
|
125
129
|
### Unblocking friendship ###
|
126
130
|
|
127
131
|
The __unblock()__ method allow a user to unblock previously blocked friendship with another user :
|
data/amistad.gemspec
CHANGED
@@ -14,10 +14,10 @@ Gem::Specification.new do |s|
|
|
14
14
|
|
15
15
|
s.rubyforge_project = "amistad"
|
16
16
|
|
17
|
-
s.add_development_dependency "bundler", "
|
18
|
-
s.add_development_dependency "rspec", "~> 2.
|
19
|
-
s.add_development_dependency "activerecord", "~> 3.0.
|
20
|
-
s.add_development_dependency "sqlite3-ruby", "
|
17
|
+
s.add_development_dependency "bundler", "~>1.0.7"
|
18
|
+
s.add_development_dependency "rspec", "~> 2.4.0"
|
19
|
+
s.add_development_dependency "activerecord", "~> 3.0.3"
|
20
|
+
s.add_development_dependency "sqlite3-ruby", "1.3.2"
|
21
21
|
|
22
22
|
s.files = `git ls-files`.split("\n")
|
23
23
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/lib/amistad.rb
CHANGED
data/lib/amistad/friend_model.rb
CHANGED
@@ -3,35 +3,42 @@ module Amistad
|
|
3
3
|
def self.included(receiver)
|
4
4
|
receiver.class_exec do
|
5
5
|
include InstanceMethods
|
6
|
-
|
6
|
+
|
7
7
|
has_many :friendships
|
8
|
-
|
8
|
+
|
9
9
|
has_many :pending_invited,
|
10
10
|
:through => :friendships,
|
11
11
|
:source => :friend,
|
12
|
-
:conditions => { :'friendships.pending' => true, :'friendships.
|
13
|
-
|
12
|
+
:conditions => { :'friendships.pending' => true, :'friendships.blocker_id' => nil }
|
13
|
+
|
14
14
|
has_many :invited,
|
15
15
|
:through => :friendships,
|
16
16
|
:source => :friend,
|
17
|
-
:conditions => { :'friendships.pending' => false, :'friendships.
|
17
|
+
:conditions => { :'friendships.pending' => false, :'friendships.blocker_id' => nil }
|
18
18
|
|
19
19
|
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
|
20
|
-
|
20
|
+
|
21
21
|
has_many :pending_invited_by,
|
22
22
|
:through => :inverse_friendships,
|
23
23
|
:source => :user,
|
24
|
-
:conditions => { :'friendships.pending' => true, :'friendships.
|
25
|
-
|
24
|
+
:conditions => { :'friendships.pending' => true, :'friendships.blocker_id' => nil }
|
25
|
+
|
26
26
|
has_many :invited_by,
|
27
27
|
:through => :inverse_friendships,
|
28
28
|
:source => :user,
|
29
|
-
:conditions => { :'friendships.pending' => false, :'friendships.
|
30
|
-
|
31
|
-
has_many :
|
32
|
-
|
29
|
+
:conditions => { :'friendships.pending' => false, :'friendships.blocker_id' => nil }
|
30
|
+
|
31
|
+
has_many :blocked_friendships, :class_name => "Friendship", :foreign_key => "blocker_id"
|
32
|
+
|
33
|
+
has_many :blockades,
|
34
|
+
:through => :blocked_friendships,
|
35
|
+
:source => :friend,
|
36
|
+
:conditions => "friend_id <> blocker_id"
|
37
|
+
|
38
|
+
has_many :blockades_by,
|
39
|
+
:through => :blocked_friendships,
|
33
40
|
:source => :user,
|
34
|
-
:conditions =>
|
41
|
+
:conditions => "user_id <> blocker_id"
|
35
42
|
end
|
36
43
|
end
|
37
44
|
|
@@ -41,70 +48,80 @@ module Amistad
|
|
41
48
|
return false if user == self || find_any_friendship_with(user)
|
42
49
|
Friendship.new(:user_id => self.id, :friend_id => user.id).save
|
43
50
|
end
|
44
|
-
|
51
|
+
|
45
52
|
# approve a friendship invitation. If the operation succeeds, the method returns true, else false
|
46
53
|
def approve(user)
|
47
54
|
friendship = find_any_friendship_with(user)
|
48
|
-
return false if friendship.nil? ||
|
55
|
+
return false if friendship.nil? || invited?(user)
|
49
56
|
friendship.update_attribute(:pending, false)
|
50
57
|
end
|
51
|
-
|
58
|
+
|
59
|
+
# deletes a friendship
|
60
|
+
def remove(user)
|
61
|
+
friendship = find_any_friendship_with(user)
|
62
|
+
return false if friendship.nil?
|
63
|
+
friendship.destroy && friendship.destroyed?
|
64
|
+
end
|
65
|
+
|
52
66
|
# returns the list of approved friends
|
53
67
|
def friends
|
54
68
|
self.invited(true) + self.invited_by(true)
|
55
69
|
end
|
56
|
-
|
57
|
-
# blocks a friendship
|
70
|
+
|
71
|
+
# blocks a friendship
|
58
72
|
def block(user)
|
59
73
|
friendship = find_any_friendship_with(user)
|
60
|
-
return false if friendship.nil? || friendship.
|
61
|
-
friendship.
|
62
|
-
friendship.save
|
74
|
+
return false if friendship.nil? || !friendship.can_block?(self)
|
75
|
+
friendship.update_attribute(:blocker, self)
|
63
76
|
end
|
64
77
|
|
65
78
|
# unblocks a friendship
|
66
79
|
def unblock(user)
|
67
80
|
friendship = find_any_friendship_with(user)
|
68
|
-
return false if friendship.nil? || friendship.
|
69
|
-
friendship.
|
70
|
-
friendship.save
|
81
|
+
return false if friendship.nil? || !friendship.can_unblock?(self)
|
82
|
+
friendship.update_attribute(:blocker, nil)
|
71
83
|
end
|
72
|
-
|
73
|
-
#
|
74
|
-
def
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
84
|
+
|
85
|
+
# returns the list of blocked friends
|
86
|
+
def blocked
|
87
|
+
self.blockades(true) + self.blockades_by(true)
|
88
|
+
end
|
89
|
+
|
90
|
+
# checks if a user is blocked
|
91
|
+
def blocked?(user)
|
92
|
+
blocked.include?(user)
|
79
93
|
end
|
80
|
-
|
94
|
+
|
81
95
|
# checks if a user is a friend
|
82
|
-
def
|
96
|
+
def friend_with?(user)
|
83
97
|
friends.include?(user)
|
84
98
|
end
|
85
99
|
|
86
|
-
|
87
|
-
|
100
|
+
# checks if a current user is connected to given user
|
101
|
+
def connected_with?(user)
|
102
|
+
find_any_friendship_with(user).present?
|
88
103
|
end
|
89
104
|
|
90
|
-
# checks if a user
|
91
|
-
def
|
105
|
+
# checks if a current user received invitation from given user
|
106
|
+
def invited_by?(user)
|
92
107
|
friendship = find_any_friendship_with(user)
|
93
108
|
return false if friendship.nil?
|
94
109
|
friendship.user == user
|
95
110
|
end
|
96
111
|
|
97
|
-
|
112
|
+
# checks if a current user invited given user
|
113
|
+
def invited?(user)
|
98
114
|
friendship = find_any_friendship_with(user)
|
99
115
|
return false if friendship.nil?
|
100
116
|
friendship.friend == user
|
101
117
|
end
|
102
|
-
|
118
|
+
|
103
119
|
# return the list of the ones among its friends which are also friend with the given use
|
104
120
|
def common_friends_with(user)
|
105
121
|
self.friends & user.friends
|
106
122
|
end
|
107
|
-
|
123
|
+
|
124
|
+
# returns friendship with given user or nil
|
108
125
|
def find_any_friendship_with(user)
|
109
126
|
friendship = Friendship.where(:user_id => self.id, :friend_id => user.id).first
|
110
127
|
if friendship.nil?
|
@@ -1,29 +1,48 @@
|
|
1
1
|
module Amistad
|
2
2
|
module FriendshipModel
|
3
|
-
|
4
3
|
def self.included(receiver)
|
5
4
|
receiver.class_exec do
|
6
5
|
include InstanceMethods
|
7
|
-
|
6
|
+
|
8
7
|
belongs_to :user
|
9
8
|
belongs_to :friend, :class_name => "User", :foreign_key => "friend_id"
|
10
|
-
|
9
|
+
belongs_to :blocker, :class_name => "User", :foreign_key => "blocker_id"
|
10
|
+
|
11
11
|
validates_presence_of :user_id, :friend_id
|
12
12
|
validates_uniqueness_of :friend_id, :scope => :user_id
|
13
13
|
end
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
module InstanceMethods
|
17
|
+
# returns true if a friendship has been approved, else false
|
18
|
+
def approved?
|
19
|
+
!self.pending
|
20
|
+
end
|
21
|
+
|
17
22
|
# returns true if a friendship has not been approved, else false
|
18
23
|
def pending?
|
19
24
|
self.pending
|
20
25
|
end
|
21
|
-
|
26
|
+
|
22
27
|
# returns true if a friendship has been blocked, else false
|
23
28
|
def blocked?
|
24
|
-
self.
|
29
|
+
self.blocker_id.present?
|
30
|
+
end
|
31
|
+
|
32
|
+
# returns true if a friendship has not beed blocked, else false
|
33
|
+
def active?
|
34
|
+
self.blocker_id.nil?
|
35
|
+
end
|
36
|
+
|
37
|
+
# returns true if a friendship can be blocked by given user
|
38
|
+
def can_block?(user)
|
39
|
+
active? && (approved? || (pending? && self.friend == user))
|
40
|
+
end
|
41
|
+
|
42
|
+
# returns true if a friendship can be unblocked by given user
|
43
|
+
def can_unblock?(user)
|
44
|
+
blocked? && self.blocker == user
|
25
45
|
end
|
26
46
|
end
|
27
|
-
|
28
47
|
end
|
29
48
|
end
|
data/lib/amistad/version.rb
CHANGED
@@ -3,8 +3,8 @@ class CreateFriendships < ActiveRecord::Migration
|
|
3
3
|
create_table :friendships do |t|
|
4
4
|
t.integer :user_id
|
5
5
|
t.integer :friend_id
|
6
|
+
t.integer :blocker_id
|
6
7
|
t.boolean :pending, :default => true
|
7
|
-
t.boolean :blocked, :default => false
|
8
8
|
end
|
9
9
|
|
10
10
|
add_index :friendships, [:user_id, :friend_id], :unique => true
|
data/spec/friend_model_spec.rb
CHANGED
@@ -1,271 +1,394 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Amistad::FriendModel do
|
4
|
-
|
4
|
+
|
5
5
|
before(:all) do
|
6
|
-
%w(John Jane
|
7
|
-
|
6
|
+
%w(John Jane David James Peter Mary Victoria Elisabeth).each do |name|
|
7
|
+
instance_variable_set("@#{name.downcase}".to_sym, User.create(:name => name))
|
8
8
|
end
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
context "when creating friendships" do
|
12
|
-
before
|
12
|
+
before do
|
13
13
|
Friendship.delete_all
|
14
14
|
end
|
15
|
-
|
16
|
-
it "
|
17
|
-
@john.invite(@jane).should
|
18
|
-
@victoria.invite(@john).should
|
15
|
+
|
16
|
+
it "should invite other users to friends" do
|
17
|
+
@john.invite(@jane).should be_true
|
18
|
+
@victoria.invite(@john).should be_true
|
19
19
|
end
|
20
20
|
|
21
|
-
it "
|
22
|
-
@john.invite(@jane).should
|
23
|
-
@
|
21
|
+
it "should approve only friendships requested by other users" do
|
22
|
+
@john.invite(@jane).should be_true
|
23
|
+
@jane.approve(@john).should be_true
|
24
|
+
@victoria.invite(@john).should be_true
|
25
|
+
@john.approve(@victoria).should be_true
|
26
|
+
end
|
24
27
|
|
25
|
-
|
26
|
-
@john.
|
28
|
+
it "should not invite an already invited user" do
|
29
|
+
@john.invite(@jane).should be_true
|
30
|
+
@john.invite(@jane).should be_false
|
31
|
+
@jane.invite(@john).should be_false
|
27
32
|
end
|
28
33
|
|
29
|
-
it "
|
30
|
-
@john.invite(@jane).should
|
31
|
-
@
|
32
|
-
@jane.invite(@john).should
|
34
|
+
it "should not invite an already approved user" do
|
35
|
+
@john.invite(@jane).should be_true
|
36
|
+
@jane.approve(@john).should be_true
|
37
|
+
@jane.invite(@john).should be_false
|
38
|
+
@john.invite(@jane).should be_false
|
33
39
|
end
|
34
40
|
|
35
|
-
it "
|
36
|
-
@john.invite(@jane).should
|
37
|
-
@
|
41
|
+
it "should not invite an already blocked user" do
|
42
|
+
@john.invite(@jane).should be_true
|
43
|
+
@jane.block(@john).should be_true
|
44
|
+
@jane.invite(@john).should be_false
|
45
|
+
@john.invite(@jane).should be_false
|
46
|
+
end
|
38
47
|
|
39
|
-
|
40
|
-
@
|
48
|
+
it "should not approve a self requested friendship" do
|
49
|
+
@john.invite(@jane).should be_true
|
50
|
+
@john.approve(@jane).should be_false
|
51
|
+
@victoria.invite(@john).should be_true
|
52
|
+
@victoria.approve(@john).should be_false
|
41
53
|
end
|
42
54
|
|
43
|
-
it "
|
44
|
-
@john.invite(@john).should
|
55
|
+
it "should not create a friendship with himself" do
|
56
|
+
@john.invite(@john).should be_false
|
45
57
|
end
|
46
|
-
|
47
|
-
it "
|
48
|
-
@peter.approve(@john).should
|
58
|
+
|
59
|
+
it "should not approve a non-existent friendship" do
|
60
|
+
@peter.approve(@john).should be_false
|
49
61
|
end
|
50
62
|
end
|
51
|
-
|
63
|
+
|
52
64
|
context "when listing friendships" do
|
53
|
-
before
|
65
|
+
before do
|
54
66
|
Friendship.delete_all
|
67
|
+
@john.invite(@jane).should be_true
|
68
|
+
@peter.invite(@john).should be_true
|
69
|
+
@john.invite(@james).should be_true
|
70
|
+
@james.approve(@john).should be_true
|
71
|
+
@mary.invite(@john).should be_true
|
72
|
+
@john.approve(@mary).should be_true
|
73
|
+
end
|
55
74
|
|
56
|
-
|
57
|
-
@john.
|
58
|
-
|
59
|
-
@peter.invite(@john).should == true
|
60
|
-
@mary.invite(@john).should == true
|
61
|
-
|
62
|
-
@james.approve(@john).should == true
|
63
|
-
@john.approve(@mary).should == true
|
75
|
+
it "should list all the friends" do
|
76
|
+
@john.friends.should =~ [@mary, @james]
|
64
77
|
end
|
65
|
-
|
66
|
-
it "
|
67
|
-
@john.friends.
|
68
|
-
@john.friends.
|
69
|
-
@john.friends.
|
78
|
+
|
79
|
+
it "should not list non-friended users" do
|
80
|
+
@john.friends.should =~ [@mary, @james]
|
81
|
+
@john.friends.should_not include(@peter)
|
82
|
+
@john.friends.should_not include(@victoria)
|
70
83
|
end
|
71
|
-
|
72
|
-
it "
|
73
|
-
@john.invited_by.should
|
74
|
-
@john.invited_by.should_not include(@peter)
|
84
|
+
|
85
|
+
it "should list the friends who invited him" do
|
86
|
+
@john.invited_by.should == [@mary]
|
75
87
|
end
|
76
|
-
|
77
|
-
it "
|
78
|
-
@john.invited.should
|
79
|
-
@john.invited.should_not include(@jane)
|
88
|
+
|
89
|
+
it "should list the friends who were invited by him" do
|
90
|
+
@john.invited.should == [@james]
|
80
91
|
end
|
81
|
-
|
82
|
-
it "
|
83
|
-
@john.pending_invited_by.
|
84
|
-
@john.pending_invited_by.should include(@peter)
|
92
|
+
|
93
|
+
it "should list the pending friends who invited him" do
|
94
|
+
@john.pending_invited_by.should == [@peter]
|
85
95
|
end
|
86
96
|
|
87
|
-
it "
|
88
|
-
@john.pending_invited.
|
89
|
-
@john.pending_invited.should include(@jane)
|
97
|
+
it "should list the pending friends who were invited by him" do
|
98
|
+
@john.pending_invited.should == [@jane]
|
90
99
|
end
|
91
100
|
|
92
|
-
it "
|
93
|
-
@
|
94
|
-
|
101
|
+
it "should list the friends he has in common with another user" do
|
102
|
+
@james.common_friends_with(@mary).should == [@john]
|
103
|
+
end
|
95
104
|
|
96
|
-
|
97
|
-
@john.
|
105
|
+
it "should not list the friends he does not have in common" do
|
106
|
+
@john.common_friends_with(@mary).count.should == 0
|
107
|
+
@john.common_friends_with(@mary).should_not include(@james)
|
108
|
+
@john.common_friends_with(@peter).count.should == 0
|
109
|
+
@john.common_friends_with(@peter).should_not include(@jane)
|
98
110
|
end
|
99
111
|
|
100
|
-
it "
|
101
|
-
@john.
|
102
|
-
@
|
112
|
+
it "should check if a user is a friend" do
|
113
|
+
@john.friend_with?(@mary).should be_true
|
114
|
+
@mary.friend_with?(@john).should be_true
|
115
|
+
@john.friend_with?(@james).should be_true
|
116
|
+
@james.friend_with?(@john).should be_true
|
117
|
+
end
|
103
118
|
|
104
|
-
|
105
|
-
@
|
119
|
+
it "should check if a user is not a friend" do
|
120
|
+
@john.friend_with?(@jane).should be_false
|
121
|
+
@jane.friend_with?(@john).should be_false
|
122
|
+
@john.friend_with?(@peter).should be_false
|
123
|
+
@peter.friend_with?(@john).should be_false
|
124
|
+
end
|
106
125
|
|
107
|
-
|
108
|
-
@john.
|
126
|
+
it "should check if a user has any connections with another user" do
|
127
|
+
@john.connected_with?(@jane).should be_true
|
128
|
+
@jane.connected_with?(@john).should be_true
|
129
|
+
@john.connected_with?(@peter).should be_true
|
130
|
+
@peter.connected_with?(@john).should be_true
|
109
131
|
end
|
110
132
|
|
111
|
-
it "
|
112
|
-
@
|
113
|
-
@
|
114
|
-
|
115
|
-
@john.was_invited_by?(@jane).should == false
|
116
|
-
@victoria.was_invited_by?(@john).should == false
|
133
|
+
it "should check if a user does not have any connections with another user" do
|
134
|
+
@victoria.connected_with?(@john).should be_false
|
135
|
+
@john.connected_with?(@victoria).should be_false
|
117
136
|
end
|
118
137
|
|
119
|
-
it "
|
120
|
-
@
|
121
|
-
@
|
138
|
+
it "should check if a user was invited by another" do
|
139
|
+
@jane.invited_by?(@john).should be_true
|
140
|
+
@james.invited_by?(@john).should be_true
|
141
|
+
end
|
122
142
|
|
123
|
-
|
124
|
-
@
|
143
|
+
it "should check if a user was not invited by another" do
|
144
|
+
@john.invited_by?(@jane).should be_false
|
145
|
+
@victoria.invited_by?(@john).should be_false
|
146
|
+
end
|
125
147
|
|
126
|
-
|
127
|
-
@john.
|
148
|
+
it "should check if a user has invited another user" do
|
149
|
+
@john.invited?(@jane).should be_true
|
150
|
+
@john.invited?(@james).should be_true
|
128
151
|
end
|
129
152
|
|
130
|
-
it "
|
131
|
-
@
|
132
|
-
@james.
|
153
|
+
it "should check if a user did not invite another user" do
|
154
|
+
@jane.invited?(@john).should be_false
|
155
|
+
@james.invited?(@john).should be_false
|
156
|
+
@john.invited?(@victoria).should be_false
|
157
|
+
@victoria.invited?(@john).should be_false
|
133
158
|
end
|
134
159
|
end
|
135
|
-
|
160
|
+
|
136
161
|
context "when removing friendships" do
|
137
|
-
before
|
162
|
+
before do
|
138
163
|
Friendship.delete_all
|
164
|
+
@jane.invite(@james).should be_true
|
165
|
+
@james.approve(@jane).should be_true
|
166
|
+
@james.invite(@victoria).should be_true
|
167
|
+
@victoria.approve(@james).should be_true
|
168
|
+
@victoria.invite(@mary).should be_true
|
169
|
+
@mary.approve(@victoria).should be_true
|
170
|
+
@victoria.invite(@john).should be_true
|
171
|
+
@john.approve(@victoria).should be_true
|
172
|
+
@peter.invite(@victoria).should be_true
|
173
|
+
@victoria.invite(@elisabeth).should be_true
|
174
|
+
end
|
139
175
|
|
140
|
-
|
141
|
-
@victoria.
|
142
|
-
@victoria.
|
143
|
-
|
144
|
-
@
|
145
|
-
@
|
146
|
-
@
|
147
|
-
|
148
|
-
@
|
149
|
-
@john.approve(@victoria).should == true
|
150
|
-
@victoria.approve(@james).should == true
|
151
|
-
@victoria.approve(@jane).should == true
|
152
|
-
end
|
153
|
-
|
154
|
-
it "removes the friends invited by him" do
|
155
|
-
@victoria.remove(@mary).should == true
|
156
|
-
|
157
|
-
@victoria.invited.count.should == 1
|
158
|
-
@victoria.invited.should include(@john)
|
176
|
+
it "should remove the friends invited by him" do
|
177
|
+
@victoria.friends.size.should == 3
|
178
|
+
@victoria.friends.should include(@mary)
|
179
|
+
@victoria.invited.should include(@mary)
|
180
|
+
@mary.friends.size.should == 1
|
181
|
+
@mary.friends.should include(@victoria)
|
182
|
+
@mary.invited_by.should include(@victoria)
|
183
|
+
@victoria.remove(@mary).should be_true
|
184
|
+
@victoria.friends.size.should == 2
|
159
185
|
@victoria.friends.should_not include(@mary)
|
160
|
-
|
161
|
-
@mary.
|
186
|
+
@victoria.invited.should_not include(@mary)
|
187
|
+
@mary.friends.size.should == 0
|
162
188
|
@mary.friends.should_not include(@victoria)
|
189
|
+
@mary.invited_by.should_not include(@victoria)
|
163
190
|
end
|
164
|
-
|
165
|
-
it "
|
166
|
-
@victoria.
|
167
|
-
|
168
|
-
@victoria.invited_by.
|
169
|
-
@
|
191
|
+
|
192
|
+
it "should remove the friends who invited him" do
|
193
|
+
@victoria.friends.size.should == 3
|
194
|
+
@victoria.friends.should include(@james)
|
195
|
+
@victoria.invited_by.should include(@james)
|
196
|
+
@james.friends.size.should == 2
|
197
|
+
@james.friends.should include(@victoria)
|
198
|
+
@james.invited.should include(@victoria)
|
199
|
+
@victoria.remove(@james).should be_true
|
200
|
+
@victoria.friends.size.should == 2
|
170
201
|
@victoria.friends.should_not include(@james)
|
171
|
-
|
172
|
-
@james.
|
202
|
+
@victoria.invited_by.should_not include(@james)
|
203
|
+
@james.friends.size.should == 1
|
173
204
|
@james.friends.should_not include(@victoria)
|
205
|
+
@james.invited.should_not include(@victoria)
|
174
206
|
end
|
175
|
-
|
176
|
-
it "
|
177
|
-
@victoria.
|
178
|
-
@victoria.pending_invited.
|
207
|
+
|
208
|
+
it "should remove the pending friends invited by him" do
|
209
|
+
@victoria.pending_invited.size.should == 1
|
210
|
+
@victoria.pending_invited.should include(@elisabeth)
|
211
|
+
@elisabeth.pending_invited_by.size.should == 1
|
212
|
+
@elisabeth.pending_invited_by.should include(@victoria)
|
213
|
+
@victoria.remove(@elisabeth).should be_true
|
214
|
+
[@victoria, @elisabeth].map(&:reload)
|
215
|
+
@victoria.pending_invited.size.should == 0
|
216
|
+
@victoria.pending_invited.should_not include(@elisabeth)
|
217
|
+
@elisabeth.pending_invited_by.size.should == 0
|
179
218
|
@elisabeth.pending_invited_by.should_not include(@victoria)
|
180
219
|
end
|
181
|
-
|
182
|
-
it "
|
183
|
-
@victoria.
|
220
|
+
|
221
|
+
it "should remove the pending friends who invited him" do
|
222
|
+
@victoria.pending_invited_by.count.should == 1
|
223
|
+
@victoria.pending_invited_by.should include(@peter)
|
224
|
+
@peter.pending_invited.count.should == 1
|
225
|
+
@peter.pending_invited.should include(@victoria)
|
226
|
+
@victoria.remove(@peter).should be_true
|
227
|
+
[@victoria, @peter].map(&:reload)
|
184
228
|
@victoria.pending_invited_by.count.should == 0
|
229
|
+
@victoria.pending_invited_by.should_not include(@peter)
|
230
|
+
@peter.pending_invited.count.should == 0
|
185
231
|
@peter.pending_invited.should_not include(@victoria)
|
186
232
|
end
|
187
233
|
end
|
188
|
-
|
234
|
+
|
189
235
|
context "when blocking friendships" do
|
190
|
-
before
|
236
|
+
before do
|
191
237
|
Friendship.delete_all
|
238
|
+
@john.invite(@james).should be_true
|
239
|
+
@james.approve(@john).should be_true
|
240
|
+
@james.block(@john).should be_true
|
241
|
+
@mary.invite(@victoria).should be_true
|
242
|
+
@victoria.approve(@mary).should be_true
|
243
|
+
@victoria.block(@mary).should be_true
|
244
|
+
@victoria.invite(@david).should be_true
|
245
|
+
@david.block(@victoria).should be_true
|
246
|
+
@john.invite(@david).should be_true
|
247
|
+
@david.block(@john).should be_true
|
248
|
+
@peter.invite(@elisabeth).should be_true
|
249
|
+
@elisabeth.block(@peter).should be_true
|
250
|
+
@jane.invite(@john).should be_true
|
251
|
+
@jane.invite(@james).should be_true
|
252
|
+
@james.approve(@jane).should be_true
|
253
|
+
@victoria.invite(@jane).should be_true
|
254
|
+
@victoria.invite(@james).should be_true
|
255
|
+
@james.approve(@victoria).should be_true
|
256
|
+
end
|
192
257
|
|
193
|
-
|
194
|
-
@john.
|
195
|
-
@
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
@john.
|
215
|
-
|
216
|
-
@
|
217
|
-
@
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
@
|
222
|
-
@
|
223
|
-
|
224
|
-
@
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
258
|
+
it "should allow to block author of the invitation by invited user" do
|
259
|
+
@john.block(@jane).should be_true
|
260
|
+
@jane.block(@victoria).should be_true
|
261
|
+
end
|
262
|
+
|
263
|
+
it "should not allow to block invited user by invitation author" do
|
264
|
+
@jane.block(@john).should be_false
|
265
|
+
@victoria.block(@jane).should be_false
|
266
|
+
end
|
267
|
+
|
268
|
+
it "should allow to block approved users on both sides" do
|
269
|
+
@james.block(@jane).should be_true
|
270
|
+
@victoria.block(@james).should be_true
|
271
|
+
end
|
272
|
+
|
273
|
+
it "should not allow to block not connected user" do
|
274
|
+
@david.block(@peter).should be_false
|
275
|
+
@peter.block(@david).should be_false
|
276
|
+
end
|
277
|
+
|
278
|
+
it "should not allow to block already blocked user" do
|
279
|
+
@john.block(@jane).should be_true
|
280
|
+
@john.block(@jane).should be_false
|
281
|
+
@james.block(@jane).should be_true
|
282
|
+
@james.block(@jane).should be_false
|
283
|
+
end
|
284
|
+
|
285
|
+
it "should list the blocked users" do
|
286
|
+
@jane.blocked.should be_empty
|
287
|
+
@peter.blocked.should be_empty
|
288
|
+
@james.blocked.should == [@john]
|
289
|
+
@victoria.blocked.should == [@mary]
|
290
|
+
@david.blocked.should =~ [@john, @victoria]
|
291
|
+
end
|
292
|
+
|
293
|
+
it "should not list blocked users in friends" do
|
294
|
+
@james.friends.should =~ [@jane, @victoria]
|
295
|
+
@james.blocked.each do |user|
|
296
|
+
@james.friends.should_not include(user)
|
297
|
+
user.friends.should_not include(@james)
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
it "should not list blocked users in invited" do
|
302
|
+
@victoria.invited.should == [@james]
|
303
|
+
@victoria.blocked.each do |user|
|
304
|
+
@victoria.invited.should_not include(user)
|
305
|
+
user.invited_by.should_not include(@victoria)
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
it "should not list blocked users in invited pending by" do
|
310
|
+
@david.pending_invited_by.should be_empty
|
311
|
+
@david.blocked.each do |user|
|
312
|
+
@david.pending_invited_by.should_not include(user)
|
313
|
+
user.pending_invited.should_not include(@david)
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
it "should check if a user is blocked" do
|
318
|
+
@james.blocked?(@john).should be_true
|
319
|
+
@victoria.blocked?(@mary).should be_true
|
320
|
+
@david.blocked?(@john).should be_true
|
321
|
+
@david.blocked?(@victoria).should be_true
|
322
|
+
end
|
230
323
|
end
|
231
324
|
|
232
325
|
context "when unblocking friendships" do
|
233
|
-
before
|
326
|
+
before do
|
234
327
|
Friendship.delete_all
|
328
|
+
@john.invite(@james).should be_true
|
329
|
+
@james.approve(@john).should be_true
|
330
|
+
@john.block(@james).should be_true
|
331
|
+
@john.unblock(@james).should be_true
|
332
|
+
@mary.invite(@victoria).should be_true
|
333
|
+
@victoria.approve(@mary).should be_true
|
334
|
+
@victoria.block(@mary).should be_true
|
335
|
+
@victoria.unblock(@mary).should be_true
|
336
|
+
@victoria.invite(@david).should be_true
|
337
|
+
@david.block(@victoria).should be_true
|
338
|
+
@david.unblock(@victoria).should be_true
|
339
|
+
@john.invite(@david).should be_true
|
340
|
+
@david.block(@john).should be_true
|
341
|
+
@peter.invite(@elisabeth).should be_true
|
342
|
+
@elisabeth.block(@peter).should be_true
|
343
|
+
@jane.invite(@john).should be_true
|
344
|
+
@jane.invite(@james).should be_true
|
345
|
+
@james.approve(@jane).should be_true
|
346
|
+
@victoria.invite(@jane).should be_true
|
347
|
+
@victoria.invite(@james).should be_true
|
348
|
+
@james.approve(@victoria).should be_true
|
349
|
+
end
|
235
350
|
|
236
|
-
|
237
|
-
@
|
238
|
-
@
|
239
|
-
@david.block(@john).should == true
|
240
|
-
@david.unblock(@john).should == true
|
241
|
-
@john.unblock(@victoria).should == false
|
351
|
+
it "should allow to unblock prevoiusly blocked user" do
|
352
|
+
@david.unblock(@john).should be_true
|
353
|
+
@elisabeth.unblock(@peter).should be_true
|
242
354
|
end
|
243
355
|
|
244
|
-
it "should allow to unblock
|
245
|
-
@
|
246
|
-
@
|
247
|
-
@
|
248
|
-
@
|
356
|
+
it "should not allow to unblock not prevoiusly blocked user" do
|
357
|
+
@john.unblock(@jane).should be_false
|
358
|
+
@james.unblock(@jane).should be_false
|
359
|
+
@victoria.unblock(@jane).should be_false
|
360
|
+
@james.unblock(@victoria).should be_false
|
249
361
|
end
|
250
362
|
|
251
|
-
it "should
|
252
|
-
@john.
|
253
|
-
@
|
363
|
+
it "should not allow to unblock blocked user by himself" do
|
364
|
+
@john.unblock(@david).should be_false
|
365
|
+
@peter.unblock(@elisabeth).should be_false
|
254
366
|
end
|
255
367
|
|
256
|
-
it "should
|
257
|
-
@john.friends.
|
258
|
-
@
|
259
|
-
@
|
368
|
+
it "should list unblocked users in friends" do
|
369
|
+
@john.friends.should == [@james]
|
370
|
+
@mary.friends.should == [@victoria]
|
371
|
+
@victoria.friends.should =~ [@mary, @james]
|
372
|
+
@james.friends.should =~ [@john, @jane, @victoria]
|
373
|
+
end
|
374
|
+
|
375
|
+
it "should list unblocked users in invited" do
|
376
|
+
@john.invited.should == [@james]
|
377
|
+
@mary.invited.should == [@victoria]
|
378
|
+
end
|
379
|
+
|
380
|
+
it "should list unblocked users in invited by" do
|
381
|
+
@victoria.invited_by.should == [@mary]
|
382
|
+
@james.invited_by.should =~ [@john, @jane, @victoria]
|
383
|
+
end
|
384
|
+
|
385
|
+
it "should list unblocked users in pending invited" do
|
386
|
+
@victoria.pending_invited.should =~ [@jane, @david]
|
387
|
+
end
|
260
388
|
|
261
|
-
|
262
|
-
@
|
263
|
-
@
|
264
|
-
|
265
|
-
@john.pending_invited.count.should == 1
|
266
|
-
@john.pending_invited.should include(@jane)
|
267
|
-
@john.pending_invited.should_not include(@david)
|
268
|
-
@john.pending_invited.should_not include(@victoria)
|
389
|
+
it "should list unblocked users in pending invited by" do
|
390
|
+
@david.reload
|
391
|
+
@david.pending_invited_by.should == [@victoria]
|
269
392
|
end
|
270
393
|
end
|
271
394
|
end
|
@@ -1,26 +1,122 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Amistad::FriendshipModel do
|
4
|
-
|
5
|
-
before(:
|
6
|
-
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
%w(Jane David).each do |name|
|
7
|
+
instance_variable_set("@#{name.downcase}".to_sym, User.create(:name => name))
|
8
|
+
end
|
7
9
|
end
|
8
|
-
|
9
|
-
it "
|
10
|
+
|
11
|
+
it "should validate presence of the user's id and the friend's id" do
|
10
12
|
friendship = Friendship.new
|
11
|
-
friendship.
|
12
|
-
|
13
|
-
friendship
|
14
|
-
friendship.
|
13
|
+
friendship.valid?.should be_false
|
14
|
+
friendship.errors.should include(:user_id)
|
15
|
+
friendship.errors.should include(:friend_id)
|
16
|
+
friendship.errors.size.should == 2
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when creating friendship" do
|
20
|
+
before do
|
21
|
+
Friendship.delete_all
|
22
|
+
@jane.invite(@david)
|
23
|
+
@friendship = Friendship.first
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should be pending" do
|
27
|
+
@friendship.pending?.should be_true
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should not be approved" do
|
31
|
+
@friendship.approved?.should be_false
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should be active" do
|
35
|
+
@friendship.active?.should be_true
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should not be blocked" do
|
39
|
+
@friendship.blocked?.should be_false
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should be available to block only by invited user" do
|
43
|
+
@friendship.can_block?(@david).should be_true
|
44
|
+
@friendship.can_block?(@sane).should be_false
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should not be availabel to unblock" do
|
48
|
+
@friendship.can_unblock?(@jane).should be_false
|
49
|
+
@friendship.can_unblock?(@david).should be_false
|
50
|
+
end
|
15
51
|
end
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
52
|
+
|
53
|
+
context "when approving friendship" do
|
54
|
+
before do
|
55
|
+
Friendship.delete_all
|
56
|
+
@jane.invite(@david)
|
57
|
+
@david.approve(@jane)
|
58
|
+
@friendship = Friendship.first
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should be approved" do
|
62
|
+
@friendship.approved?.should be_true
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should not be pending" do
|
66
|
+
@friendship.pending?.should be_false
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should be active" do
|
70
|
+
@friendship.active?.should be_true
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should not be blocked" do
|
74
|
+
@friendship.blocked?.should be_false
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should be available to block by both users" do
|
78
|
+
@friendship.can_block?(@sane).should be_true
|
79
|
+
@friendship.can_block?(@david).should be_true
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should not be availabel to unblock" do
|
83
|
+
@friendship.can_unblock?(@jane).should be_false
|
84
|
+
@friendship.can_unblock?(@david).should be_false
|
85
|
+
end
|
20
86
|
end
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
87
|
+
|
88
|
+
context "when blocking friendship" do
|
89
|
+
before do
|
90
|
+
Friendship.delete_all
|
91
|
+
@jane.invite(@david)
|
92
|
+
@david.block(@jane)
|
93
|
+
@friendship = Friendship.first
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should not be approved" do
|
97
|
+
@friendship.approved?.should be_false
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should be pending" do
|
101
|
+
@friendship.pending?.should be_true
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should not be active" do
|
105
|
+
@friendship.active?.should be_false
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should be blocked" do
|
109
|
+
@friendship.blocked?.should be_true
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should not be available to block" do
|
113
|
+
@friendship.can_block?(@sane).should be_false
|
114
|
+
@friendship.can_block?(@david).should be_false
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should be available to unblock only by user who blocked it" do
|
118
|
+
@friendship.can_unblock?(@david).should be_true
|
119
|
+
@friendship.can_unblock?(@jane).should be_false
|
120
|
+
end
|
25
121
|
end
|
26
122
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -17,9 +17,11 @@ ActiveRecord::Schema.define do
|
|
17
17
|
create_table :friendships, :force => true do |t|
|
18
18
|
t.integer :user_id
|
19
19
|
t.integer :friend_id
|
20
|
+
t.integer :blocker_id
|
20
21
|
t.boolean :pending, :default => true
|
21
|
-
t.boolean :blocked, :default => false
|
22
22
|
end
|
23
|
+
|
24
|
+
add_index :friendships, [:user_id, :friend_id], :unique => true
|
23
25
|
end
|
24
26
|
|
25
27
|
class User < ActiveRecord::Base
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 6
|
8
|
+
- 0
|
9
|
+
version: 0.6.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Rawane ZOSSOU
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date:
|
17
|
+
date: 2011-01-10 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -23,13 +23,13 @@ dependencies:
|
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
25
25
|
requirements:
|
26
|
-
- -
|
26
|
+
- - ~>
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
segments:
|
29
29
|
- 1
|
30
30
|
- 0
|
31
|
-
-
|
32
|
-
version: 1.0.
|
31
|
+
- 7
|
32
|
+
version: 1.0.7
|
33
33
|
type: :development
|
34
34
|
version_requirements: *id001
|
35
35
|
- !ruby/object:Gem::Dependency
|
@@ -42,9 +42,9 @@ dependencies:
|
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
segments:
|
44
44
|
- 2
|
45
|
-
-
|
45
|
+
- 4
|
46
46
|
- 0
|
47
|
-
version: 2.
|
47
|
+
version: 2.4.0
|
48
48
|
type: :development
|
49
49
|
version_requirements: *id002
|
50
50
|
- !ruby/object:Gem::Dependency
|
@@ -58,8 +58,8 @@ dependencies:
|
|
58
58
|
segments:
|
59
59
|
- 3
|
60
60
|
- 0
|
61
|
-
-
|
62
|
-
version: 3.0.
|
61
|
+
- 3
|
62
|
+
version: 3.0.3
|
63
63
|
type: :development
|
64
64
|
version_requirements: *id003
|
65
65
|
- !ruby/object:Gem::Dependency
|
@@ -68,7 +68,7 @@ dependencies:
|
|
68
68
|
requirement: &id004 !ruby/object:Gem::Requirement
|
69
69
|
none: false
|
70
70
|
requirements:
|
71
|
-
- - "
|
71
|
+
- - "="
|
72
72
|
- !ruby/object:Gem::Version
|
73
73
|
segments:
|
74
74
|
- 1
|
@@ -88,7 +88,6 @@ extra_rdoc_files: []
|
|
88
88
|
|
89
89
|
files:
|
90
90
|
- .gitignore
|
91
|
-
- .rspec
|
92
91
|
- CHANGELOG
|
93
92
|
- Gemfile
|
94
93
|
- LICENCE
|
data/.rspec
DELETED