diff --git a/test/api/v3/integration/challenges/POST-challenge_flag.test.js b/test/api/v3/integration/challenges/POST-challenge_flag.test.js new file mode 100644 index 0000000000..0f5f353b6c --- /dev/null +++ b/test/api/v3/integration/challenges/POST-challenge_flag.test.js @@ -0,0 +1,62 @@ +import { v4 as generateUUID } from 'uuid'; +import { + generateChallenge, + createAndPopulateGroup, + translate as t, +} from '../../../../helpers/api-integration/v3'; + +describe('POST /challenges/:challengeId/flag', () => { + let user; + let challenge; + + beforeEach(async () => { + const { group, groupLeader } = await createAndPopulateGroup({ + groupDetails: { + name: 'TestParty', + type: 'party', + privacy: 'private', + }, + members: 1, + }); + + user = groupLeader; + + challenge = await generateChallenge(user, group); + }); + + it('returns an error when challenge is not found', async () => { + await expect(user.post(`/challenges/${generateUUID()}/flag`)) + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('challengeNotFound'), + }); + }); + + it('flags a challenge', async () => { + const flagResult = await user.post(`/challenges/${challenge._id}/flag`); + + expect(flagResult.challenge.flags[user._id]).to.equal(true); + expect(flagResult.challenge.flagCount).to.equal(1); + }); + + it('flags a challenge with a higher count when from an admin', async () => { + await user.update({ 'contributor.admin': true }); + + const flagResult = await user.post(`/challenges/${challenge._id}/flag`); + + expect(flagResult.challenge.flags[user._id]).to.equal(true); + expect(flagResult.challenge.flagCount).to.equal(5); + }); + + it('returns an error when user tries to flag a challenge that is already flagged', async () => { + await user.post(`/challenges/${challenge._id}/flag`); + + await expect(user.post(`/challenges/${challenge._id}/flag`)) + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('messageChallengeFlagAlreadyReported'), + }); + }); +}); diff --git a/test/api/v3/integration/challenges/POST-challenge_flag_clear.test.js b/test/api/v3/integration/challenges/POST-challenge_flag_clear.test.js new file mode 100644 index 0000000000..b1cfaaf667 --- /dev/null +++ b/test/api/v3/integration/challenges/POST-challenge_flag_clear.test.js @@ -0,0 +1,58 @@ +import { v4 as generateUUID } from 'uuid'; +import { + generateChallenge, + createAndPopulateGroup, + translate as t, +} from '../../../../helpers/api-integration/v3'; + +describe('POST /challenges/:challengeId/clearflags', () => { + let admin; + let nonAdmin; + let challenge; + + beforeEach(async () => { + const { group, groupLeader, members } = await createAndPopulateGroup({ + groupDetails: { + name: 'TestParty', + type: 'party', + privacy: 'private', + }, + members: 1, + }); + + admin = groupLeader; + [nonAdmin] = members; + + await admin.update({ 'permissions.moderator': true }); + + challenge = await generateChallenge(admin, group); + await admin.post(`/challenges/${challenge._id}/flag`); + }); + + it('returns error when non-admin attempts to clear flags', async () => { + await expect(nonAdmin.post(`/challenges/${generateUUID()}/clearflags`)) + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('messageGroupChatAdminClearFlagCount'), + }); + }); + + it('returns an error when challenge is not found', async () => { + await expect(admin.post(`/challenges/${generateUUID()}/clearflags`)) + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('challengeNotFound'), + }); + }); + + it('clears flags and sets mod flag to false', async () => { + await nonAdmin.post(`/challenges/${challenge._id}/flag`); + const flagResult = await admin.post(`/challenges/${challenge._id}/clearflags`); + + expect(flagResult.challenge.flagCount).to.eql(0); + expect(flagResult.challenge.flags).to.have.property(admin._id, false); + expect(flagResult.challenge.flags).to.have.property(nonAdmin._id, true); + }); +}); diff --git a/website/client/src/components/challenges/challengeDetail.vue b/website/client/src/components/challenges/challengeDetail.vue index b86a2c28de..67c437c390 100644 --- a/website/client/src/components/challenges/challengeDetail.vue +++ b/website/client/src/components/challenges/challengeDetail.vue @@ -1,5 +1,6 @@