diff --git a/test/server_side/controllers/groups.test.js b/test/server_side/controllers/groups.test.js index c3693741dd..97bf391e8a 100644 --- a/test/server_side/controllers/groups.test.js +++ b/test/server_side/controllers/groups.test.js @@ -5,6 +5,7 @@ chai.use(require("sinon-chai")); var expect = chai.expect; var Q = require('q'); +var Group = require('../../../website/src/models/group').model; var groupsController = require('../../../website/src/controllers/groups'); describe('Groups Controller', function() { @@ -60,6 +61,14 @@ describe('Groups Controller', function() { } }; + sinon.spy(Group, 'update'); + }); + + afterEach(function() { + Group.update.restore(); + }); + + it('prevents user from leaving party if quest is active', function() { user.party = { quest : { key : 'vice1', @@ -72,14 +81,21 @@ describe('Groups Controller', function() { RSVPNeeded : false } } - }); - it('removes quest data from user', function() { groupsController.leave(req, res); - expect(user.party.quest.key).to.not.exist; - expect(user.party.quest.progress).to.eql({up: 0, down: 0, collect: {}}); - expect(user.save).to.be.calledOnce; + expect(Group.update).to.not.be.called; + expect(res.json).to.be.calledOnce; + expect(res.json).to.be.calledWith(403, 'You cannot leave party during an active quest. Please leave the quest first'); + }); + + it('leaves party if quest is not active', function() { + user.party = { quest: { key: null } }; + + groupsController.leave(req, res); + + expect(Group.update).to.be.calledOnce; + expect(res.json).to.not.be.called; }); }); }); diff --git a/website/src/controllers/groups.js b/website/src/controllers/groups.js index fe92a3a4e1..ee6bd3332b 100644 --- a/website/src/controllers/groups.js +++ b/website/src/controllers/groups.js @@ -487,15 +487,12 @@ api.join = function(req, res, next) { api.leave = function(req, res, next) { var user = res.locals.user, group = res.locals.group; + + if (group.type === 'party' && user.party.quest && user.party.quest.key) return res.json(403, 'You cannot leave party during an active quest. Please leave the quest first'); + // When removing the user from challenges, should we keep the tasks? var keep = (/^remove-all/i).test(req.query.keep) ? 'remove-all' : 'keep-all'; async.parallel([ - // Remove active quest from user if they're leaving the party - function(cb){ - if (group.type != 'party') return cb(null,{},1); - user.party.quest = Group.cleanQuestProgress(); - user.save(cb); - }, // Remove user from group challenges function(cb){ async.waterfall([ @@ -545,11 +542,6 @@ api.leave = function(req, res, next) { update['$set'] = update['$set'] || {}; update['$set'].leader = seniorMember; } - leader = group.quest && group.quest.leader; - if (leader && (leader == user._id || !~group.members.indexOf(leader))) { - update['$set'] = update['$set'] || {}; - update['$set']['quest.leader'] = seniorMember; - } } update['$inc'] = {memberCount: -1}; Group.update({_id:group._id},update,cb);