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 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;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user