mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-19 15:48:04 +01:00
fix quest accept route and add tests
This commit is contained in:
@@ -73,5 +73,6 @@
|
|||||||
"questNotFound": "Quest \"<%= key %>\" not found.",
|
"questNotFound": "Quest \"<%= key %>\" not found.",
|
||||||
"questNotOwned": "You don't own that quest scroll.",
|
"questNotOwned": "You don't own that quest scroll.",
|
||||||
"questLevelTooHigh": "You must be Level <%= level %> to begin this quest.",
|
"questLevelTooHigh": "You must be Level <%= level %> to begin this quest.",
|
||||||
"questAlreadyUnderway": "Your party is already on a quest. Try again when the current quest has ended."
|
"questAlreadyUnderway": "Your party is already on a quest. Try again when the current quest has ended.",
|
||||||
|
"questAlreadyAccepted": "You already accepted the quest invitation."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,37 @@
|
|||||||
import {
|
import {
|
||||||
createAndPopulateGroup,
|
createAndPopulateGroup,
|
||||||
translate as t,
|
translate as t,
|
||||||
|
generateUser,
|
||||||
} from '../../../../helpers/api-v3-integration.helper';
|
} from '../../../../helpers/api-v3-integration.helper';
|
||||||
|
|
||||||
describe.skip('POST /groups/:groupId/quests/accept', () => {
|
describe('POST /groups/:groupId/quests/accept', () => {
|
||||||
|
const PET_QUEST = 'whale';
|
||||||
|
|
||||||
let questingGroup;
|
let questingGroup;
|
||||||
let leader;
|
let leader;
|
||||||
let member;
|
let partyMembers;
|
||||||
|
let user;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
|
user = await generateUser();
|
||||||
|
|
||||||
let { group, groupLeader, members } = await createAndPopulateGroup({
|
let { group, groupLeader, members } = await createAndPopulateGroup({
|
||||||
groupDetails: { type: 'party', privacy: 'private' },
|
groupDetails: { type: 'party', privacy: 'private' },
|
||||||
members: 1,
|
members: 2,
|
||||||
});
|
});
|
||||||
|
|
||||||
questingGroup = group;
|
questingGroup = group;
|
||||||
leader = groupLeader;
|
leader = groupLeader;
|
||||||
member = members[0];
|
partyMembers = members;
|
||||||
|
|
||||||
|
await leader.update({
|
||||||
|
[`items.quests.${PET_QUEST}`]: 1,
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
context('failure conditions', () => {
|
context('failure conditions', () => {
|
||||||
it('does not accept quest without an invite', async () => {
|
it('does not accept quest without an invite', async () => {
|
||||||
await expect(leader.post(`/groups/${questingGroup._id}/quests/accept`, {}))
|
await expect(leader.post(`/groups/${questingGroup._id}/quests/accept`))
|
||||||
.to.eventually.be.rejected.and.eql({
|
.to.eventually.be.rejected.and.eql({
|
||||||
code: 404,
|
code: 404,
|
||||||
error: 'NotFound',
|
error: 'NotFound',
|
||||||
@@ -30,25 +40,80 @@ describe.skip('POST /groups/:groupId/quests/accept', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('does not accept quest for a group in which user is not a member', async () => {
|
it('does not accept quest for a group in which user is not a member', async () => {
|
||||||
await expect(member.post(`/groups/${questingGroup._id}/quests/accept`, {}))
|
await expect(user.post(`/groups/${questingGroup._id}/quests/accept`))
|
||||||
.to.eventually.be.rejected.and.eql({
|
.to.eventually.be.rejected.and.eql({
|
||||||
code: 404,
|
code: 404,
|
||||||
error: 'NotFound',
|
error: 'NotFound',
|
||||||
message: t('questInviteNotFound'),
|
message: t('groupNotFound'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not accept quest for a guild', async () => {
|
||||||
|
let { group: guild, groupLeader: guildLeader } = await createAndPopulateGroup({
|
||||||
|
groupDetails: { type: 'guild', privacy: 'private' },
|
||||||
|
});
|
||||||
|
|
||||||
|
await expect(guildLeader.post(`/groups/${guild._id}/quests/accept`))
|
||||||
|
.to.eventually.be.rejected.and.eql({
|
||||||
|
code: 401,
|
||||||
|
error: 'NotAuthorized',
|
||||||
|
message: t('guildQuestsNotSupported'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not accept invite twice', async () => {
|
||||||
|
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
|
||||||
|
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
|
||||||
|
|
||||||
|
await expect(partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`))
|
||||||
|
.to.eventually.be.rejected.and.eql({
|
||||||
|
code: 400,
|
||||||
|
error: 'BadRequest',
|
||||||
|
message: t('questAlreadyAccepted'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not accept invite for a quest already underway', async () => {
|
||||||
|
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
|
||||||
|
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
|
||||||
|
// quest will start after everyone has accepted
|
||||||
|
await partyMembers[1].post(`/groups/${questingGroup._id}/quests/accept`);
|
||||||
|
|
||||||
|
await expect(partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`))
|
||||||
|
.to.eventually.be.rejected.and.eql({
|
||||||
|
code: 401,
|
||||||
|
error: 'NotAuthorized',
|
||||||
|
message: t('questAlreadyUnderway'),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
context('successfully accepting a quest invitation', () => {
|
context('successfully accepting a quest invitation', () => {
|
||||||
it('joins a quest from an invitation', () => {
|
it('joins a quest from an invitation', async () => {
|
||||||
|
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
|
||||||
|
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
|
||||||
|
|
||||||
|
await Promise.all([partyMembers[0].sync(), questingGroup.sync()]);
|
||||||
|
expect(leader.party.quest.RSVPNeeded).to.equal(false);
|
||||||
|
expect(questingGroup.quest.members[partyMembers[0]._id]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does not begin the quest if pending invitations remain', () => {
|
it('does not begin the quest if pending invitations remain', async () => {
|
||||||
|
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
|
||||||
|
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
|
||||||
|
|
||||||
|
await questingGroup.sync();
|
||||||
|
expect(questingGroup.quest.active).to.equal(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('begins the quest if accepting the last pending invite', () => {
|
it('begins the quest if accepting the last pending invite', async () => {
|
||||||
|
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
|
||||||
|
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
|
||||||
|
// quest will start after everyone has accepted
|
||||||
|
await partyMembers[1].post(`/groups/${questingGroup._id}/quests/accept`);
|
||||||
|
|
||||||
|
await questingGroup.sync();
|
||||||
|
expect(questingGroup.quest.active).to.equal(true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import {
|
|||||||
import {
|
import {
|
||||||
NotFound,
|
NotFound,
|
||||||
NotAuthorized,
|
NotAuthorized,
|
||||||
|
BadRequest,
|
||||||
} from '../../libs/api-v3/errors';
|
} from '../../libs/api-v3/errors';
|
||||||
import {
|
import {
|
||||||
getUserInfo,
|
getUserInfo,
|
||||||
@@ -151,7 +152,10 @@ api.acceptQuest = {
|
|||||||
if (!group) throw new NotFound(res.t('groupNotFound'));
|
if (!group) throw new NotFound(res.t('groupNotFound'));
|
||||||
if (group.type !== 'party') throw new NotAuthorized(res.t('guildQuestsNotSupported'));
|
if (group.type !== 'party') throw new NotAuthorized(res.t('guildQuestsNotSupported'));
|
||||||
if (!group.quest.key) throw new NotFound(res.t('questInviteNotFound'));
|
if (!group.quest.key) throw new NotFound(res.t('questInviteNotFound'));
|
||||||
|
if (group.quest.active) throw new NotAuthorized(res.t('questAlreadyUnderway'));
|
||||||
|
if (group.quest.members[user._id]) throw new BadRequest(res.t('questAlreadyAccepted'));
|
||||||
|
|
||||||
|
group.markModified('quest');
|
||||||
group.quest.members[user._id] = true;
|
group.quest.members[user._id] = true;
|
||||||
user.party.quest.RSVPNeeded = false;
|
user.party.quest.RSVPNeeded = false;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user