diff --git a/packages/component-helper-service/src/tests/fragment.test.js b/packages/component-helper-service/src/tests/fragment.test.js index c5623dc18a8d7cf4812d3695189319f48b7e2202..ec7fbb6073f311f844c2ff574c936dfe00b9ff35 100644 --- a/packages/component-helper-service/src/tests/fragment.test.js +++ b/packages/component-helper-service/src/tests/fragment.test.js @@ -329,12 +329,13 @@ describe('Fragment helper', () => { updatedOn: chance.timestamp(), }, ] - const currentUserRecommendations = testFragment.recommendations.filter( - r => r.userId === handlingEditorId, - ) const fragmentHelper = new Fragment({ fragment: testFragment }) + const latestUserRecommendation = fragmentHelper.getLatestUserRecommendation( + handlingEditorId, + ) + const canHEMakeAnotherRecommendation = await fragmentHelper.canHEMakeAnotherRecommendation( - currentUserRecommendations, + latestUserRecommendation, ) expect(canHEMakeAnotherRecommendation).toBe(true) }) @@ -362,12 +363,12 @@ describe('Fragment helper', () => { updatedOn: chance.timestamp(), }, ] - const currentUserRecommendations = testFragment.recommendations.filter( - r => r.userId === handlingEditorId, - ) const fragmentHelper = new Fragment({ fragment: testFragment }) + const latestUserRecommendation = fragmentHelper.getLatestUserRecommendation( + handlingEditorId, + ) const canHEMakeAnotherRecommendation = await fragmentHelper.canHEMakeAnotherRecommendation( - currentUserRecommendations, + latestUserRecommendation, ) expect(canHEMakeAnotherRecommendation).toBe(false) }) diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js index f56995c89f20db60c0095f5a205630fb36057354..1f43c011c5fa7a98b1e6392998d2ef8fcbeb6ab9 100644 --- a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js +++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js @@ -18,6 +18,7 @@ const returnToHE = require('./strategies/eicReturnToHE') const Notification = require('../../notifications/notification') const createReview = require('./strategies/reviewerCreateReview') const requestRevisionAsHE = require('./strategies/heRequestRevision') +const requestRevisionAsEiC = require('./strategies/eicRequestRevision') module.exports = models => async (req, res) => { const { recommendation, comments, recommendationType } = req.body @@ -110,6 +111,7 @@ module.exports = models => async (req, res) => { eic: { reject: rejectAsEiC, publish: publishAsEiC, + revision: requestRevisionAsEiC, 'return-to-handling-editor': returnToHE, }, } diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/strategies/eicRequestRevision.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/strategies/eicRequestRevision.js new file mode 100644 index 0000000000000000000000000000000000000000..a98304d7a35dae58e81b0809022dcc823dd44781 --- /dev/null +++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/strategies/eicRequestRevision.js @@ -0,0 +1,13 @@ +module.exports = { + execute: async ({ fragmentHelper, collectionHelper, newRecommendation }) => { + if (collectionHelper.hasHandlingEditor()) { + throw new Error( + 'Cannot make request a revision after a Handling Editor has been assigned.', + ) + } + + await fragmentHelper.addRevision() + await collectionHelper.updateStatus({ newStatus: 'revisionRequested' }) + await fragmentHelper.addRecommendation(newRecommendation) + }, +} diff --git a/packages/component-manuscript-manager/src/tests/fragmentsRecommendations/post.test.js b/packages/component-manuscript-manager/src/tests/fragmentsRecommendations/post.test.js index b45fe772a119424bb5a86f3f41063e77323895f0..48138e455a6faa71295bce04c944903c7fb9b9c7 100644 --- a/packages/component-manuscript-manager/src/tests/fragmentsRecommendations/post.test.js +++ b/packages/component-manuscript-manager/src/tests/fragmentsRecommendations/post.test.js @@ -640,4 +640,55 @@ describe('Post fragments recommendations route handler', () => { 'Cannot make a recommendation on an older version.', ) }) + it('should return success when an EiC requests a revision before the Handling Editor is assigned', async () => { + const { editorInChief } = testFixtures.users + const { collection } = testFixtures.collections + const { fragment } = testFixtures.fragments + body.recommendation = 'revision' + body.recommendationType = 'editorRecommendation' + delete collection.handlingEditor + + const res = await requests.sendRequest({ + body, + userId: editorInChief.id, + models, + route, + path, + params: { + collectionId: collection.id, + fragmentId: fragment.id, + }, + }) + + expect(res.statusCode).toBe(200) + const data = JSON.parse(res._getData()) + expect(data.userId).toEqual(editorInChief.id) + expect(collection.status).toEqual('revisionRequested') + expect(fragment).toHaveProperty('revision') + }) + it('should return an error when an EiC requests a revision after a Handling Editor is assigned', async () => { + const { editorInChief } = testFixtures.users + const { collection } = testFixtures.collections + const { fragment } = testFixtures.fragments + body.recommendation = 'revision' + body.recommendationType = 'editorRecommendation' + + const res = await requests.sendRequest({ + body, + userId: editorInChief.id, + models, + route, + path, + params: { + collectionId: collection.id, + fragmentId: fragment.id, + }, + }) + + expect(res.statusCode).toBe(400) + const data = JSON.parse(res._getData()) + expect(data.error).toEqual( + 'Cannot make request a revision after a Handling Editor has been assigned.', + ) + }) })