mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-18 15:17:25 +01:00
Removes quest from group if quest leader is booted
This commit is contained in:
@@ -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 }
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -715,11 +715,14 @@ api.removeMember = function(req, res, next){
|
|||||||
|
|
||||||
if(_.contains(group.members, uuid)){
|
if(_.contains(group.members, uuid)){
|
||||||
var update = {$pull:{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
|
// remove member from quest
|
||||||
update['$unset'] = {};
|
update['$unset'] = {};
|
||||||
update['$unset']['quest.members.' + uuid] = "";
|
update['$unset']['quest.members.' + uuid] = "";
|
||||||
// TODO: run cleanQuestProgress and return scroll to member if member was quest owner
|
|
||||||
}
|
}
|
||||||
update['$inc'] = {memberCount: -1};
|
update['$inc'] = {memberCount: -1};
|
||||||
Group.update({_id:group._id},update, function(err, saved){
|
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
|
//Mark removed users messages as seen
|
||||||
var update = {$unset:{}};
|
var update = {$unset:{}};
|
||||||
update.$unset['newMessages.' + group._id] = '';
|
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();
|
User.update({_id: removedUser._id, apiToken: removedUser.apiToken}, update).exec();
|
||||||
|
|
||||||
// Sending an empty 204 because Group.update doesn't return the group
|
// Sending an empty 204 because Group.update doesn't return the group
|
||||||
|
|||||||
Reference in New Issue
Block a user