invite_friend_test.rb
4.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
require_relative "../test_helper"
class InviteFriendTest < ActiveSupport::TestCase
  should 'be a task' do
    ok { InviteFriend.new.kind_of?(Task) }
  end
  should 'actually create friendships (two way) when confirmed' do
    p1 = create_user('testuser1').person
    p2 = create_user('testuser2').person
    task = InviteFriend.create!(:person => p1, :friend => p2)
    assert_difference 'Friendship.count', 2 do
      task.finish
    end
    p1.friends.reload
    p2.friends.reload
    ok('p1 should have p2 as friend') { p1.friends.include?(p2) }
    ok('p2 should have p1 as friend') { p2.friends.include?(p1) }
  end
  should 'require requestor (person inviting other as friend)' do
    task = InviteFriend.new
    task.valid?
    ok('must not validate with empty requestor') { task.errors[:requestor_id.to_s].present? }
    task.requestor = create_user('testuser2').person
    task.valid?
    ok('must validate when requestor is given') { !task.errors[:requestor_id.to_s].present?}
  end
  should 'require friend email if no target given (person being invited)' do
    task = InviteFriend.new
    task.valid?
    ok('must not validate with empty target email') { task.errors[:friend_email.to_s].present? }
    task.friend_email = 'test@test.com'
    task.valid?
    ok('must validate when target email is given') { !task.errors[:friend_email.to_s].present?}
  end
  should 'dont require friend email if target given (person being invited)' do
    task = InviteFriend.new(:target => create_user('testuser2').person)
    task.valid?
    ok('must validate with empty target email') { !task.errors[:friend_email.to_s].present? }
  end
  should 'require target (person being invited) if no friend email given' do
    task = InviteFriend.new
    task.valid?
    ok('must not validate with no target') { task.errors[:target_id.to_s].present? }
    task.target =  create_user('testuser2').person
    task.valid?
    ok('must validate when target is given') { !task.errors[:target_id.to_s].present?}
  end
  should 'dont require target (person being invited) if friend email given' do
    task = InviteFriend.new(:friend_email => "test@test.com")
    task.valid?
    ok('must validate with no target') { !task.errors[:target_id.to_s].present? }
  end
  should 'dont require message if target given (person being invited)' do
    task = InviteFriend.new(:target => create_user('testuser2').person)
    task.valid?
    ok('must validate with no target') { !task.errors[:message.to_s].present? }
  end
  should 'not send e-mails to requestor' do
    p1 = create_user('testuser1').person
    p2 = create_user('testuser2').person
    TaskMailer.expects(:deliver_task_finished).never
    TaskMailer.expects(:deliver_task_created).never
    task = InviteFriend.create!(:person => p1, :friend => p2)
    task.finish
  end
  should 'send e-mails to friend if friend_email given' do
    p1 = create_user('testuser1').person
    mailer = mock
    mailer.expects(:deliver).at_least_once
    TaskMailer.expects(:invitation_notification).returns(mailer).once
    task = InviteFriend.create!(:person => p1, :friend_email => 'test@test.com', :message => '<url>')
  end
  should 'not send e-mails to friend if target given (person being invited)' do
    p1 = create_user('testuser1').person
    p2 = create_user('testuser2').person
    TaskMailer.expects(:deliver_invitation_notification).never
    task = InviteFriend.create!(:person => p1, :friend => p2)
  end
  should 'has permission to manage friends' do
    t = InviteFriend.new
    assert_equal :manage_friends, t.permission
  end
  should 'not invite yourself' do
    p = create_user('testuser1').person
    task1 = InviteFriend.new(:person => p, :friend => p, :message => 'click here: <url>')
    assert !task1.save
    task2 = InviteFriend.new(:person => p, :friend_name => 'Myself', :friend_email => p.user.email, :message => 'click here: <url>')
    assert !task2.save
  end
  should 'have target notification description' do
    person = create_user('testuser1').person
    task = InviteFriend.create!(:person => person, :friend_email => 'test@test.com', :message => '<url>')
    assert_match(/#{task.requestor.name} wants to be your friend./, task.target_notification_description)
  end
  should 'deliver invitation notification' do
    person = create_user('testuser1').person
    task = InviteFriend.create!(:person => person, :friend_email => 'test@test.com', :message => '<url>')
    email = TaskMailer.invitation_notification(task).deliver
    assert_match(/#{task.requestor.name} wants to be your friend./, email.subject)
  end
  should 'not invite friends if there is a pending invitation' do
    person = create_user('testuser1').person
    friend = create_user('testuser2').person
    assert_difference 'InviteFriend.count' do
      InviteFriend.create({:person => person, :target => friend})
    end
    assert_no_difference 'InviteFriend.count' do
      InviteFriend.create({:person => person, :target => friend})
    end
  end
end