diff --git a/test/api/v3/integration/challenges/DELETE-challenges_challengeId.test.js b/test/api/v3/integration/challenges/DELETE-challenges_challengeId.test.js index 45dc91758a..e7263cbd59 100644 --- a/test/api/v3/integration/challenges/DELETE-challenges_challengeId.test.js +++ b/test/api/v3/integration/challenges/DELETE-challenges_challengeId.test.js @@ -41,6 +41,7 @@ describe('DELETE /challenges/:challengeId', () => { group = populatedGroup.group; challenge = await generateChallenge(groupLeader, group); + await groupLeader.post(`/challenges/${challenge._id}/join`); await groupLeader.post(`/tasks/challenge/${challenge._id}`, [ {type: 'habit', text: taskText}, diff --git a/test/api/v3/integration/challenges/GET-challenges_challengeId.test.js b/test/api/v3/integration/challenges/GET-challenges_challengeId.test.js index d39fce4505..21b8e92494 100644 --- a/test/api/v3/integration/challenges/GET-challenges_challengeId.test.js +++ b/test/api/v3/integration/challenges/GET-challenges_challengeId.test.js @@ -33,9 +33,11 @@ describe('GET /challenges/:challengeId', () => { group = populatedGroup.group; challenge = await generateChallenge(groupLeader, group); + await groupLeader.post(`/challenges/${challenge._id}/join`); }); it('should return challenge data', async () => { + await challenge.sync(); let chal = await user.get(`/challenges/${challenge._id}`); expect(chal.memberCount).to.equal(challenge.memberCount); expect(chal.name).to.equal(challenge.name); @@ -80,6 +82,7 @@ describe('GET /challenges/:challengeId', () => { challenge = await generateChallenge(groupLeader, group); await members[0].post(`/challenges/${challenge._id}/join`); + await groupLeader.post(`/challenges/${challenge._id}/join`); }); it('fails if user doesn\'t have access to the challenge', async () => { @@ -134,6 +137,7 @@ describe('GET /challenges/:challengeId', () => { challenge = await generateChallenge(groupLeader, group); await members[0].post(`/challenges/${challenge._id}/join`); + await groupLeader.post(`/challenges/${challenge._id}/join`); }); it('fails if user doesn\'t have access to the challenge', async () => { diff --git a/test/api/v3/integration/challenges/GET-challenges_challengeId_export_csv.test.js b/test/api/v3/integration/challenges/GET-challenges_challengeId_export_csv.test.js index a683513180..f39a148be0 100644 --- a/test/api/v3/integration/challenges/GET-challenges_challengeId_export_csv.test.js +++ b/test/api/v3/integration/challenges/GET-challenges_challengeId_export_csv.test.js @@ -24,6 +24,7 @@ describe('GET /challenges/:challengeId/export/csv', () => { members = populatedGroup.members; challenge = await generateChallenge(groupLeader, group); + await groupLeader.post(`/challenges/${challenge._id}/join`); await members[0].post(`/challenges/${challenge._id}/join`); await members[1].post(`/challenges/${challenge._id}/join`); await members[2].post(`/challenges/${challenge._id}/join`); diff --git a/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js b/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js index 0ea0c966aa..9d56bb53c3 100644 --- a/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js +++ b/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js @@ -45,6 +45,7 @@ describe('GET /challenges/:challengeId/members', () => { let leader = await generateUser({balance: 4}); let group = await generateGroup(leader, {type: 'guild', privacy: 'public', name: generateUUID()}); let challenge = await generateChallenge(leader, group); + await leader.post(`/challenges/${challenge._id}/join`); let res = await user.get(`/challenges/${challenge._id}/members`); expect(res[0]).to.eql({ _id: leader._id, @@ -59,6 +60,7 @@ describe('GET /challenges/:challengeId/members', () => { let anotherUser = await generateUser({balance: 3}); let group = await generateGroup(anotherUser, {type: 'guild', privacy: 'public', name: generateUUID()}); let challenge = await generateChallenge(anotherUser, group); + await anotherUser.post(`/challenges/${challenge._id}/join`); let res = await user.get(`/challenges/${challenge._id}/members`); expect(res[0]).to.eql({ _id: anotherUser._id, @@ -72,6 +74,7 @@ describe('GET /challenges/:challengeId/members', () => { it('returns only first 30 members if req.query.includeAllMembers is not true', async () => { let group = await generateGroup(user, {type: 'party', name: generateUUID()}); let challenge = await generateChallenge(user, group); + await user.post(`/challenges/${challenge._id}/join`); let usersToGenerate = []; for (let i = 0; i < 31; i++) { @@ -90,6 +93,7 @@ describe('GET /challenges/:challengeId/members', () => { it('returns only first 30 members if req.query.includeAllMembers is not defined', async () => { let group = await generateGroup(user, {type: 'party', name: generateUUID()}); let challenge = await generateChallenge(user, group); + await user.post(`/challenges/${challenge._id}/join`); let usersToGenerate = []; for (let i = 0; i < 31; i++) { @@ -108,6 +112,7 @@ describe('GET /challenges/:challengeId/members', () => { it('returns all members if req.query.includeAllMembers is true', async () => { let group = await generateGroup(user, {type: 'party', name: generateUUID()}); let challenge = await generateChallenge(user, group); + await user.post(`/challenges/${challenge._id}/join`); let usersToGenerate = []; for (let i = 0; i < 31; i++) { @@ -127,6 +132,7 @@ describe('GET /challenges/:challengeId/members', () => { this.timeout(30000); // @TODO: times out after 8 seconds let group = await generateGroup(user, {type: 'party', name: generateUUID()}); let challenge = await generateChallenge(user, group); + await user.post(`/challenges/${challenge._id}/join`); let usersToGenerate = []; for (let i = 0; i < 57; i++) { @@ -147,6 +153,7 @@ describe('GET /challenges/:challengeId/members', () => { it('supports using req.query.search to get search members', async () => { let group = await generateGroup(user, {type: 'party', name: generateUUID()}); let challenge = await generateChallenge(user, group); + await user.post(`/challenges/${challenge._id}/join`); let usersToGenerate = []; for (let i = 0; i < 3; i++) { diff --git a/test/api/v3/integration/challenges/GET-challenges_challengeId_members_memberId.test.js b/test/api/v3/integration/challenges/GET-challenges_challengeId_members_memberId.test.js index f2568dfd44..5154cdcaad 100644 --- a/test/api/v3/integration/challenges/GET-challenges_challengeId_members_memberId.test.js +++ b/test/api/v3/integration/challenges/GET-challenges_challengeId_members_memberId.test.js @@ -50,6 +50,7 @@ describe('GET /challenges/:challengeId/members/:memberId', () => { it('fails if user doesn\'t have access to the challenge', async () => { let group = await generateGroup(user, {type: 'party', name: generateUUID()}); let challenge = await generateChallenge(user, group); + await user.post(`/challenges/${challenge._id}/join`); let anotherUser = await generateUser(); let member = await generateUser(); await expect(anotherUser.get(`/challenges/${challenge._id}/members/${member._id}`)).to.eventually.be.rejected.and.eql({ @@ -62,6 +63,7 @@ describe('GET /challenges/:challengeId/members/:memberId', () => { it('fails if member is not part of the challenge', async () => { let group = await generateGroup(user, {type: 'party', name: generateUUID()}); let challenge = await generateChallenge(user, group); + await user.post(`/challenges/${challenge._id}/join`); let member = await generateUser(); await expect(user.get(`/challenges/${challenge._id}/members/${member._id}`)).to.eventually.be.rejected.and.eql({ code: 404, @@ -74,6 +76,7 @@ describe('GET /challenges/:challengeId/members/:memberId', () => { let groupLeader = await generateUser({balance: 4}); let group = await generateGroup(groupLeader, {type: 'guild', privacy: 'public', name: generateUUID()}); let challenge = await generateChallenge(groupLeader, group); + await groupLeader.post(`/challenges/${challenge._id}/join`); let taskText = 'Test Text'; await groupLeader.post(`/tasks/challenge/${challenge._id}`, [{type: 'habit', text: taskText}]); @@ -86,6 +89,7 @@ describe('GET /challenges/:challengeId/members/:memberId', () => { it('returns the member tasks for the challenges', async () => { let group = await generateGroup(user, {type: 'party', name: generateUUID()}); let challenge = await generateChallenge(user, group); + await user.post(`/challenges/${challenge._id}/join`); await user.post(`/tasks/challenge/${challenge._id}`, [{type: 'habit', text: 'Test Text'}]); let memberProgress = await user.get(`/challenges/${challenge._id}/members/${user._id}`); @@ -98,6 +102,7 @@ describe('GET /challenges/:challengeId/members/:memberId', () => { it('returns the tasks without the tags and checklist', async () => { let group = await generateGroup(user, {type: 'party', name: generateUUID()}); let challenge = await generateChallenge(user, group); + await user.post(`/challenges/${challenge._id}/join`); let taskText = 'Test Text'; await user.post(`/tasks/challenge/${challenge._id}`, [{ type: 'todo', diff --git a/test/api/v3/integration/challenges/GET-challenges_group_groupid.test.js b/test/api/v3/integration/challenges/GET-challenges_group_groupid.test.js index f1c73907bf..6521d34677 100644 --- a/test/api/v3/integration/challenges/GET-challenges_group_groupid.test.js +++ b/test/api/v3/integration/challenges/GET-challenges_group_groupid.test.js @@ -25,7 +25,9 @@ describe('GET challenges/groups/:groupId', () => { 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 () => { @@ -73,6 +75,7 @@ describe('GET challenges/groups/:groupId', () => { expect(foundChallengeIndex).to.eql(0); let newChallenge = await generateChallenge(user, publicGuild); + await user.post(`/challenges/${newChallenge._id}/join`); challenges = await user.get(`/challenges/groups/${publicGuild._id}`); @@ -99,7 +102,9 @@ describe('GET challenges/groups/:groupId', () => { 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 () => { @@ -156,9 +161,12 @@ describe('GET challenges/groups/:groupId', () => { slug: 'habitica_official', }], }); + await user.post(`/challenges/${officialChallenge._id}/join`); 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 official challenges first', async () => { @@ -178,6 +186,7 @@ describe('GET challenges/groups/:groupId', () => { expect(foundChallengeIndex).to.eql(1); let newChallenge = await generateChallenge(user, publicGuild); + await user.post(`/challenges/${newChallenge._id}/join`); challenges = await user.get(`/challenges/groups/${publicGuild._id}`); @@ -203,7 +212,9 @@ describe('GET challenges/groups/:groupId', () => { 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 () => { @@ -263,7 +274,9 @@ describe('GET challenges/groups/:groupId', () => { 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 () => { diff --git a/test/api/v3/integration/challenges/GET-challenges_user.test.js b/test/api/v3/integration/challenges/GET-challenges_user.test.js index d455d7c21a..cbcacfe3a7 100644 --- a/test/api/v3/integration/challenges/GET-challenges_user.test.js +++ b/test/api/v3/integration/challenges/GET-challenges_user.test.js @@ -24,7 +24,9 @@ describe('GET challenges/user', () => { 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 challenges user has joined', async () => { @@ -146,6 +148,7 @@ describe('GET challenges/user', () => { expect(foundChallengeIndex).to.eql(0); let newChallenge = await generateChallenge(user, publicGuild); + await user.post(`/challenges/${newChallenge._id}/join`); challenges = await user.get('/challenges/user'); @@ -164,6 +167,7 @@ describe('GET challenges/user', () => { }); let privateChallenge = await generateChallenge(groupLeader, group); + await groupLeader.post(`/challenges/${privateChallenge._id}/join`); let challenges = await nonMember.get('/challenges/user'); @@ -198,9 +202,12 @@ describe('GET challenges/user', () => { slug: 'habitica_official', }], }); + await user.post(`/challenges/${officialChallenge._id}/join`); 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 official challenges first', async () => { @@ -220,6 +227,7 @@ describe('GET challenges/user', () => { expect(foundChallengeIndex).to.eql(1); let newChallenge = await generateChallenge(user, publicGuild); + await user.post(`/challenges/${newChallenge._id}/join`); challenges = await user.get('/challenges/user'); @@ -252,12 +260,14 @@ describe('GET challenges/user', () => { await user.update({balance: 20}); for (let i = 0; i < 11; i += 1) { - await generateChallenge(user, group); // eslint-disable-line + let challenge = await generateChallenge(user, group); // eslint-disable-line + await user.post(`/challenges/${challenge._id}/join`); // eslint-disable-line } }); it('returns public guilds filtered by category', async () => { const categoryChallenge = await generateChallenge(user, guild, {categories}); + await user.post(`/challenges/${categoryChallenge._id}/join`); const challenges = await user.get(`/challenges/user?categories=${categories[0].slug}`); expect(challenges[0]._id).to.eql(categoryChallenge._id); diff --git a/test/api/v3/integration/challenges/POST-challenges.test.js b/test/api/v3/integration/challenges/POST-challenges.test.js index 92f58c29cc..1fbd0fd768 100644 --- a/test/api/v3/integration/challenges/POST-challenges.test.js +++ b/test/api/v3/integration/challenges/POST-challenges.test.js @@ -242,7 +242,6 @@ describe('POST /challenges', () => { it('returns an error when challenge validation fails; doesn\'s save user or group', async () => { let oldChallengeCount = group.challengeCount; let oldUserBalance = groupLeader.balance; - let oldUserChallenges = groupLeader.challenges; let oldGroupBalance = group.balance; await expect(groupLeader.post('/challenges', { @@ -260,7 +259,6 @@ describe('POST /challenges', () => { expect(group.challengeCount).to.eql(oldChallengeCount); expect(group.balance).to.eql(oldGroupBalance); expect(groupLeader.balance).to.eql(oldUserBalance); - expect(groupLeader.challenges).to.eql(oldUserChallenges); }); it('sets all properites of the challenge as passed', async () => { @@ -291,18 +289,19 @@ describe('POST /challenges', () => { name: group.name, type: group.type, }); - expect(challenge.memberCount).to.eql(1); + expect(challenge.memberCount).to.eql(0); expect(challenge.prize).to.eql(prize); }); - it('adds challenge to creator\'s challenges', async () => { - let challenge = await groupLeader.post('/challenges', { + it('does not add challenge to creator\'s challenges', async () => { + await groupLeader.post('/challenges', { group: group._id, name: 'Test Challenge', shortName: 'TC Label', }); - await expect(groupLeader.sync()).to.eventually.have.property('challenges').to.include(challenge._id); + await groupLeader.sync(); + expect(groupLeader.challenges.length).to.equal(0); }); it('awards achievement if this is creator\'s first challenge', async () => { diff --git a/test/api/v3/integration/challenges/POST-challenges_challengeId_join.test.js b/test/api/v3/integration/challenges/POST-challenges_challengeId_join.test.js index 1f7ef43d6b..734a578d1e 100644 --- a/test/api/v3/integration/challenges/POST-challenges_challengeId_join.test.js +++ b/test/api/v3/integration/challenges/POST-challenges_challengeId_join.test.js @@ -43,6 +43,7 @@ describe('POST /challenges/:challengeId/join', () => { authorizedUser = populatedGroup.members[0]; challenge = await generateChallenge(groupLeader, group); + await groupLeader.post(`/challenges/${challenge._id}/join`); }); it('returns an error when user doesn\'t have permissions to access the challenge', async () => { @@ -91,6 +92,7 @@ describe('POST /challenges/:challengeId/join', () => { }); it('increases memberCount of challenge', async () => { + await challenge.sync(); let oldMemberCount = challenge.memberCount; await authorizedUser.post(`/challenges/${challenge._id}/join`); diff --git a/test/api/v3/integration/challenges/POST-challenges_challengeId_leave.test.js b/test/api/v3/integration/challenges/POST-challenges_challengeId_leave.test.js index 7324747b66..dd81daf75d 100644 --- a/test/api/v3/integration/challenges/POST-challenges_challengeId_leave.test.js +++ b/test/api/v3/integration/challenges/POST-challenges_challengeId_leave.test.js @@ -48,6 +48,7 @@ describe('POST /challenges/:challengeId/leave', () => { notInGroupLeavingUser = populatedGroup.members[2]; challenge = await generateChallenge(groupLeader, group); + await groupLeader.post(`/challenges/${challenge._id}/join`); taskText = 'A challenge task text'; diff --git a/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js b/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js index 19e8deaf12..43187b9c61 100644 --- a/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js +++ b/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js @@ -58,6 +58,7 @@ describe('POST /challenges/:challengeId/winner/:winnerId', () => { challenge = await generateChallenge(groupLeader, group, { prize: 1, }); + await groupLeader.post(`/challenges/${challenge._id}/join`); await groupLeader.post(`/tasks/challenge/${challenge._id}`, [ {type: 'habit', text: taskText}, diff --git a/test/api/v3/integration/challenges/PUT-challenges_challengeId.test.js b/test/api/v3/integration/challenges/PUT-challenges_challengeId.test.js index 1fdcc7a5a2..dce90f0cbd 100644 --- a/test/api/v3/integration/challenges/PUT-challenges_challengeId.test.js +++ b/test/api/v3/integration/challenges/PUT-challenges_challengeId.test.js @@ -25,6 +25,7 @@ describe('PUT /challenges/:challengeId', () => { member = members[0]; challenge = await generateChallenge(user, group); + await user.post(`/challenges/${challenge._id}/join`); await member.post(`/challenges/${challenge._id}/join`); }); diff --git a/test/api/v3/integration/groups/POST-groups_groupId_leave.js b/test/api/v3/integration/groups/POST-groups_groupId_leave.js index 2afa2dcc02..fd19052a17 100644 --- a/test/api/v3/integration/groups/POST-groups_groupId_leave.js +++ b/test/api/v3/integration/groups/POST-groups_groupId_leave.js @@ -93,6 +93,7 @@ describe('POST /groups/:groupId/leave', () => { beforeEach(async () => { challenge = await generateChallenge(leader, groupToLeave); + await leader.post(`/challenges/${challenge._id}/join`); await leader.post(`/tasks/challenge/${challenge._id}`, { text: 'test habit', diff --git a/test/api/v3/integration/tasks/DELETE-tasks_id.test.js b/test/api/v3/integration/tasks/DELETE-tasks_id.test.js index 2f2c174973..fadf21973e 100644 --- a/test/api/v3/integration/tasks/DELETE-tasks_id.test.js +++ b/test/api/v3/integration/tasks/DELETE-tasks_id.test.js @@ -92,6 +92,7 @@ describe('DELETE /tasks/:id', () => { }); let guild = await generateGroup(user); let challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); await user.post('/user/webhook', { url: `http://localhost:${server.port}/webhooks/${uuid}`, diff --git a/test/api/v3/integration/tasks/GET-tasks_challenge_challengeId.test.js b/test/api/v3/integration/tasks/GET-tasks_challenge_challengeId.test.js index 3fed4cfaed..b1865f8008 100644 --- a/test/api/v3/integration/tasks/GET-tasks_challenge_challengeId.test.js +++ b/test/api/v3/integration/tasks/GET-tasks_challenge_challengeId.test.js @@ -40,6 +40,7 @@ describe('GET /tasks/:taskId', () => { user = await generateUser(); guild = await generateGroup(user); challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); }); it('returns error when incorrect id is passed', async () => { diff --git a/test/api/v3/integration/tasks/POST-tasks_clearCompletedTodos.test.js b/test/api/v3/integration/tasks/POST-tasks_clearCompletedTodos.test.js index 7cdd7753d2..2014b1c65c 100644 --- a/test/api/v3/integration/tasks/POST-tasks_clearCompletedTodos.test.js +++ b/test/api/v3/integration/tasks/POST-tasks_clearCompletedTodos.test.js @@ -9,6 +9,7 @@ describe('POST /tasks/clearCompletedTodos', () => { let user = await generateUser({balance: 1}); let guild = await generateGroup(user); let challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); let initialTodoCount = user.tasksOrder.todos.length; await user.post('/tasks/user', [ diff --git a/test/api/v3/integration/tasks/POST-tasks_unlink-all_challengeId.test.js b/test/api/v3/integration/tasks/POST-tasks_unlink-all_challengeId.test.js index cd8bec5acc..c1dfd6a522 100644 --- a/test/api/v3/integration/tasks/POST-tasks_unlink-all_challengeId.test.js +++ b/test/api/v3/integration/tasks/POST-tasks_unlink-all_challengeId.test.js @@ -37,6 +37,7 @@ describe('POST /tasks/unlink-all/:challengeId', () => { user = await generateUser(); guild = await generateGroup(user); challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); }); it('fails if no keep query', async () => { diff --git a/test/api/v3/integration/tasks/POST-tasks_unlink-one_taskId.test.js b/test/api/v3/integration/tasks/POST-tasks_unlink-one_taskId.test.js index fb67ec1451..aefc379865 100644 --- a/test/api/v3/integration/tasks/POST-tasks_unlink-one_taskId.test.js +++ b/test/api/v3/integration/tasks/POST-tasks_unlink-one_taskId.test.js @@ -38,6 +38,7 @@ describe('POST /tasks/unlink-one/:taskId', () => { user = await generateUser(); guild = await generateGroup(user); challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); }); it('fails if no keep query', async () => { diff --git a/test/api/v3/integration/tasks/PUT-tasks_id.test.js b/test/api/v3/integration/tasks/PUT-tasks_id.test.js index d7cc313f35..ad1555237c 100644 --- a/test/api/v3/integration/tasks/PUT-tasks_id.test.js +++ b/test/api/v3/integration/tasks/PUT-tasks_id.test.js @@ -65,6 +65,7 @@ describe('PUT /tasks/:id', () => { fields for challenge tasks owned by a user`, async () => { let guild = await generateGroup(user); let challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); let challengeTask = await user.post(`/tasks/challenge/${challenge._id}`, { type: 'daily', @@ -198,6 +199,7 @@ describe('PUT /tasks/:id', () => { }); let guild = await generateGroup(user); let challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); await user.post('/user/webhook', { url: `http://localhost:${server.port}/webhooks/${uuid}`, diff --git a/test/api/v3/integration/tasks/challenges/DELETE-tasks_challenge_challengeId_checklist_itemId.test.js b/test/api/v3/integration/tasks/challenges/DELETE-tasks_challenge_challengeId_checklist_itemId.test.js index eac6d455ea..5cdbce319b 100644 --- a/test/api/v3/integration/tasks/challenges/DELETE-tasks_challenge_challengeId_checklist_itemId.test.js +++ b/test/api/v3/integration/tasks/challenges/DELETE-tasks_challenge_challengeId_checklist_itemId.test.js @@ -15,6 +15,7 @@ describe('DELETE /tasks/:taskId/checklist/:itemId', () => { user = await generateUser(); guild = await generateGroup(user); challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); }); it('fails on task not found', async () => { diff --git a/test/api/v3/integration/tasks/challenges/DELETE-tasks_id_challenge_challengeId.test.js b/test/api/v3/integration/tasks/challenges/DELETE-tasks_id_challenge_challengeId.test.js index 34c93c2f05..44478e67b6 100644 --- a/test/api/v3/integration/tasks/challenges/DELETE-tasks_id_challenge_challengeId.test.js +++ b/test/api/v3/integration/tasks/challenges/DELETE-tasks_id_challenge_challengeId.test.js @@ -17,6 +17,7 @@ describe('DELETE /tasks/:id', () => { user = await generateUser(); guild = await generateGroup(user); challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); }); beforeEach(async () => { diff --git a/test/api/v3/integration/tasks/challenges/GET_tasks_challenge.id.test.js b/test/api/v3/integration/tasks/challenges/GET_tasks_challenge.id.test.js index 2399db04b6..8947db4929 100644 --- a/test/api/v3/integration/tasks/challenges/GET_tasks_challenge.id.test.js +++ b/test/api/v3/integration/tasks/challenges/GET_tasks_challenge.id.test.js @@ -42,6 +42,7 @@ describe('GET /tasks/challenge/:challengeId', () => { user = await generateUser(); guild = await generateGroup(user); challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); }); it('returns error when challenge is not found', async () => { diff --git a/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_challengeId_taskId_checklist.test.js b/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_challengeId_taskId_checklist.test.js index ec4d09f7b3..fcf4323f8f 100644 --- a/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_challengeId_taskId_checklist.test.js +++ b/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_challengeId_taskId_checklist.test.js @@ -15,6 +15,7 @@ describe('POST /tasks/:taskId/checklist/', () => { user = await generateUser(); guild = await generateGroup(user); challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); }); it('fails on task not found', async () => { diff --git a/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_id.test.js b/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_id.test.js index b17672d2d6..afe68c28bb 100644 --- a/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_id.test.js +++ b/test/api/v3/integration/tasks/challenges/POST-tasks_challenge_id.test.js @@ -20,6 +20,7 @@ describe('POST /tasks/challenge/:challengeId', () => { user = await generateUser({balance: 1}); guild = await generateGroup(user); challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); }); it('returns error when challenge is not found', async () => { diff --git a/test/api/v3/integration/tasks/challenges/POST-tasks_challenges_challengeId_tasks_id_score_direction.test.js b/test/api/v3/integration/tasks/challenges/POST-tasks_challenges_challengeId_tasks_id_score_direction.test.js index 66c868a62e..d65b931056 100644 --- a/test/api/v3/integration/tasks/challenges/POST-tasks_challenges_challengeId_tasks_id_score_direction.test.js +++ b/test/api/v3/integration/tasks/challenges/POST-tasks_challenges_challengeId_tasks_id_score_direction.test.js @@ -15,6 +15,7 @@ describe('POST /tasks/:id/score/:direction', () => { user = await generateUser(); guild = await generateGroup(user); challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); }); context('habits', () => { diff --git a/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId.test.js b/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId.test.js index 94d96367b8..2a5fe64d25 100644 --- a/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId.test.js +++ b/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId.test.js @@ -15,6 +15,7 @@ describe('PUT /tasks/:id', () => { user = await generateUser(); guild = await generateGroup(user); challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); }); context('errors', () => { diff --git a/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId_tasksId_checklist_itemId.test.js b/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId_tasksId_checklist_itemId.test.js index cce7ce79f3..19e72e9617 100644 --- a/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId_tasksId_checklist_itemId.test.js +++ b/test/api/v3/integration/tasks/challenges/PUT-tasks_challenge_challengeId_tasksId_checklist_itemId.test.js @@ -15,6 +15,7 @@ describe('PUT /tasks/:taskId/checklist/:itemId', () => { user = await generateUser(); guild = await generateGroup(user); challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); }); it('fails on task not found', async () => { diff --git a/test/api/v3/integration/user/DELETE-user.test.js b/test/api/v3/integration/user/DELETE-user.test.js index ea9b79f92a..2fbe493d43 100644 --- a/test/api/v3/integration/user/DELETE-user.test.js +++ b/test/api/v3/integration/user/DELETE-user.test.js @@ -117,6 +117,7 @@ describe('DELETE /user', () => { let authorizedUser = populatedGroup.members[1]; let challenge = await generateChallenge(populatedGroup.groupLeader, group); + await populatedGroup.groupLeader.post(`/challenges/${challenge._id}/join`); await authorizedUser.post(`/challenges/${challenge._id}/join`); await challenge.sync(); diff --git a/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js b/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js index f95f8c030d..0700122c15 100644 --- a/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js +++ b/test/api/v3/integration/user/POST-user_class_cast_spellId.test.js @@ -109,6 +109,7 @@ describe('POST /user/class/cast/:spellId', () => { it('returns an error if a challenge task was targeted', async () => { let {group, groupLeader} = await createAndPopulateGroup(); let challenge = await generateChallenge(groupLeader, group); + await groupLeader.post(`/challenges/${challenge._id}/join`); await groupLeader.post(`/tasks/challenge/${challenge._id}`, [ {type: 'habit', text: 'task text'}, ]); @@ -238,6 +239,7 @@ describe('POST /user/class/cast/:spellId', () => { it('searing brightness does not affect challenge or group tasks', async () => { let guild = await generateGroup(user); let challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); await user.post(`/tasks/challenge/${challenge._id}`, { text: 'test challenge habit', type: 'habit', diff --git a/test/api/v3/integration/user/POST-user_reset.test.js b/test/api/v3/integration/user/POST-user_reset.test.js index cac12d6d9c..902dd7cd65 100644 --- a/test/api/v3/integration/user/POST-user_reset.test.js +++ b/test/api/v3/integration/user/POST-user_reset.test.js @@ -90,6 +90,7 @@ describe('POST /user/reset', () => { it('does not delete challenge or group tasks', async () => { let guild = await generateGroup(user); let challenge = await generateChallenge(user, guild); + await user.post(`/challenges/${challenge._id}/join`); await user.post(`/tasks/challenge/${challenge._id}`, { text: 'test challenge habit', type: 'habit', diff --git a/website/client/store/actions/challenges.js b/website/client/store/actions/challenges.js index dfb01d7b65..3fdc8b43a4 100644 --- a/website/client/store/actions/challenges.js +++ b/website/client/store/actions/challenges.js @@ -6,15 +6,13 @@ export async function createChallenge (store, payload) { let response = await axios.post('/api/v3/challenges', payload.challenge); let newChallenge = response.data.data; - store.state.user.data.challenges.push(newChallenge._id); - return newChallenge; } export async function cloneChallenge (store, payload) { const response = await axios.post(`/api/v3/challenges/${payload.cloningChallengeId}/clone`, payload.challenge); const newChallenge = response.data.data.clonedChallenge; - store.state.user.data.challenges.push(newChallenge._id); + return newChallenge; } diff --git a/website/server/libs/challenges/index.js b/website/server/libs/challenges/index.js index 00bcf9d8cc..9feb91b925 100644 --- a/website/server/libs/challenges/index.js +++ b/website/server/libs/challenges/index.js @@ -82,12 +82,10 @@ export async function createChallenge (user, req, res) { addUserJoinChallengeNotification(user); let results = await Promise.all([challenge.save({ - validateBeforeSave: false, // already validate - }), group.save()]); + validateBeforeSave: false, // already validated + }), group.save(), user.save()]); let savedChal = results[0]; - await savedChal.syncToUser(user); // (it also saves the user) - return {savedChal, group}; } diff --git a/website/server/models/challenge.js b/website/server/models/challenge.js index 6d16d3b7ec..a094814fe7 100644 --- a/website/server/models/challenge.js +++ b/website/server/models/challenge.js @@ -33,7 +33,7 @@ let schema = new Schema({ }, leader: {type: String, ref: 'User', validate: [validator.isUUID, 'Invalid uuid.'], required: true}, group: {type: String, ref: 'Group', validate: [validator.isUUID, 'Invalid uuid.'], required: true}, - memberCount: {type: Number, default: 1}, + memberCount: {type: Number, default: 0}, prize: {type: Number, default: 0, min: 0}, categories: [{ slug: {type: String},