From f8e56c02f043a134bc7d67ad43be06c5ed2cca04 Mon Sep 17 00:00:00 2001 From: Sabe Jones Date: Wed, 28 Feb 2024 14:31:05 -0600 Subject: [PATCH] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit d30dff2311087ff2fe5f3e2a913c594abeee6b0e Author: Sabe Jones Date: Tue Feb 27 16:01:11 2024 -0600 fix(challenge): move isOfficial to mount process commit ae52dca3cd0b4fd490f07b1979049803ce2f1e2f Merge: 2b20ff1e46 2c6e82a58a Author: Sabe Jones Date: Tue Feb 27 15:20:40 2024 -0600 Merge branch 'release' into phillip/challenges_official commit 2b20ff1e46b1447eac3f9dbdf29566154c9fa656 Author: Sabe Jones Date: Wed Feb 14 15:31:22 2024 -0600 fix(tests): correct lint and TypeError commit 5dae5c716f11db4c652e423eab43805ddfac3455 Merge: 29d9edc7aa 1a3c2f64e4 Author: Sabe Jones Date: Wed Feb 14 15:01:18 2024 -0600 Merge branch 'release' into phillip/challenges_official commit 29d9edc7aa7445d24f5be24ca923719a4ab5f70d Author: Sabe Jones Date: Wed Feb 14 14:41:16 2024 -0600 fix(challenges): don't momentarily show Report on official commit f994d12775107cba7ec816ee522cfeb0c69ef567 Author: Phillip Thelen Date: Tue Feb 13 10:08:08 2024 +0100 hide report button for official challenges commit ac06dcaca701b91913d5fc5307626b1616a9e0e8 Author: Phillip Thelen Date: Tue Feb 13 10:04:49 2024 +0100 prevent official challenges from being flagged commit a07ce1e6de66a2c833c6f392cf396a7743ca0f97 Author: Phillip Thelen Date: Mon Feb 5 19:12:17 2024 +0100 test shouldn’t be exclusive commit 4c2436a1a0fa905530b7e1cd66f75a2b07be5810 Author: Phillip Thelen Date: Mon Feb 5 19:11:20 2024 +0100 remove log commit 292f3a578d51fd08c572afc574cc73d08356f46a Author: Phillip Thelen Date: Mon Feb 5 19:10:13 2024 +0100 Automatically set official field on challenges if habitica_official cateogory is set --- .../challenges/POST-challenge_flag.test.js | 17 +++++ .../challenges/POST-challenges.test.js | 66 +++++++++++++++++++ .../components/challenges/challengeDetail.vue | 11 ++-- website/common/locales/en/challenge.json | 1 + website/server/libs/challenges/index.js | 8 +++ website/server/libs/challenges/reporting.js | 1 + 6 files changed, 99 insertions(+), 5 deletions(-) diff --git a/test/api/v3/integration/challenges/POST-challenge_flag.test.js b/test/api/v3/integration/challenges/POST-challenge_flag.test.js index adb2f37235..702d667e6b 100644 --- a/test/api/v3/integration/challenges/POST-challenge_flag.test.js +++ b/test/api/v3/integration/challenges/POST-challenge_flag.test.js @@ -7,6 +7,7 @@ import { describe('POST /challenges/:challengeId/flag', () => { let user; + let challengeGroup; let challenge; beforeEach(async () => { @@ -20,6 +21,7 @@ describe('POST /challenges/:challengeId/flag', () => { }); user = groupLeader; + challengeGroup = group; challenge = await generateChallenge(user, group); }); @@ -59,4 +61,19 @@ describe('POST /challenges/:challengeId/flag', () => { message: t('messageChallengeFlagAlreadyReported'), }); }); + + it('returns an error when user tries to flag an official challenge', async () => { + await user.updateOne({ + permissions: { + challengeAdmin: true, + }, + }); + challenge = await generateChallenge(user, challengeGroup, { official: true }); + await expect(user.post(`/challenges/${challenge._id}/flag`)) + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('messageChallengeFlagOfficial'), + }); + }); }); diff --git a/test/api/v3/integration/challenges/POST-challenges.test.js b/test/api/v3/integration/challenges/POST-challenges.test.js index e471e0c5f2..f74e7c7422 100644 --- a/test/api/v3/integration/challenges/POST-challenges.test.js +++ b/test/api/v3/integration/challenges/POST-challenges.test.js @@ -331,5 +331,71 @@ describe('POST /challenges', () => { expect(updatedChallenge.summary).to.eql(summary); }); + + it('sets categories for challenges', async () => { + const testCategory = { _id: '65c1172997c0b24600371ea9', slug: 'test', name: 'Test' }; + const challenge = await groupLeader.post('/challenges', { + group: group._id, + name: 'Test Challenge', + shortName: 'TC Label', + categories: [testCategory], + }); + + const updatedChallenge = await groupLeader.get(`/challenges/${challenge._id}`); + + expect(updatedChallenge.categories).to.eql([testCategory]); + }); + + it('does not set habitica_official category for non-admins', async () => { + const testCategory = { _id: '65c1172997c0b24600371ea9', slug: 'habitica_official', name: 'habitica_official' }; + await expect(groupLeader.post('/challenges', { + group: group._id, + name: 'Test Challenge', + shortName: 'TC Label', + categories: [testCategory], + })).to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('noPrivAccess'), + }); + }); + + it('sets habitica_official category for admins', async () => { + await groupLeader.updateOne({ + permissions: { + challengeAdmin: true, + }, + }); + + const testCategory = { _id: '65c1172997c0b24600371ea9', slug: 'habitica_official', name: 'habitica_official' }; + const challenge = await groupLeader.post('/challenges', { + group: group._id, + name: 'Test Challenge', + shortName: 'TC Label', + categories: [testCategory], + }); + + const updatedChallenge = await groupLeader.get(`/challenges/${challenge._id}`); + expect(updatedChallenge.categories).to.eql([testCategory]); + }); + + it('sets official if the habitica_official category is set for admins', async () => { + await groupLeader.updateOne({ + permissions: { + challengeAdmin: true, + }, + }); + + const testCategory = { _id: '65c1172997c0b24600371ea9', slug: 'habitica_official', name: 'habitica_official' }; + const challenge = await groupLeader.post('/challenges', { + group: group._id, + name: 'Test Challenge', + shortName: 'TC Label', + categories: [testCategory], + }); + + const updatedChallenge = await groupLeader.get(`/challenges/${challenge._id}`); + expect(updatedChallenge.official).to.eql(true); + }); }); }); diff --git a/website/client/src/components/challenges/challengeDetail.vue b/website/client/src/components/challenges/challengeDetail.vue index 12de0133b8..dac2c52a33 100644 --- a/website/client/src/components/challenges/challengeDetail.vue +++ b/website/client/src/components/challenges/challengeDetail.vue @@ -223,6 +223,7 @@