import { generateUser, generateChallenge, createAndPopulateGroup, translate as t, } from '../../../../helpers/api-integration/v3'; import { TAVERN_ID } from '../../../../../website/common/script/constants'; describe('GET challenges/groups/:groupId', () => { context('Public Guild', () => { let publicGuild; let user; let nonMember; let challenge; let challenge2; before(async () => { const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'TestGuild', type: 'guild', privacy: 'public', }, }); publicGuild = group; user = groupLeader; nonMember = await generateUser(); challenge = await generateChallenge(user, group); await user.post(`/challenges/${challenge._id}/join`); challenge2 = await generateChallenge(user, group); await user.post(`/challenges/${challenge2._id}/join`); }); it('should return group challenges for non member with populated leader', async () => { const challenges = await nonMember.get(`/challenges/groups/${publicGuild._id}`); const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: publicGuild.leader._id, id: publicGuild.leader._id, profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, }, }, flags: { verifiedUsername: true, }, }); const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: publicGuild.leader._id, id: publicGuild.leader._id, profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, }, }, flags: { verifiedUsername: true, }, }); }); it('should return group challenges for member with populated leader', async () => { const challenges = await user.get(`/challenges/groups/${publicGuild._id}`); const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: publicGuild.leader._id, id: publicGuild.leader._id, profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, }, }, flags: { verifiedUsername: true, }, }); const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: publicGuild.leader._id, id: publicGuild.leader._id, profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, }, }, flags: { verifiedUsername: true, }, }); }); it('should return newest challenges first', async () => { let challenges = await user.get(`/challenges/groups/${publicGuild._id}`); let foundChallengeIndex = _.findIndex(challenges, { _id: challenge2._id }); expect(foundChallengeIndex).to.eql(0); const newChallenge = await generateChallenge(user, publicGuild); await user.post(`/challenges/${newChallenge._id}/join`); challenges = await user.get(`/challenges/groups/${publicGuild._id}`); foundChallengeIndex = _.findIndex(challenges, { _id: newChallenge._id }); expect(foundChallengeIndex).to.eql(0); }); }); context('Private Guild', () => { let privateGuild; let user; let nonMember; let challenge; let challenge2; before(async () => { const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'TestPrivateGuild', type: 'guild', privacy: 'private', }, }); privateGuild = group; user = groupLeader; nonMember = await generateUser(); challenge = await generateChallenge(user, group); await user.post(`/challenges/${challenge._id}/join`); challenge2 = await generateChallenge(user, group); await user.post(`/challenges/${challenge2._id}/join`); }); it('should prevent non-member from seeing challenges', async () => { await expect(nonMember.get(`/challenges/groups/${privateGuild._id}`)) .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', message: t('groupNotFound'), }); }); it('should return group challenges for member with populated leader', async () => { const challenges = await user.get(`/challenges/groups/${privateGuild._id}`); const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: privateGuild.leader._id, id: privateGuild.leader._id, profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, }, }, flags: { verifiedUsername: true, }, }); const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: privateGuild.leader._id, id: privateGuild.leader._id, profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, }, }, flags: { verifiedUsername: true, }, }); }); }); context('official challenge is present', () => { let publicGuild; let user; let officialChallenge; let unofficialChallenges; before(async () => { const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'TestGuild', type: 'guild', privacy: 'public', }, }); user = groupLeader; publicGuild = group; await user.update({ 'permissions.challengeAdmin': true, }); officialChallenge = await generateChallenge(user, group, { categories: [{ name: 'habitica_official', slug: 'habitica_official', }], }); await user.post(`/challenges/${officialChallenge._id}/join`); // We add 10 extra challenges to test whether the official challenge // (the oldest) makes it to the front page. unofficialChallenges = []; for (let i = 0; i < 10; i += 1) { const challenge = await generateChallenge(user, group); // eslint-disable-line await user.post(`/challenges/${challenge._id}/join`); // eslint-disable-line unofficialChallenges.push(challenge); } }); it('should return official challenges first', async () => { const challenges = await user.get(`/challenges/groups/${publicGuild._id}`); const foundChallengeIndex = _.findIndex(challenges, { _id: officialChallenge._id }); expect(foundChallengeIndex).to.eql(0); }); it('should return newest challenges first, after official ones', async () => { let challenges = await user.get(`/challenges/groups/${publicGuild._id}`); unofficialChallenges.forEach((chal, index) => { const foundChallengeIndex = _.findIndex(challenges, { _id: chal._id }); expect(foundChallengeIndex).to.eql(10 - index); }); const newChallenge = await generateChallenge(user, publicGuild); await user.post(`/challenges/${newChallenge._id}/join`); challenges = await user.get(`/challenges/groups/${publicGuild._id}`); const foundChallengeIndex = _.findIndex(challenges, { _id: newChallenge._id }); expect(foundChallengeIndex).to.eql(1); }); }); context('Party', () => { let party; let user; let nonMember; let challenge; let challenge2; before(async () => { const { group, groupLeader } = await createAndPopulateGroup({ groupDetails: { name: 'TestParty', type: 'party', }, }); party = group; user = groupLeader; nonMember = await generateUser(); challenge = await generateChallenge(user, group); await user.post(`/challenges/${challenge._id}/join`); challenge2 = await generateChallenge(user, group); await user.post(`/challenges/${challenge2._id}/join`); }); it('should prevent non-member from seeing challenges', async () => { await expect(nonMember.get(`/challenges/groups/${party._id}`)) .to.eventually.be.rejected.and.eql({ code: 404, error: 'NotFound', message: t('groupNotFound'), }); }); it('should return group challenges for member with populated leader', async () => { const challenges = await user.get(`/challenges/groups/${party._id}`); const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: party.leader._id, id: party.leader._id, profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, }, }, flags: { verifiedUsername: true, }, }); const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: party.leader._id, id: party.leader._id, profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, }, }, flags: { verifiedUsername: true, }, }); }); it('should return group challenges for member using ID "party"', async () => { const challenges = await user.get('/challenges/groups/party'); const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: party.leader._id, id: party.leader._id, profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, }, }, flags: { verifiedUsername: true, }, }); const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: party.leader._id, id: party.leader._id, profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, }, }, flags: { verifiedUsername: true, }, }); }); }); context('Tavern', () => { let tavern; let user; let challenge; let challenge2; before(async () => { user = await generateUser(); await user.update({ balance: 0.5 }); tavern = await user.get(`/groups/${TAVERN_ID}`); challenge = await generateChallenge(user, tavern, { prize: 1 }); await user.post(`/challenges/${challenge._id}/join`); challenge2 = await generateChallenge(user, tavern, { prize: 1 }); await user.post(`/challenges/${challenge2._id}/join`); }); it('should return tavern challenges with populated leader', async () => { const challenges = await user.get(`/challenges/groups/${TAVERN_ID}`); const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: user._id, id: user._id, profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, }, }, flags: { verifiedUsername: true, }, }); const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: user._id, id: user._id, profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, }, }, flags: { verifiedUsername: true, }, }); }); it('should return tavern challenges using ID "habitrpg', async () => { const challenges = await user.get('/challenges/groups/habitrpg'); const foundChallenge1 = _.find(challenges, { _id: challenge._id }); expect(foundChallenge1).to.exist; expect(foundChallenge1.leader).to.eql({ _id: user._id, id: user._id, profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, }, }, flags: { verifiedUsername: true, }, }); const foundChallenge2 = _.find(challenges, { _id: challenge2._id }); expect(foundChallenge2).to.exist; expect(foundChallenge2.leader).to.eql({ _id: user._id, id: user._id, profile: { name: user.profile.name }, auth: { local: { username: user.auth.local.username, }, }, flags: { verifiedUsername: true, }, }); }); }); });