Adding tests to prove expected behavior around force starting a quest (#7848)

* starting

* adding tests to prove the expected behavior occurs around force starting a quest. part of #7653

* fixing up tests and adding functionality to remove user from quest if they are not in the questing party

* adding code to handle when the user is deleted and added a test around that situation

* fixing up comments
This commit is contained in:
Travis
2016-09-10 21:10:37 -07:00
committed by Blade Barringer
parent ed4039c08c
commit b73cf2e272
2 changed files with 93 additions and 0 deletions

View File

@@ -149,5 +149,87 @@ describe('POST /groups/:groupId/quests/force-start', () => {
expect(partyMemberThatIgnores.party.quest.key).to.not.exist;
expect(partyMemberThatIgnores.party.quest.completed).to.not.exist;
});
it('removes users who have not accepted the quest from quest.members', async () => {
let partyMemberThatRejects = partyMembers[1];
let partyMemberThatIgnores = partyMembers[2];
let partyMemberThatAccepts = partyMembers[0];
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
await partyMemberThatAccepts.post(`/groups/${questingGroup._id}/quests/accept`);
await partyMemberThatRejects.post(`/groups/${questingGroup._id}/quests/reject`);
await leader.post(`/groups/${questingGroup._id}/quests/force-start`);
await Bluebird.delay(500);
await questingGroup.sync();
expect(questingGroup.quest.members[partyMemberThatRejects._id]).to.not.exist;
expect(questingGroup.quest.members[partyMemberThatIgnores._id]).to.not.exist;
expect(questingGroup.quest.members[partyMemberThatAccepts._id]).to.exist;
expect(questingGroup.quest.members[leader._id]).to.exist;
});
it('removes users who are not in the party from quest.members', async () => {
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
let notInPartyUser = await generateUser();
await questingGroup.update({
[`quest.members.${notInPartyUser._id}`]: true,
});
await questingGroup.sync();
expect(questingGroup.quest.members[notInPartyUser._id]).to.eql(true);
await leader.post(`/groups/${questingGroup._id}/quests/force-start`);
await Bluebird.delay(500);
await questingGroup.sync();
expect(questingGroup.quest.members[notInPartyUser._id]).to.not.exist;
});
it('removes users who have been deleted from quest.members', async () => {
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
await partyMembers[0].del('/user', {
password: 'password',
});
await leader.post(`/groups/${questingGroup._id}/quests/force-start`);
await Bluebird.delay(500);
await questingGroup.sync();
expect(questingGroup.quest.members[partyMembers[0]._id]).to.not.exist;
});
it('removes users who don\'t have true value in quest.members from quest.members', async () => {
let partyMemberThatRejects = partyMembers[1];
let partyMemberThatIgnores = partyMembers[2];
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
await questingGroup.update({
[`quest.members.${partyMemberThatRejects._id}`]: false,
[`quest.members.${partyMemberThatIgnores._id}`]: null,
});
await leader.post(`/groups/${questingGroup._id}/quests/force-start`);
await Bluebird.delay(500);
await questingGroup.sync();
expect(questingGroup.quest.members[partyMemberThatRejects._id]).to.not.exist;
expect(questingGroup.quest.members[partyMemberThatIgnores._id]).to.not.exist;
expect(questingGroup.quest.members[partyMembers[0]._id]).to.exist;
expect(questingGroup.quest.members[leader._id]).to.exist;
});
});
});

View File

@@ -393,6 +393,17 @@ schema.methods.startQuest = async function startQuest (user) {
let nonUserQuestMembers = _.keys(this.quest.members);
removeFromArray(nonUserQuestMembers, user._id);
// remove any users from quest.members who aren't in the party
let partyId = this._id;
let questMembers = this.quest.members;
await Bluebird.map(Object.keys(this.quest.members), async (memberId) => {
let member = await User.findOne({_id: memberId, 'party._id': partyId}).select('_id').lean();
if (!member) {
delete questMembers[memberId];
}
});
if (userIsParticipating) {
user.party.quest.key = this.quest.key;
user.party.quest.progress.down = 0;