From 078334bb46bb7ac9a268f84b112c13c674259872 Mon Sep 17 00:00:00 2001
From: Sebastian <sebastian.mihalache@thinslices.com>
Date: Tue, 24 Apr 2018 10:41:57 +0300
Subject: [PATCH] feat(component-invite): do not remove new reviewer after
 decline

---
 .../routes/collectionsInvitations/decline.js  |   8 --
 .../collectionsInvitations/decline.test.js    | 127 ++++++++++++++++++
 .../src/tests/fixtures/users.js               |   1 +
 3 files changed, 128 insertions(+), 8 deletions(-)
 create mode 100644 packages/component-invite/src/tests/collectionsInvitations/decline.test.js

diff --git a/packages/component-invite/src/routes/collectionsInvitations/decline.js b/packages/component-invite/src/routes/collectionsInvitations/decline.js
index d0b2682ee..97714177f 100644
--- a/packages/component-invite/src/routes/collectionsInvitations/decline.js
+++ b/packages/component-invite/src/routes/collectionsInvitations/decline.js
@@ -1,5 +1,4 @@
 const helpers = require('../../helpers/helpers')
-const teamHelper = require('../../helpers/Team')
 const mailService = require('pubsweet-component-mail-service')
 const userHelper = require('../../helpers/User')
 
@@ -37,14 +36,7 @@ module.exports = models => async (req, res) => {
     invitation.timestamp = Date.now()
     invitation.hasAnswer = true
     invitation.isAccepted = false
-    const team = await teamHelper.getTeamByGroupAndCollection(
-      collectionId,
-      invitation.role,
-      models.Team,
-    )
     await collection.save()
-    await teamHelper.removeTeamMember(team.id, user.id, models.Team)
-    user.teams = user.teams.filter(userTeamId => team.id !== userTeamId)
     return await userHelper.setupReviewerDeclinedEmailData(
       models,
       collection,
diff --git a/packages/component-invite/src/tests/collectionsInvitations/decline.test.js b/packages/component-invite/src/tests/collectionsInvitations/decline.test.js
new file mode 100644
index 000000000..f6669635c
--- /dev/null
+++ b/packages/component-invite/src/tests/collectionsInvitations/decline.test.js
@@ -0,0 +1,127 @@
+process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
+process.env.SUPPRESS_NO_CONFIG_WARNING = true
+
+const httpMocks = require('node-mocks-http')
+const fixtures = require('./../fixtures/fixtures')
+const Model = require('./../helpers/Model')
+const cloneDeep = require('lodash/cloneDeep')
+
+jest.mock('pubsweet-component-mail-service', () => ({
+  setupReviewerDeclinedEmail: jest.fn(),
+}))
+
+const reqBody = {
+  invitationToken: 'inv-token-123',
+}
+const patchPath = '../../routes/collectionsInvitations/decline'
+describe('Patch collections invitations route handler', () => {
+  let testFixtures = {}
+  let body = {}
+  let models
+  beforeEach(() => {
+    testFixtures = cloneDeep(fixtures)
+    body = cloneDeep(reqBody)
+    models = Model.build(testFixtures)
+  })
+  it('should return success when the reviewer declines work on a collection', async () => {
+    const { reviewer } = testFixtures.users
+    const { collection } = testFixtures.collections
+    body.isAccepted = false
+    const req = httpMocks.createRequest({
+      body,
+    })
+    req.user = reviewer.id
+    req.params.collectionId = collection.id
+    const inv = collection.invitations.find(
+      inv => inv.role === 'reviewer' && inv.hasAnswer === false,
+    )
+    req.params.invitationId = inv.id
+    const res = httpMocks.createResponse()
+    await require(patchPath)(models)(req, res)
+
+    expect(res.statusCode).toBe(200)
+  })
+  it('should return an error params are missing', async () => {
+    const { handlingEditor } = testFixtures.users
+    const { collection } = testFixtures.collections
+    delete body.isAccepted
+    const req = httpMocks.createRequest({
+      body,
+    })
+    req.user = handlingEditor.id
+    req.params.collectionId = collection.id
+    req.params.invitationId = collection.invitations[0].id
+    const res = httpMocks.createResponse()
+    await require(patchPath)(models)(req, res)
+
+    expect(res.statusCode).toBe(400)
+    const data = JSON.parse(res._getData())
+    expect(data.error).toEqual('Missing parameters')
+  })
+  it('should return an error if the collection does not exists', async () => {
+    const { handlingEditor } = testFixtures.users
+    const req = httpMocks.createRequest({
+      body,
+    })
+    req.user = handlingEditor.id
+    req.params.collectionId = 'invalid-id'
+    const res = httpMocks.createResponse()
+    await require(patchPath)(models)(req, res)
+
+    expect(res.statusCode).toBe(404)
+    const data = JSON.parse(res._getData())
+    expect(data.error).toEqual('collection not found')
+  })
+  it('should return an error when the invitation does not exist', async () => {
+    const { user } = testFixtures.users
+    const { collection } = testFixtures.collections
+    const req = httpMocks.createRequest({
+      body,
+    })
+    req.user = user.id
+    req.params.collectionId = collection.id
+    req.params.invitationId = 'invalid-id'
+    const res = httpMocks.createResponse()
+    await require(patchPath)(models)(req, res)
+
+    expect(res.statusCode).toBe(404)
+    const data = JSON.parse(res._getData())
+    expect(data.error).toEqual('Invitation invalid-id not found')
+  })
+  it("should return an error when a user tries to patch another user's invitation", async () => {
+    const { reviewer } = testFixtures.users
+    const { collection } = testFixtures.collections
+    const req = httpMocks.createRequest({
+      body,
+    })
+    req.user = reviewer.id
+    req.params.collectionId = collection.id
+    const inv = collection.invitations.find(
+      inv => inv.role === 'handlingEditor' && inv.hasAnswer === false,
+    )
+    req.params.invitationId = inv.id
+    const res = httpMocks.createResponse()
+    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}`,
+    )
+  })
+  it('should return an error when the invitation is already answered', async () => {
+    const { handlingEditor } = testFixtures.users
+    const { collection } = testFixtures.collections
+    const req = httpMocks.createRequest({
+      body,
+    })
+    req.user = handlingEditor.id
+    req.params.collectionId = collection.id
+    const inv = collection.invitations.find(inv => inv.hasAnswer)
+    req.params.invitationId = inv.id
+    const res = httpMocks.createResponse()
+    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`)
+  })
+})
diff --git a/packages/component-invite/src/tests/fixtures/users.js b/packages/component-invite/src/tests/fixtures/users.js
index 5df78f7e0..26de18e4d 100644
--- a/packages/component-invite/src/tests/fixtures/users.js
+++ b/packages/component-invite/src/tests/fixtures/users.js
@@ -87,6 +87,7 @@ const users = {
     save: jest.fn(() => users.reviewer),
     isConfirmed: true,
     teams: [revTeamID],
+    invitationToken: 'inv-token-123',
   },
 }
 
-- 
GitLab