import { createAndPopulateGroup, translate as t, generateUser, } from '../../../../helpers/api-v3-integration.helper'; import { v4 as generateUUID } from 'uuid'; describe('POST /groups/:groupId/quests/leave', () => { let questingGroup; let partyMembers; let user; let leader; const PET_QUEST = 'whale'; beforeEach(async () => { let { group, groupLeader, members } = await createAndPopulateGroup({ groupDetails: { type: 'party', privacy: 'private' }, members: 2, }); questingGroup = group; leader = groupLeader; partyMembers = members; await leader.update({ [`items.quests.${PET_QUEST}`]: 1, }); user = await generateUser(); }); context('failure conditions', () => { it('returns an error when group is not found', async () => { await expect(partyMembers[0].post(`/groups/${generateUUID()}/quests/leave`)) .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', message: t('groupNotFound'), }); }); it('returns an error for a group in which user is not a member', async () => { await expect(user.post(`/groups/${questingGroup._id}/quests/leave`)) .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', message: t('groupNotFound'), }); }); it('returns an error when group is a guild', async () => { let { group: guild, groupLeader: guildLeader } = await createAndPopulateGroup({ groupDetails: { type: 'guild', privacy: 'private' }, }); await expect(guildLeader.post(`/groups/${guild._id}/quests/leave`)) .to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', message: t('guildQuestsNotSupported'), }); }); it('returns an error when quest is not active', async () => { await expect(partyMembers[0].post(`/groups/${questingGroup._id}/quests/leave`)) .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', message: t('noActiveQuestToLeave'), }); }); it('returns an error when quest leader attempts to leave', async () => { await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`); await partyMembers[1].post(`/groups/${questingGroup._id}/quests/accept`); await expect(leader.post(`/groups/${questingGroup._id}/quests/leave`)) .to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', message: t('questLeaderCannotLeaveQuest'), }); }); it('returns an error when non quest member attempts to leave', async () => { await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`); await partyMembers[1].post(`/groups/${questingGroup._id}/quests/reject`); await expect(partyMembers[1].post(`/groups/${questingGroup._id}/quests/leave`)) .to.eventually.be.rejected.and.eql({ code: 401, error: 'NotAuthorized', message: t('notPartOfQuest'), }); }); }); it('leaves a quest', async () => { await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`); await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`); await partyMembers[1].post(`/groups/${questingGroup._id}/quests/accept`); let leaveResult = await partyMembers[0].post(`/groups/${questingGroup._id}/quests/leave`); await Promise.all([ partyMembers[0].sync(), questingGroup.sync(), ]); expect(partyMembers[0].party.quest).to.eql({ key: null, progress: { up: 0, down: 0, collect: {}, collectedItems: 0, }, completed: null, RSVPNeeded: false, }); expect(questingGroup.quest).to.deep.equal(leaveResult); expect(questingGroup.quest.members[partyMembers[0]._id]).to.be.false; }); });