diff --git a/test/api/v3/unit/models/group.test.js b/test/api/v3/unit/models/group.test.js index c3c7f615c1..b63e8ca06c 100644 --- a/test/api/v3/unit/models/group.test.js +++ b/test/api/v3/unit/models/group.test.js @@ -434,6 +434,47 @@ describe('Group Model', () => { }); }); + describe('#leaveGroup', () => { + it('removes user from group quest', async () => { + party.quest.members = { + [participatingMember._id]: true, + [questLeader._id]: true, + [nonParticipatingMember._id]: false, + [undecidedMember._id]: null, + }; + party.memberCount = 4; + await party.save(); + + await party.leave(participatingMember); + + party = await Group.findOne({_id: party._id}); + expect(party.quest.members).to.eql({ + [questLeader._id]: true, + [nonParticipatingMember._id]: false, + [undecidedMember._id]: null, + }); + }); + + it('deletes a private group when the last member leaves', async () => { + party.memberCount = 1; + + await party.leave(participatingMember); + + party = await Group.findOne({_id: party._id}); + expect(party).to.not.exist; + }); + + it('does not delete a public group when the last member leaves', async () => { + party.memberCount = 1; + party.privacy = 'public'; + + await party.leave(participatingMember); + + party = await Group.findOne({_id: party._id}); + expect(party).to.exist; + }); + }); + describe('#sendChat', () => { beforeEach(() => { sandbox.spy(User, 'update'); diff --git a/website/server/models/group.js b/website/server/models/group.js index 0474104fad..16a432e399 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -701,6 +701,9 @@ schema.statics.tavernBoss = async function tavernBoss (user, progress) { schema.methods.leave = async function leaveGroup (user, keep = 'keep-all') { let group = this; + let update = { + $inc: {memberCount: -1}, + }; let challenges = await Challenge.find({ _id: {$in: user.challenges}, @@ -724,16 +727,14 @@ schema.methods.leave = async function leaveGroup (user, keep = 'keep-all') { pusher.trigger(`presence-group-${group._id}`, 'user-left', { userId: user._id, }); + + update.$unset = {[`quest.members.${user._id}`]: 1}; } // If user is the last one in group and group is private, delete it if (group.memberCount <= 1 && group.privacy === 'private') { promises.push(group.remove()); } else { // otherwise If the leader is leaving (or if the leader previously left, and this wasn't accounted for) - let update = { - $inc: {memberCount: -1}, - }; - if (group.leader === user._id) { let query = group.type === 'party' ? {'party._id': group._id} : {guilds: group._id}; query._id = {$ne: user._id};