diff --git a/packages/component-invite/src/helpers/Invitation.js b/packages/component-invite/src/helpers/Invitation.js index b7ae10f4fe489a9b2f8fc2d6c29c26a51bcdb0c6..fe4efdc0f3fdd7eaa04a849c0782b80ade2c109a 100644 --- a/packages/component-invite/src/helpers/Invitation.js +++ b/packages/component-invite/src/helpers/Invitation.js @@ -80,10 +80,7 @@ const setupReviewerInvitation = async ({ const getInvitation = (invitations = [], userId, role) => invitations.find( - invitation => - invitation.userId === userId && - invitation.role === role && - invitation.hasAnswer === false, + invitation => invitation.userId === userId && invitation.role === role, ) module.exports = { diff --git a/packages/component-invite/src/routes/collectionsInvitations/patch.js b/packages/component-invite/src/routes/collectionsInvitations/patch.js index ecf43d5f66abd48eec22bbe85705f3b3e519dea6..cf2c13292d4f38862b54db5d6ff7b8a96f16c0aa 100644 --- a/packages/component-invite/src/routes/collectionsInvitations/patch.js +++ b/packages/component-invite/src/routes/collectionsInvitations/patch.js @@ -10,7 +10,7 @@ module.exports = models => async (req, res) => { const { isAccepted, reason } = req.body if (!helpers.checkForUndefinedParams(isAccepted)) { - res.status(400).json({ error: 'Missing parameters' }) + res.status(400).json({ error: 'Missing parameters.' }) logger.error('some parameters are missing') return } @@ -23,17 +23,15 @@ module.exports = models => async (req, res) => { ) if (invitation === undefined) return res.status(404).json({ - error: `Invitation ${invitationId} not found`, + error: 'Invitation not found.', }) if (invitation.hasAnswer) return res .status(400) - .json({ error: `${invitation.id} has already been answered` }) + .json({ error: 'Invitation has already been answered.' }) if (invitation.userId !== user.id) return res.status(403).json({ - error: `User ${user.email} is not allowed to modify invitation ${ - invitation.id - }`, + error: `User is not allowed to modify this invitation.`, }) const params = { @@ -104,7 +102,7 @@ module.exports = models => async (req, res) => { ) } else if (invitation.role === 'reviewer') { await collectionHelper.updateReviewerCollectionStatus(collection) - return await userHelper.setupReviewerDecisionEmailData({ + await userHelper.setupReviewerDecisionEmailData({ ...params, agree: false, }) diff --git a/packages/component-invite/src/routes/collectionsInvitations/post.js b/packages/component-invite/src/routes/collectionsInvitations/post.js index 1792789ceed8de0e4199e47d4543eb4c0b33236a..b8f52aa68c093dff198a26faa75c139846e33cd6 100644 --- a/packages/component-invite/src/routes/collectionsInvitations/post.js +++ b/packages/component-invite/src/routes/collectionsInvitations/post.js @@ -65,7 +65,7 @@ module.exports = models => async (req, res) => { if (invitation.hasAnswer) return res .status(400) - .json({ error: `${invitation.id} has already been answered` }) + .json({ error: 'User has already replied to a previous invitation.' }) invitation.timestamp = Date.now() await collection.save() resend = true diff --git a/packages/component-invite/src/tests/collectionsInvitations/patch.test.js b/packages/component-invite/src/tests/collectionsInvitations/patch.test.js index fba9ffbe3494d29d79a049269a12a78498acca64..6aba43fb3688ac9bf6d8d221b79cc4e420752f9d 100644 --- a/packages/component-invite/src/tests/collectionsInvitations/patch.test.js +++ b/packages/component-invite/src/tests/collectionsInvitations/patch.test.js @@ -109,7 +109,7 @@ describe('Patch collections invitations route handler', () => { expect(res.statusCode).toBe(400) const data = JSON.parse(res._getData()) - expect(data.error).toEqual('Missing parameters') + expect(data.error).toEqual('Missing parameters.') }) it('should return an error if the collection does not exists', async () => { const { handlingEditor } = testFixtures.users @@ -139,7 +139,7 @@ describe('Patch collections invitations route handler', () => { expect(res.statusCode).toBe(404) const data = JSON.parse(res._getData()) - expect(data.error).toEqual('Invitation invalid-id not found') + expect(data.error).toEqual('Invitation not found.') }) it("should return an error when a user tries to patch another user's invitation", async () => { const { reviewer } = testFixtures.users @@ -157,9 +157,7 @@ describe('Patch collections invitations route handler', () => { await require(patchPath)(models)(req, res) expect(res.statusCode).toBe(403) const data = JSON.parse(res._getData()) - expect(data.error).toEqual( - `User ${reviewer.email} is not allowed to modify invitation ${inv.id}`, - ) + expect(data.error).toEqual(`User is not allowed to modify this invitation.`) }) it('should return an error when the invitation is already answered', async () => { const { handlingEditor } = testFixtures.users @@ -175,6 +173,6 @@ describe('Patch collections invitations route handler', () => { await require(patchPath)(models)(req, res) expect(res.statusCode).toBe(400) const data = JSON.parse(res._getData()) - expect(data.error).toEqual(`${inv.id} has already been answered`) + expect(data.error).toEqual(`Invitation has already been answered.`) }) }) diff --git a/packages/component-invite/src/tests/collectionsInvitations/post.test.js b/packages/component-invite/src/tests/collectionsInvitations/post.test.js index d72bd114d22a7ed4526295959e6c6a1f3fd91345..f15832969d072bcb9715572b352229b503d8e059 100644 --- a/packages/component-invite/src/tests/collectionsInvitations/post.test.js +++ b/packages/component-invite/src/tests/collectionsInvitations/post.test.js @@ -136,4 +136,24 @@ describe('Post collections invitations route handler', () => { const data = JSON.parse(res._getData()) expect(data.role).toEqual(body.role) }) + it('should return an error when the invitation is already answered', async () => { + const { answerReviewer, handlingEditor } = testFixtures.users + const { collection } = testFixtures.collections + body = { + email: answerReviewer.email, + role: 'reviewer', + } + const req = httpMocks.createRequest({ + body, + }) + req.user = handlingEditor.id + req.params.collectionId = collection.id + const res = httpMocks.createResponse() + await require(postPath)(models)(req, res) + expect(res.statusCode).toBe(400) + const data = JSON.parse(res._getData()) + expect(data.error).toEqual( + `User has already replied to a previous invitation.`, + ) + }) }) diff --git a/packages/component-invite/src/tests/fixtures/collections.js b/packages/component-invite/src/tests/fixtures/collections.js index 9331af1e1f653959caaf886ea8cc0e51c59b9324..66e4e0f600559bae2197b471d8ddc4b038427d81 100644 --- a/packages/component-invite/src/tests/fixtures/collections.js +++ b/packages/component-invite/src/tests/fixtures/collections.js @@ -1,5 +1,11 @@ const Chance = require('chance') -const { user, handlingEditor, author, reviewer } = require('./userData') +const { + user, + handlingEditor, + author, + reviewer, + answerReviewer, +} = require('./userData') const { fragment } = require('./fragments') const chance = new Chance() @@ -37,10 +43,10 @@ const collections = { }, { id: chance.guid(), - role: 'handlingEditor', + role: 'reviewer', hasAnswer: true, isAccepted: false, - userId: handlingEditor.id, + userId: answerReviewer.id, timestamp: chance.timestamp(), }, ], diff --git a/packages/component-invite/src/tests/fixtures/userData.js b/packages/component-invite/src/tests/fixtures/userData.js index a7046079c834babe37fbf2524fd9349b4368f04a..546e2d867998c6de1cab8e10a4df20fb74d5288d 100644 --- a/packages/component-invite/src/tests/fixtures/userData.js +++ b/packages/component-invite/src/tests/fixtures/userData.js @@ -14,4 +14,5 @@ module.exports = { admin: generateUserData(), author: generateUserData(), reviewer: generateUserData(), + answerReviewer: generateUserData(), } diff --git a/packages/component-invite/src/tests/fixtures/users.js b/packages/component-invite/src/tests/fixtures/users.js index 26de18e4d6319956c782356e670272028fd7529f..c5f0a5e41f8bca54d62c6534ef263a6de77c99bc 100644 --- a/packages/component-invite/src/tests/fixtures/users.js +++ b/packages/component-invite/src/tests/fixtures/users.js @@ -1,5 +1,12 @@ const { heTeamID, revTeamID } = require('./teamIDs') -const { handlingEditor, user, admin, author, reviewer } = require('./userData') +const { + handlingEditor, + user, + admin, + author, + reviewer, + answerReviewer, +} = require('./userData') const Chance = require('chance') const chance = new Chance() @@ -89,6 +96,22 @@ const users = { teams: [revTeamID], invitationToken: 'inv-token-123', }, + answerReviewer: { + type: 'user', + username: chance.word(), + email: answerReviewer.email, + password: 'password', + admin: false, + id: answerReviewer.id, + firstName: answerReviewer.firstName, + lastName: answerReviewer.lastName, + affiliation: chance.company(), + title: 'Dr', + save: jest.fn(() => users.answerReviewer), + isConfirmed: true, + teams: [revTeamID], + invitationToken: 'inv-token-123', + }, } module.exports = users