/
membership_service_spec.rb
122 lines (107 loc) · 5.41 KB
/
membership_service_spec.rb
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
require 'rails_helper'
describe MembershipService do
let(:group) { create :group, discussion_privacy_options: :public_only, is_visible_to_public: true, membership_granted_upon: :request }
let(:user) { create :user }
let(:admin) { create :user }
let(:unverified_user) { create :user, email_verified: false }
let(:membership) { create :membership, group: group, user: unverified_user, accepted_at: nil }
before { group.add_admin! admin }
describe 'destroy' do
let!(:subgroup) { create :group, parent: group }
let!(:subgroup_discussion) { create :discussion, group: subgroup, private: false }
let!(:discussion) { create :discussion, group: group, private: false }
let!(:poll) { create :poll, group: group }
let!(:membership) { create :membership, user: user, group: group }
it 'cascade deletes memberships' do
membership
subgroup.add_member! user
subgroup_discussion.add_guest! user, subgroup_discussion.author
reader = discussion.add_guest! user, discussion.author
stance = poll.add_guest!(user, discussion.author)
expect(stance.inviter_id).to eq discussion.author_id
expect(reader.inviter_id).to eq discussion.author_id
expect(stance.guest).to eq true
expect(reader.guest).to eq true
MembershipService.revoke(membership: membership, actor: user)
expect(subgroup.members).to_not include user
expect(subgroup_discussion.members).to_not include user
expect(discussion.members).to_not include user
expect(poll.members).to_not include user
expect(reader.reload.guest).to eq false
expect(stance.reload.guest).to eq false
end
end
describe 'redeem' do
let!(:another_subgroup) { create :group, parent: group }
let!(:discussion) { create :discussion, group: group, private: false }
let!(:poll) { create :poll, group: group }
let(:first_inviter) { create :user }
let(:second_inviter) { create :user }
let(:yesterday) { 1.day.ago }
let(:today) { DateTime.now }
before do
group.add_admin! first_inviter
group.add_admin! second_inviter
end
it 'sets accepted_at' do
MembershipService.redeem(membership: membership, actor: user)
membership.reload.accepted_at.should be_present
end
it "handles simple case" do
new_membership = Membership.create!(user_id: user.id, group_id: group.id, inviter_id: first_inviter.id)
MembershipService.redeem(membership: new_membership, actor: user)
expect(new_membership.reload.user_id).to eq user.id
expect(new_membership.reload.accepted_at).to be_present
expect(new_membership.reload.inviter_id).to eq first_inviter.id
expect(new_membership.reload.revoked_at).to_not be_present
end
it "handles existing memberships" do
existing_membership = Membership.create!(user_id: user.id, group_id: group.id, accepted_at: yesterday, inviter_id: first_inviter.id)
new_membership = Membership.create!(user_id: unverified_user.id, group_id: group.id, inviter_id: second_inviter.id)
MembershipService.redeem(membership: new_membership, actor: user)
expect(existing_membership.reload.user_id).to eq user.id
expect(existing_membership.reload.accepted_at).to_not be yesterday
expect(existing_membership.reload.accepted_at).to be_present
expect(existing_membership.reload.inviter_id).to eq first_inviter.id
expect(existing_membership.reload.revoked_at).to_not be_present
end
it "handles revoked memberships" do
existing_membership = Membership.create!(user_id: user.id, group_id: group.id, accepted_at: DateTime.now, revoked_at: DateTime.now, inviter_id: first_inviter.id, revoker_id: first_inviter.id)
new_membership = Membership.create!(user_id: unverified_user.id, group_id: group.id, inviter_id: second_inviter.id)
MembershipService.redeem(membership: new_membership, actor: user)
expect(existing_membership.reload.user_id).to eq user.id
expect(existing_membership.reload.inviter_id).to eq second_inviter.id
expect(existing_membership.reload.accepted_at).to be_present
expect(existing_membership.reload.revoked_at).to_not be_present
end
it 'unrevokes discussion readers and stances' do
reader = discussion.add_guest! user, discussion.author
stance = poll.add_guest!(user, discussion.author)
reader.update(revoked_at: DateTime.now)
stance.update(revoked_at: DateTime.now)
expect(stance.revoked_at).to_not eq nil
expect(reader.revoked_at).to_not eq nil
expect(stance.guest).to eq true
expect(reader.guest).to eq true
MembershipService.redeem(membership: membership, actor: user)
expect(stance.reload.guest).to eq false
expect(reader.reload.guest).to eq false
expect(stance.reload.revoked_at).to eq nil
expect(reader.reload.revoked_at).to eq nil
end
it 'notifies the invitor of acceptance' do
MembershipService.redeem(membership: membership, actor: user)
expect(Event.last.kind).to eq 'invitation_accepted'
end
end
describe 'with alien group' do
let!(:alien_group) { create :group }
let(:membership) { create :membership, group: group, inviter: admin, user: user, experiences: { invited_group_ids: [alien_group.id] }, accepted_at: nil }
before do
MembershipService.redeem(membership: membership, actor: user)
end
it 'cannot invite user to alien group' do
expect(alien_group.members).to_not include user
end
end
end