mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-18 15:17:25 +01:00
Prevent user from leaving party during active quest
This commit is contained in:
@@ -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;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user