diff --git a/test/api/v3/integration/groups/POST-groups.test.js b/test/api/v3/integration/groups/POST-groups.test.js index 8036d6b0d8..ad8f7a6c92 100644 --- a/test/api/v3/integration/groups/POST-groups.test.js +++ b/test/api/v3/integration/groups/POST-groups.test.js @@ -189,6 +189,17 @@ describe('POST /group', () => { expect(updatedUser.party._id).to.eql(party._id); }); + it('does not award Party Up achievement to solo partier', async () => { + await user.post('/groups', { + name: partyName, + type: partyType, + }); + + let updatedUser = await user.get('/user'); + + expect(updatedUser.achievements.partyUp).to.not.eql(true); + }); + it('prevents user in a party from creating another party', async () => { await user.post('/groups', { name: partyName, diff --git a/test/api/v3/integration/groups/POST-groups_groupId_join.test.js b/test/api/v3/integration/groups/POST-groups_groupId_join.test.js index c245bee42a..60a44bc3f3 100644 --- a/test/api/v3/integration/groups/POST-groups_groupId_join.test.js +++ b/test/api/v3/integration/groups/POST-groups_groupId_join.test.js @@ -225,4 +225,53 @@ describe('POST /group/:groupId/join', () => { }); }); }); + + context('Party incentive achievements', () => { + let leader, member, party; + + beforeEach(async () => { + leader = await generateUser(); + member = await generateUser(); + party = await leader.post('/groups', { + name: 'Testing Party', + type: 'party', + }); + await leader.post(`/groups/${party._id}/invite`, { + uuids: [member._id], + }); + await member.post(`/groups/${party._id}/join`); + }); + + it('awards Party Up achievement to party of size 2', async () => { + await member.sync(); + await leader.sync(); + + expect(member).to.have.deep.property('achievements.partyUp', true); + expect(leader).to.have.deep.property('achievements.partyUp', true); + }); + + it('does not award Party On achievement to party of size 2', async () => { + await member.sync(); + await leader.sync(); + + expect(member).to.not.have.deep.property('achievements.partyOn'); + expect(leader).to.not.have.deep.property('achievements.partyOn'); + }); + + it('awards Party On achievement to party of size 4', async () => { + let addlMemberOne = await generateUser(); + let addlMemberTwo = await generateUser(); + await leader.post(`/groups/${party._id}/invite`, { + uuids: [addlMemberOne._id, addlMemberTwo._id], + }); + await addlMemberOne.post(`/groups/${party._id}/join`); + await addlMemberTwo.post(`/groups/${party._id}/join`); + + await member.sync(); + await leader.sync(); + + expect(member).to.have.deep.property('achievements.partyOn', true); + expect(leader).to.have.deep.property('achievements.partyOn', true); + }); + }); }); diff --git a/website/src/controllers/api-v3/groups.js b/website/src/controllers/api-v3/groups.js index 372e0c61fc..c979976206 100644 --- a/website/src/controllers/api-v3/groups.js +++ b/website/src/controllers/api-v3/groups.js @@ -295,6 +295,12 @@ api.joinGroup = { if (group.type === 'party' && inviter) { promises.push(User.update({_id: inviter}, {$inc: {'items.quests.basilist': 1}}).exec()); // Reward inviter + if (group.memberCount > 1) { + promises.push(User.update({$or: [{'party._id': group._id}, {_id: user._id}], 'achievements.partyUp': {$ne: true}}, {$set: {'achievements.partyUp': true}}, {multi: true}).exec()); + } + if (group.memberCount > 3) { + promises.push(User.update({$or: [{'party._id': group._id}, {_id: user._id}], 'achievements.partyOn': {$ne: true}}, {$set: {'achievements.partyOn': true}}, {multi: true}).exec()); + } } await Q.all(promises);