Prevent user from leaving party during active quest

This commit is contained in:
Blade Barringer
2015-08-28 22:41:30 -05:00
parent 2e3c166a40
commit 342343d34f
2 changed files with 24 additions and 16 deletions

View File

@@ -5,6 +5,7 @@ chai.use(require("sinon-chai"));
var expect = chai.expect; var expect = chai.expect;
var Q = require('q'); var Q = require('q');
var Group = require('../../../website/src/models/group').model;
var groupsController = require('../../../website/src/controllers/groups'); var groupsController = require('../../../website/src/controllers/groups');
describe('Groups Controller', function() { 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 = { user.party = {
quest : { quest : {
key : 'vice1', key : 'vice1',
@@ -72,14 +81,21 @@ describe('Groups Controller', function() {
RSVPNeeded : false RSVPNeeded : false
} }
} }
});
it('removes quest data from user', function() {
groupsController.leave(req, res); groupsController.leave(req, res);
expect(user.party.quest.key).to.not.exist; expect(Group.update).to.not.be.called;
expect(user.party.quest.progress).to.eql({up: 0, down: 0, collect: {}}); expect(res.json).to.be.calledOnce;
expect(user.save).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;
}); });
}); });
}); });

View File

@@ -487,15 +487,12 @@ api.join = function(req, res, next) {
api.leave = function(req, res, next) { api.leave = function(req, res, next) {
var user = res.locals.user, var user = res.locals.user,
group = res.locals.group; 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? // When removing the user from challenges, should we keep the tasks?
var keep = (/^remove-all/i).test(req.query.keep) ? 'remove-all' : 'keep-all'; var keep = (/^remove-all/i).test(req.query.keep) ? 'remove-all' : 'keep-all';
async.parallel([ 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 // Remove user from group challenges
function(cb){ function(cb){
async.waterfall([ async.waterfall([
@@ -545,11 +542,6 @@ api.leave = function(req, res, next) {
update['$set'] = update['$set'] || {}; update['$set'] = update['$set'] || {};
update['$set'].leader = seniorMember; 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}; update['$inc'] = {memberCount: -1};
Group.update({_id:group._id},update,cb); Group.update({_id:group._id},update,cb);