Removes quest from group if quest leader is booted

This commit is contained in:
Blade Barringer
2015-09-15 18:10:31 -05:00
parent a655242c49
commit 4c84728873
2 changed files with 110 additions and 2 deletions

View File

@@ -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 }
}
);
});
});
});
});

View File

@@ -715,11 +715,14 @@ api.removeMember = function(req, res, next){
if(_.contains(group.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
update['$unset'] = {};
update['$unset']['quest.members.' + uuid] = "";
// TODO: run cleanQuestProgress and return scroll to member if member was quest owner
}
update['$inc'] = {memberCount: -1};
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
var update = {$unset:{}};
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();
// Sending an empty 204 because Group.update doesn't return the group