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