diff --git a/app/services/members/authorized_destroy_service.rb b/app/services/members/authorized_destroy_service.rb index c23f90a6a1012bbf19b164eb7feeb4a8366f8663..ca9db59cac706762c7586ffb5f6fb16308ab6d4c 100644 --- a/app/services/members/authorized_destroy_service.rb +++ b/app/services/members/authorized_destroy_service.rb @@ -7,6 +7,8 @@ module Members end def execute + return false if member.is_a?(GroupMember) && member.source.last_owner?(member.user) + member.destroy if member.request? && member.user != user diff --git a/spec/workers/remove_expired_members_worker_spec.rb b/spec/workers/remove_expired_members_worker_spec.rb index 75a5bee7ab456696e7abda01dc85f2bfc8993be5..a6ce926b925e3db14c1ece7e9abfe7cf54e2316a 100644 --- a/spec/workers/remove_expired_members_worker_spec.rb +++ b/spec/workers/remove_expired_members_worker_spec.rb @@ -1,25 +1,58 @@ require 'spec_helper' describe RemoveExpiredMembersWorker do - let!(:worker) { RemoveExpiredMembersWorker.new } - let!(:expired_member) { create(:project_member, expires_at: 1.hour.ago) } - let!(:member_expiring_in_future) { create(:project_member, expires_at: 10.days.from_now) } - let!(:non_expiring_member) { create(:project_member, expires_at: nil) } + let(:worker) { RemoveExpiredMembersWorker.new } describe '#perform' do - it 'removes expired members' do - expect { worker.perform }.to change { Member.count }.by(-1) - expect(Member.find_by(id: expired_member.id)).to be_nil + context 'project members' do + let!(:expired_project_member) { create(:project_member, expires_at: 1.hour.ago, access_level: GroupMember::DEVELOPER) } + let!(:project_member_expiring_in_future) { create(:project_member, expires_at: 10.days.from_now, access_level: GroupMember::DEVELOPER) } + let!(:non_expiring_project_member) { create(:project_member, expires_at: nil, access_level: GroupMember::DEVELOPER) } + + it 'removes expired members' do + expect { worker.perform }.to change { Member.count }.by(-1) + expect(Member.find_by(id: expired_project_member.id)).to be_nil + end + + it 'leaves members who expire in the future' do + worker.perform + expect(project_member_expiring_in_future.reload).to be_present + end + + it 'leaves members who do not expire at all' do + worker.perform + expect(non_expiring_project_member.reload).to be_present + end end - it 'leaves members who expire in the future' do - worker.perform - expect(member_expiring_in_future.reload).to be_present + context 'group members' do + let!(:expired_group_member) { create(:group_member, expires_at: 1.hour.ago, access_level: GroupMember::DEVELOPER) } + let!(:group_member_expiring_in_future) { create(:group_member, expires_at: 10.days.from_now, access_level: GroupMember::DEVELOPER) } + let!(:non_expiring_group_member) { create(:group_member, expires_at: nil, access_level: GroupMember::DEVELOPER) } + + it 'removes expired members' do + expect { worker.perform }.to change { Member.count }.by(-1) + expect(Member.find_by(id: expired_group_member.id)).to be_nil + end + + it 'leaves members who expire in the future' do + worker.perform + expect(group_member_expiring_in_future.reload).to be_present + end + + it 'leaves members who do not expire at all' do + worker.perform + expect(non_expiring_group_member.reload).to be_present + end end - it 'leaves members who do not expire at all' do - worker.perform - expect(non_expiring_member.reload).to be_present + context 'when the last group owner expires' do + let!(:expired_group_owner) { create(:group_member, expires_at: 1.hour.ago, access_level: GroupMember::OWNER) } + + it 'does not delete the owner' do + worker.perform + expect(expired_group_owner.reload).to be_present + end end end end