Skip to content
Snippets Groups Projects
Commit aba46fd2 authored by Alexandru Munteanu's avatar Alexandru Munteanu
Browse files

Merge branch 'develop' of gitlab.coko.foundation:xpub/xpub-faraday into develop

parents 625c9284 cdefd7a6
No related branches found
No related tags found
1 merge request!6Agree/Decline to work on a manuscript
Showing
with 75 additions and 40 deletions
......@@ -21,20 +21,21 @@ module.exports = models => async (req, res) => {
const invitation = await collection.invitations.find(
invitation => invitation.id === invitationId,
)
if (invitation === undefined) {
res.status(404).json({
if (invitation === undefined)
return res.status(404).json({
error: `Invitation ${invitationId} not found`,
})
return
}
if (invitation.userId !== user.id) {
res.status(403).json({
if (invitation.hasAnswer)
return res
.status(400)
.json({ error: `${invitation.id} 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
}`,
})
return
}
if (invitation.role === 'handlingEditor')
await collectionHelper.updateHandlingEditor(collection, isAccepted)
invitation.timestamp = Date.now()
......
......@@ -11,12 +11,13 @@ jest.mock('pubsweet-component-mail-service', () => ({
}))
const deletePath = '../../routes/collectionsInvitations/delete'
const models = Model.build()
describe('Delete Collections Invitations route handler', () => {
let testFixtures = {}
let models
beforeEach(() => {
testFixtures = cloneDeep(fixtures)
models = Model.build(testFixtures)
})
it('should return an error when the collection does not exist', async () => {
const { editorInChief } = testFixtures.users
......
......@@ -9,8 +9,10 @@ const cloneDeep = require('lodash/cloneDeep')
const getPath = '../../routes/collectionsInvitations/get'
describe('Get collection invitations route handler', () => {
let testFixtures = {}
let models
beforeEach(() => {
testFixtures = cloneDeep(fixtures)
models = Model.build(testFixtures)
})
it('should return success when the request data is correct', async () => {
const { editorInChief, handlingEditor } = testFixtures.users
......@@ -23,7 +25,6 @@ describe('Get collection invitations route handler', () => {
req.params.collectionId = collection.id
req.user = editorInChief.id
const res = httpMocks.createResponse()
const models = Model.build()
await require(getPath)(models)(req, res)
expect(res.statusCode).toBe(200)
......@@ -36,7 +37,6 @@ describe('Get collection invitations route handler', () => {
req.query = {}
req.user = editorInChief.id
const res = httpMocks.createResponse()
const models = Model.build()
await require(getPath)(models)(req, res)
expect(res.statusCode).toBe(400)
const data = JSON.parse(res._getData())
......@@ -53,7 +53,6 @@ describe('Get collection invitations route handler', () => {
req.params.collectionId = 'invalid-id'
req.user = editorInChief.id
const res = httpMocks.createResponse()
const models = Model.build()
await require(getPath)(models)(req, res)
expect(res.statusCode).toBe(404)
const data = JSON.parse(res._getData())
......@@ -70,7 +69,6 @@ describe('Get collection invitations route handler', () => {
req.params.collectionId = collection.id
req.user = editorInChief.id
const res = httpMocks.createResponse()
const models = Model.build()
await require(getPath)(models)(req, res)
expect(res.statusCode).toBe(400)
const data = JSON.parse(res._getData())
......@@ -88,7 +86,6 @@ describe('Get collection invitations route handler', () => {
req.params.collectionId = collection.id
req.user = editorInChief.id
const res = httpMocks.createResponse()
const models = Model.build()
await require(getPath)(models)(req, res)
expect(res.statusCode).toBe(400)
const data = JSON.parse(res._getData())
......
......@@ -6,7 +6,6 @@ const fixtures = require('./../fixtures/fixtures')
const Model = require('./../helpers/Model')
const cloneDeep = require('lodash/cloneDeep')
const models = Model.build()
jest.mock('pubsweet-component-mail-service', () => ({
setupAssignEmail: jest.fn(),
setupAgreeEmail: jest.fn(),
......@@ -20,9 +19,11 @@ const patchPath = '../../routes/collectionsInvitations/patch'
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 handling editor accepts work on a collection', async () => {
const { handlingEditor } = testFixtures.users
......@@ -33,7 +34,7 @@ describe('Patch collections invitations route handler', () => {
req.user = handlingEditor.id
req.params.collectionId = collection.id
const heInv = collection.invitations.find(
inv => inv.role === 'handlingEditor',
inv => inv.role === 'handlingEditor' && inv.hasAnswer === false,
)
req.params.invitationId = heInv.id
const res = httpMocks.createResponse()
......@@ -65,7 +66,10 @@ describe('Patch collections invitations route handler', () => {
})
req.user = handlingEditor.id
req.params.collectionId = collection.id
req.params.invitationId = collection.invitations[0].id
const heInv = collection.invitations.find(
inv => inv.role === 'handlingEditor' && inv.hasAnswer == false,
)
req.params.invitationId = heInv.id
const res = httpMocks.createResponse()
await require(patchPath)(models)(req, res)
......@@ -127,7 +131,7 @@ describe('Patch collections invitations route handler', () => {
req.user = reviewer.id
req.params.collectionId = collection.id
const inv = collection.invitations.find(
inv => inv.role === 'handlingEditor',
inv => inv.role === 'handlingEditor' && inv.hasAnswer === false,
)
req.params.invitationId = inv.id
const res = httpMocks.createResponse()
......@@ -138,4 +142,20 @@ describe('Patch collections invitations route handler', () => {
`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`)
})
})
......@@ -11,7 +11,6 @@ const cloneDeep = require('lodash/cloneDeep')
const configRoles = config.get('roles')
const models = Model.build()
jest.mock('pubsweet-component-mail-service', () => ({
setupInviteEmail: jest.fn(),
setupAssignEmail: jest.fn(),
......@@ -34,9 +33,11 @@ const postPath = '../../routes/collectionsInvitations/post'
describe('Post collections invitations route handler', () => {
let testFixtures = {}
let body = {}
let models
beforeEach(() => {
testFixtures = cloneDeep(fixtures)
body = cloneDeep(reqBody)
models = Model.build(testFixtures)
})
it('should return an error params are missing', async () => {
const { admin } = testFixtures.users
......
......@@ -35,6 +35,14 @@ const collections = {
userId: reviewer.id,
timestamp: chance.timestamp(),
},
{
id: chance.guid(),
role: 'handlingEditor',
hasAnswer: true,
isAccepted: false,
userId: handlingEditor.id,
timestamp: chance.timestamp(),
},
],
handlingEditor: {
id: handlingEditor.id,
......
const fixtures = require('../fixtures/fixtures')
// const fixtures = require('../fixtures/fixtures')
const UserMock = require('../mocks/User')
const TeamMock = require('../mocks/Team')
......@@ -7,23 +7,23 @@ const notFoundError = new Error()
notFoundError.name = 'NotFoundError'
notFoundError.status = 404
const build = () => {
const build = fixtures => {
const models = {
User: {},
Collection: {
find: jest.fn(id => findMock(id, 'collections')),
find: jest.fn(id => findMock(id, 'collections', fixtures)),
},
Team: {},
Fragment: {
find: jest.fn(id => findMock(id, 'fragments')),
find: jest.fn(id => findMock(id, 'fragments', fixtures)),
},
}
UserMock.find = jest.fn(id => findMock(id, 'users'))
UserMock.findByEmail = jest.fn(email => findByEmailMock(email))
UserMock.find = jest.fn(id => findMock(id, 'users', fixtures))
UserMock.findByEmail = jest.fn(email => findByEmailMock(email, fixtures))
UserMock.all = jest.fn(() => Object.values(fixtures.users))
TeamMock.find = jest.fn(id => findMock(id, 'teams'))
TeamMock.find = jest.fn(id => findMock(id, 'teams', fixtures))
TeamMock.updateProperties = jest.fn(team =>
updatePropertiesMock(team, 'teams'),
updatePropertiesMock(team, 'teams', fixtures),
)
TeamMock.all = jest.fn(() => Object.values(fixtures.teams))
......@@ -32,7 +32,7 @@ const build = () => {
return models
}
const findMock = (id, type) => {
const findMock = (id, type, fixtures) => {
const foundObj = Object.values(fixtures[type]).find(
fixtureObj => fixtureObj.id === id,
)
......@@ -41,7 +41,7 @@ const findMock = (id, type) => {
return Promise.resolve(foundObj)
}
const findByEmailMock = email => {
const findByEmailMock = (email, fixtures) => {
const foundUser = Object.values(fixtures.users).find(
fixtureUser => fixtureUser.email === email,
)
......@@ -50,7 +50,7 @@ const findByEmailMock = email => {
return Promise.resolve(foundUser)
}
const updatePropertiesMock = (obj, type) => {
const updatePropertiesMock = (obj, type, fixtures) => {
const foundObj = Object.values(fixtures[type]).find(
fixtureObj => fixtureObj === obj,
)
......
......@@ -161,7 +161,9 @@ module.exports = {
email: invitedUser.email,
token: invitedUser.passwordResetToken,
collectionId: collection.id,
fragmentId,
agree: true,
invitationId,
})}`
}
......
......@@ -13,6 +13,11 @@ module.exports = {
collection.authors = collection.authors || []
const author = {
userId: user.id,
firstName: user.firstName || '',
lastName: user.lastName || '',
email: user.email,
title: user.title || '',
affiliation: user.affiliation || '',
isSubmitting,
isCorresponding,
}
......
......@@ -2,7 +2,7 @@ const helpers = require('../../helpers/helpers')
const teamHelper = require('../../helpers/Team')
module.exports = models => async (req, res) => {
// TO DO: add authsom
// TO DO: add authsome
const { collectionId } = req.params
try {
const collection = await models.Collection.find(collectionId)
......
......@@ -108,14 +108,14 @@ const DashboardCard = ({
<DetailsView>
<Top>
<AuthorList>
{version.authors.map(
{project.authors.map(
(
{
affiliation,
firstName,
lastName,
middleName,
email,
userId,
isSubmitting,
isCorresponding,
},
......@@ -124,16 +124,15 @@ const DashboardCard = ({
) => (
<AuthorTooltip
affiliation={affiliation}
authorName={`${firstName} ${lastName}`}
authorName={`${firstName || ''} ${lastName || ''}`}
currentUser={currentUser}
email={email}
isCorresponding={isCorresponding}
isSubmitting={isSubmitting}
key={email}
key={userId}
>
<Author>
<AuthorName>
{firstName} {middleName} {lastName}
</AuthorName>
<AuthorName>{`${firstName} ${lastName}`}</AuthorName>
{isSubmitting && <AuthorStatus>SA</AuthorStatus>}
{isCorresponding && <AuthorStatus>CA</AuthorStatus>}
{arr.length - 1 === index ? '' : ','}
......@@ -224,6 +223,7 @@ const AuthorList = styled.span`
const AuthorName = styled.span`
text-decoration: underline;
padding-left: 2px;
cursor: default;
`
const Author = styled.div`
padding-right: ${th('subGridUnit')};
......
......@@ -40,7 +40,7 @@ const AuthorBackend = app => {
if (submittingAuthors.length > 0) {
res
.status(400)
.json({ error: 'There can only be one sumbitting author' })
.json({ error: 'There can only be one submitting author' })
return
}
}
......
......@@ -130,7 +130,7 @@ describe('Author Backend API', () => {
.post(createAuthorUrl)
.set('Authorization', 'Bearer 123')
.send(testFixtures.authors.newSubmittingAuthor)
.expect(400, '{"error":"There can only be one sumbitting author"}')
.expect(400, '{"error":"There can only be one submitting author"}')
})
it('should return success when saving a new author', () => {
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment