From 7bc4da2f65d7832c15529443d086489c19bd2ecd Mon Sep 17 00:00:00 2001
From: Sebastian <sebastian.mihalache@thinslices.com>
Date: Wed, 25 Apr 2018 15:24:21 +0300
Subject: [PATCH] feat(component-invite): fix bugs on resend

---
 .../src/helpers/Invitation.js                 |  5 +---
 .../routes/collectionsInvitations/patch.js    | 12 ++++-----
 .../src/routes/collectionsInvitations/post.js |  2 +-
 .../collectionsInvitations/patch.test.js      | 10 +++-----
 .../tests/collectionsInvitations/post.test.js | 20 +++++++++++++++
 .../src/tests/fixtures/collections.js         | 12 ++++++---
 .../src/tests/fixtures/userData.js            |  1 +
 .../src/tests/fixtures/users.js               | 25 ++++++++++++++++++-
 8 files changed, 65 insertions(+), 22 deletions(-)

diff --git a/packages/component-invite/src/helpers/Invitation.js b/packages/component-invite/src/helpers/Invitation.js
index b7ae10f4f..fe4efdc0f 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 ecf43d5f6..cf2c13292 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 1792789ce..b8f52aa68 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 fba9ffbe3..6aba43fb3 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 d72bd114d..f15832969 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 9331af1e1..66e4e0f60 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 a7046079c..546e2d867 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 26de18e4d..c5f0a5e41 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
-- 
GitLab