From 4c84728873d7294c3a82fc652b8e5db5577b46d2 Mon Sep 17 00:00:00 2001 From: Blade Barringer Date: Tue, 15 Sep 2015 18:10:31 -0500 Subject: [PATCH] Removes quest from group if quest leader is booted --- test/server_side/controllers/groups.test.js | 101 ++++++++++++++++++++ website/src/controllers/groups.js | 11 ++- 2 files changed, 110 insertions(+), 2 deletions(-) diff --git a/test/server_side/controllers/groups.test.js b/test/server_side/controllers/groups.test.js index 075866d66f..ad9196e13f 100644 --- a/test/server_side/controllers/groups.test.js +++ b/test/server_side/controllers/groups.test.js @@ -393,4 +393,105 @@ describe('Groups Controller', function() { }); }); }); + + describe('#removeMember', function() { + var req, res, group, user; + + beforeEach(function() { + user = { _id: 'user-id' }; + group = { + _id: 'group-id', + leader: 'user-id', + members: ['user-id', 'member-to-boot', 'another-user'] + } + res = { + locals: { + user: user, + group: group + }, + send: sinon.stub() + }; + req = { + query: { + uuid: 'member-to-boot' + } + }; + + sinon.stub(Group, 'update'); + sinon.stub(User, 'update'); + sinon.stub(User, 'findById'); + }); + + afterEach(function() { + Group.update.restore(); + User.update.restore(); + User.findById.restore(); + }); + + context('quest behavior', function() { + it('removes quest from party if booted member was quest leader', function() { + group.quest = { + leader: 'member-to-boot', + active: true, + members: { + 'user-id': true, + 'leader-id': true, + 'member-to-boot': true + }, + key: 'whale' + } + + groupsController.removeMember(req, res); + + expect(Group.update).to.be.calledOnce; + expect(Group.update).to.be.calledWith( + { _id: 'group-id'}, + { + '$inc': { memberCount: -1 }, + '$pull': { members: 'member-to-boot' }, + '$set': { quest: {key: null, leader: null} } + } + ); + }); + + it('returns quest scroll to booted member if booted member was leader of quest', function() { + Group.update.yields(); + var bootedMember = { + _id: 'member-to-boot', + apiToken: 'api', + preferences: { + emailNotifications: { + kickedGroup: false + } + } + }; + User.findById.yields(null, bootedMember); + User.update.returns({ + exec: sinon.stub() + }); + + group.quest = { + leader: 'member-to-boot', + active: true, + members: { + 'user-id': true, + 'leader-id': true, + 'member-to-boot': true + }, + key: 'whale' + } + + groupsController.removeMember(req, res); + + expect(User.update).to.be.calledOnce; + expect(User.update).to.be.calledWith( + { _id: 'member-to-boot', apiToken: 'api' }, + { + '$unset': { 'newMessages.group-id': ''}, + '$inc': { 'items.quests.whale': 1 } + } + ); + }); + }); + }); }); diff --git a/website/src/controllers/groups.js b/website/src/controllers/groups.js index 9d36a5420e..573142887c 100644 --- a/website/src/controllers/groups.js +++ b/website/src/controllers/groups.js @@ -715,11 +715,14 @@ api.removeMember = function(req, res, next){ if(_.contains(group.members, uuid)){ var update = {$pull:{members:uuid}}; - if(group.quest && group.quest.members){ + if (group.quest && group.quest.leader === uuid) { + update['$set'] = { + quest: { key: null, leader: null } + }; + } else if(group.quest && group.quest.members){ // remove member from quest update['$unset'] = {}; update['$unset']['quest.members.' + uuid] = ""; - // TODO: run cleanQuestProgress and return scroll to member if member was quest owner } update['$inc'] = {memberCount: -1}; Group.update({_id:group._id},update, function(err, saved){ @@ -733,6 +736,10 @@ api.removeMember = function(req, res, next){ //Mark removed users messages as seen var update = {$unset:{}}; update.$unset['newMessages.' + group._id] = ''; + if (group.quest && group.quest.active && group.quest.leader === uuid) { + update['$inc'] = {}; + update['$inc']['items.quests.' + group.quest.key] = 1; + } User.update({_id: removedUser._id, apiToken: removedUser.apiToken}, update).exec(); // Sending an empty 204 because Group.update doesn't return the group