From 02a61e260b1854324036f5306c8989949cbf30b3 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Wed, 10 Feb 2016 16:10:00 +0100 Subject: [PATCH] add tests for GET challenges/:challengeId --- .../GET-challenges_challengeId.test.js | 139 ++++++++++++++++++ website/src/controllers/api-v3/challenges.js | 5 +- 2 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 test/api/v3/integration/challenges/GET-challenges_challengeId.test.js diff --git a/test/api/v3/integration/challenges/GET-challenges_challengeId.test.js b/test/api/v3/integration/challenges/GET-challenges_challengeId.test.js new file mode 100644 index 0000000000..8528fee892 --- /dev/null +++ b/test/api/v3/integration/challenges/GET-challenges_challengeId.test.js @@ -0,0 +1,139 @@ +import { + generateUser, + createAndPopulateGroup, + generateChallenge, + translate as t, +} from '../../../../helpers/api-v3-integration.helper'; +import { v4 as generateUUID } from 'uuid'; + +describe('GET /challenges/:challengeId', () => { + it('fails if challenge doesn\'t exists', async () => { + let user = await generateUser(); + await expect(user.get(`/challenges/${generateUUID()}`)).to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('challengeNotFound'), + }); + }); + + context('public guild', () => { + let groupLeader; + let group; + let challenge; + let user; + + beforeEach(async () => { + user = await generateUser(); + + let populatedGroup = await createAndPopulateGroup({ + groupDetails: {type: 'guild', privacy: 'public'}, + }); + + groupLeader = populatedGroup.groupLeader; + group = populatedGroup.group; + + challenge = await generateChallenge(groupLeader, group); + }); + + it('should return challenge data', async () => { + let chal = await user.get(`/challenges/${challenge._id}`); + expect(chal.memberCount).to.equal(challenge.memberCount); + expect(chal.name).to.equal(challenge.name); + expect(chal._id).to.equal(challenge._id); + + expect(chal.leader).to.eql({ + _id: groupLeader._id, + profile: {name: groupLeader.profile.name}, + }); + expect(chal.group).to.eql(_.pick(group, ['_id', 'name', 'type', 'privacy'])); + }); + }); + + context('private guild', () => { + let groupLeader; + let group; + let challenge; + let members; + let user; + + beforeEach(async () => { + user = await generateUser(); + + let populatedGroup = await createAndPopulateGroup({ + groupDetails: {type: 'guild', privacy: 'private'}, + members: 1, + }); + + groupLeader = populatedGroup.groupLeader; + group = populatedGroup.group; + members = populatedGroup.members; + + challenge = await generateChallenge(groupLeader, group); + await members[0].post(`/challenges/${challenge._id}/join`); + }); + + it('fails if user doesn\'t have access to the challenge', async () => { + await expect(user.get(`/challenges/${challenge._id}`)).to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('challengeNotFound'), + }); + }); + + it('should return challenge data', async () => { + let chal = await members[0].get(`/challenges/${challenge._id}`); + expect(chal.name).to.equal(challenge.name); + expect(chal._id).to.equal(challenge._id); + + expect(chal.leader).to.eql({ + _id: groupLeader._id, + profile: {name: groupLeader.profile.name}, + }); + expect(chal.group).to.eql(_.pick(group, ['_id', 'name', 'type', 'privacy'])); + }); + }); + + context('party', () => { + let groupLeader; + let group; + let challenge; + let members; + let user; + + beforeEach(async () => { + user = await generateUser(); + + let populatedGroup = await createAndPopulateGroup({ + groupDetails: {type: 'party'}, + members: 1, + }); + + groupLeader = populatedGroup.groupLeader; + group = populatedGroup.group; + members = populatedGroup.members; + + challenge = await generateChallenge(groupLeader, group); + await members[0].post(`/challenges/${challenge._id}/join`); + }); + + it('fails if user doesn\'t have access to the challenge', async () => { + await expect(user.get(`/challenges/${challenge._id}`)).to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('challengeNotFound'), + }); + }); + + it('should return challenge data', async () => { + let chal = await members[0].get(`/challenges/${challenge._id}`); + expect(chal.name).to.equal(challenge.name); + expect(chal._id).to.equal(challenge._id); + + expect(chal.leader).to.eql({ + _id: groupLeader._id, + profile: {name: groupLeader.profile.name}, + }); + expect(chal.group).to.eql(_.pick(group, ['_id', 'name', 'type', 'privacy'])); + }); + }); +}); diff --git a/website/src/controllers/api-v3/challenges.js b/website/src/controllers/api-v3/challenges.js index bc9e6f03b4..c239a63dd3 100644 --- a/website/src/controllers/api-v3/challenges.js +++ b/website/src/controllers/api-v3/challenges.js @@ -307,11 +307,12 @@ api.getChallenge = { let challengeId = req.params.challengeId; let challenge = await Challenge.findById(challengeId) - // .populate('leader', nameFields) // don't populate the group as we'll fetch it manually later + // Don't populate the group as we'll fetch it manually later + // .populate('leader', nameFields) .exec(); if (!challenge) throw new NotFound(res.t('challengeNotFound')); - // Fetching basicGroupFields + // Fetching basic group data let group = await Group.getGroup({user, groupId: challenge.group, fields: basicGroupFields, optionalMembership: true}); if (!group || !challenge.canView(user, group)) throw new NotFound(res.t('challengeNotFound'));