diff --git a/packages/component-invite/src/routes/collectionsInvitations/decline.js b/packages/component-invite/src/routes/collectionsInvitations/decline.js
index d0b2682ee267458ac7a8e4ca35c0de2c95a34cc5..97714177fedd3039a7249e8af7a546ce5f68ffd4 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 0000000000000000000000000000000000000000..f6669635c403147d6cfbc21c8183b49d529838ea
--- /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 5df78f7e0b082fcba48c707baff1ae69d5606a1f..26de18e4d6319956c782356e670272028fd7529f 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',
   },
 }