diff --git a/packages/component-user-manager/src/tests/fixtures/collections.js b/packages/component-user-manager/src/tests/fixtures/collections.js index 6c4e02668459f9d42c48b58151ccb87f190dcc77..0d7c8b7f9faa6a623b8bdb3dfe6df4d41212ef88 100644 --- a/packages/component-user-manager/src/tests/fixtures/collections.js +++ b/packages/component-user-manager/src/tests/fixtures/collections.js @@ -10,13 +10,6 @@ const collections = { type: 'collection', fragments: [fragment.id], owners: [submittingAuthor.id], - authors: [ - { - userId: submittingAuthor.id, - isSubmitting: true, - isCorresponding: false, - }, - ], save: jest.fn(() => collections.standardCollection), }, authorsCollection: { diff --git a/packages/component-user-manager/src/tests/fixtures/fixtures.js b/packages/component-user-manager/src/tests/fixtures/fixtures.js index 0ea29e85ac3a373a20a0e82377e0b6f3dfeef51e..c6a428848717e0d80dabef22d18d5ad531ad841a 100644 --- a/packages/component-user-manager/src/tests/fixtures/fixtures.js +++ b/packages/component-user-manager/src/tests/fixtures/fixtures.js @@ -1,9 +1,11 @@ const users = require('./users') const collections = require('./collections') const teams = require('./teams') +const fragments = require('./fragments') module.exports = { users, collections, teams, + fragments, } diff --git a/packages/component-user-manager/src/tests/fixtures/fragments.js b/packages/component-user-manager/src/tests/fixtures/fragments.js index 08d0eedf3a531c317cbfb79e58a6d1b019413564..298f8342bf5d83653ca58b62e46ff7b351454141 100644 --- a/packages/component-user-manager/src/tests/fixtures/fragments.js +++ b/packages/component-user-manager/src/tests/fixtures/fragments.js @@ -1,4 +1,5 @@ const Chance = require('chance') +const { submittingAuthor } = require('./userData') const chance = new Chance() const fragments = { @@ -9,6 +10,14 @@ const fragments = { abstract: chance.paragraph(), }, recommendations: [], + save: jest.fn(() => fragments.fragment), + authors: [ + { + userId: submittingAuthor.id, + isSubmitting: true, + isCorresponding: false, + }, + ], }, } diff --git a/packages/component-user-manager/src/tests/fixtures/teams.js b/packages/component-user-manager/src/tests/fixtures/teams.js index 410b999e3f98f3b196eb28feb5512c744e5b61ea..d3ddc7046cc96bea16dddaf469796694708b8df5 100644 --- a/packages/component-user-manager/src/tests/fixtures/teams.js +++ b/packages/component-user-manager/src/tests/fixtures/teams.js @@ -1,8 +1,8 @@ const users = require('./users') -const collections = require('./collections') +const fragments = require('./fragments') const { authorTeamID } = require('./teamIDs') -const { standardCollection } = collections +const { fragment } = fragments const { submittingAuthor } = users const teams = { authorTeam: { @@ -13,8 +13,8 @@ const teams = { group: 'author', name: 'author', object: { - type: 'collection', - id: standardCollection.id, + type: 'fragment', + id: fragment.id, }, members: [submittingAuthor.id], save: jest.fn(() => teams.authorTeam), diff --git a/packages/component-user-manager/src/tests/fragmentsUsers/delete.test.js b/packages/component-user-manager/src/tests/fragmentsUsers/delete.test.js index 7242ac5c76c8b75ce0e265ca9ef98981490fe1a0..1a905e9769ea4989478bb73d386e654c16e59a66 100644 --- a/packages/component-user-manager/src/tests/fragmentsUsers/delete.test.js +++ b/packages/component-user-manager/src/tests/fragmentsUsers/delete.test.js @@ -1,29 +1,36 @@ process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' process.env.SUPPRESS_NO_CONFIG_WARNING = true +const cloneDeep = require('lodash/cloneDeep') const httpMocks = require('node-mocks-http') const fixtures = require('./../fixtures/fixtures') const Model = require('./../helpers/Model') -const models = Model.build() - const { author, submittingAuthor } = fixtures.users const { standardCollection } = fixtures.collections -const { authorTeam } = fixtures.teams -const deletePath = '../../routes/collectionsUsers/delete' - -describe('Delete collections users route handler', () => { +const deletePath = '../../routes/fragmentsUsers/delete' +jest.mock('pubsweet-component-mail-service', () => ({ + sendSimpleEmail: jest.fn(), + sendNotificationEmail: jest.fn(), +})) +describe('Delete fragments users route handler', () => { + let testFixtures = {} + let models + beforeEach(() => { + testFixtures = cloneDeep(fixtures) + models = Model.build(testFixtures) + }) it('should return success when an author is deleted', async () => { const req = httpMocks.createRequest({}) req.user = submittingAuthor.id req.params.collectionId = standardCollection.id + const [fragmentId] = standardCollection.fragments + req.params.fragmentId = fragmentId req.params.userId = author.id const res = httpMocks.createResponse() await require(deletePath)(models)(req, res) expect(res.statusCode).toBe(200) - expect(authorTeam.members).not.toContain(author.id) - expect(author.teams).not.toContain(authorTeam.id) }) it('should return an error when the collection does not exist', async () => { const req = httpMocks.createRequest({}) @@ -41,6 +48,8 @@ describe('Delete collections users route handler', () => { const req = httpMocks.createRequest({}) req.user = submittingAuthor.id req.params.collectionId = standardCollection.id + const [fragmentId] = standardCollection.fragments + req.params.fragmentId = fragmentId req.params.userId = 'invalid-id' const res = httpMocks.createResponse() await require(deletePath)(models)(req, res) @@ -49,4 +58,21 @@ describe('Delete collections users route handler', () => { const data = JSON.parse(res._getData()) expect(data.error).toEqual('item not found') }) + it('should return an error when the fragment does not exist', async () => { + const req = httpMocks.createRequest() + req.user = submittingAuthor.id + req.params.collectionId = standardCollection.id + req.params.fragmentId = 'invalid-fragment-id' + req.params.userId = author.id + const res = httpMocks.createResponse() + await require(deletePath)(models)(req, res) + + expect(res.statusCode).toBe(400) + const data = JSON.parse(res._getData()) + expect(data.error).toEqual( + `Fragment invalid-fragment-id does not match collection ${ + standardCollection.id + }`, + ) + }) }) diff --git a/packages/component-user-manager/src/tests/fragmentsUsers/get.test.js b/packages/component-user-manager/src/tests/fragmentsUsers/get.test.js index b5975b4ed8d941cd760c22b4df9ec729c41e8ab7..5045a72d0a332988425eaa1e14649a03632276a8 100644 --- a/packages/component-user-manager/src/tests/fragmentsUsers/get.test.js +++ b/packages/component-user-manager/src/tests/fragmentsUsers/get.test.js @@ -1,5 +1,6 @@ process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' process.env.SUPPRESS_NO_CONFIG_WARNING = true +const cloneDeep = require('lodash/cloneDeep') const httpMocks = require('node-mocks-http') const fixtures = require('./../fixtures/fixtures') @@ -8,14 +9,25 @@ const Model = require('./../helpers/Model') const { standardCollection } = fixtures.collections const { submittingAuthor } = fixtures.users -const getPath = '../../routes/collectionsUsers/get' -describe('Get collections users route handler', () => { +jest.mock('pubsweet-component-mail-service', () => ({ + sendSimpleEmail: jest.fn(), + sendNotificationEmail: jest.fn(), +})) +const getPath = '../../routes/fragmentsUsers/get' +describe('Get fragments users 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 req = httpMocks.createRequest() req.params.collectionId = standardCollection.id + const [fragmentId] = standardCollection.fragments + req.params.fragmentId = fragmentId req.user = submittingAuthor.id const res = httpMocks.createResponse() - const models = Model.build() await require(getPath)(models)(req, res) expect(res.statusCode).toBe(200) @@ -29,10 +41,25 @@ describe('Get collections users route handler', () => { req.params.collectionId = 'invalid-id' req.user = submittingAuthor.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()) - expect(data.error).toEqual('collection not found') + expect(data.error).toEqual('item not found') + }) + it('should return an error when the fragment does not exist', async () => { + const req = httpMocks.createRequest() + req.user = submittingAuthor.id + req.params.collectionId = standardCollection.id + req.params.fragmentId = 'invalid-fragment-id' + const res = httpMocks.createResponse() + await require(getPath)(models)(req, res) + + expect(res.statusCode).toBe(400) + const data = JSON.parse(res._getData()) + expect(data.error).toEqual( + `Fragment invalid-fragment-id does not match collection ${ + standardCollection.id + }`, + ) }) }) diff --git a/packages/component-user-manager/src/tests/fragmentsUsers/patch.test.js b/packages/component-user-manager/src/tests/fragmentsUsers/patch.test.js index 03c35f392d843bcf12c2b4859c656017a311c0a7..038df52080efb4e82a9996ffbc3814ff3155e813 100644 --- a/packages/component-user-manager/src/tests/fragmentsUsers/patch.test.js +++ b/packages/component-user-manager/src/tests/fragmentsUsers/patch.test.js @@ -7,42 +7,44 @@ const Model = require('./../helpers/Model') const Chance = require('chance') const chance = new Chance() +const cloneDeep = require('lodash/cloneDeep') -const models = Model.build() jest.mock('pubsweet-component-mail-service', () => ({ sendSimpleEmail: jest.fn(), sendNotificationEmail: jest.fn(), })) const { author, submittingAuthor } = fixtures.users -const { standardCollection, authorsCollection } = fixtures.collections -const body = { +const { standardCollection } = fixtures.collections +const reqBody = { isSubmitting: false, isCorresponding: true, firstName: chance.first(), lastName: chance.last(), affiliation: chance.company(), } -const patchPath = '../../routes/collectionsUsers/patch' -describe('Patch collections users route handler', () => { +const patchPath = '../../routes/fragmentsUsers/patch' +describe('Patch fragments users 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 request data is correct', async () => { const req = httpMocks.createRequest({ body, }) req.user = submittingAuthor.id req.params.collectionId = standardCollection.id + const [fragmentId] = standardCollection.fragments + req.params.fragmentId = fragmentId req.params.userId = submittingAuthor.id const res = httpMocks.createResponse() await require(patchPath)(models)(req, res) - const data = JSON.parse(res._getData()) expect(res.statusCode).toBe(200) - const matchingAuthor = data.authors.find( - author => author.userId === submittingAuthor.id, - ) - expect(matchingAuthor.isSubmitting).toBe(body.isSubmitting) - expect(matchingAuthor.isCorresponding).toBe(body.isCorresponding) - expect(submittingAuthor.firstName).toBe(body.firstName) - expect(submittingAuthor.lastName).toBe(body.lastName) }) it('should return an error when the params are missing', async () => { delete body.isSubmitting @@ -51,6 +53,8 @@ describe('Patch collections users route handler', () => { }) req.user = submittingAuthor.id req.params.collectionId = standardCollection.id + const [fragmentId] = standardCollection.fragments + req.params.fragmentId = fragmentId req.params.userId = submittingAuthor.id const res = httpMocks.createResponse() await require(patchPath)(models)(req, res) @@ -58,9 +62,8 @@ describe('Patch collections users route handler', () => { expect(res.statusCode).toBe(400) const data = JSON.parse(res._getData()) expect(data.error).toEqual('Missing parameters') - body.isSubmitting = false }) - it('should return an error if the collection does not exists', async () => { + it('should return an error if the fragments does not exists', async () => { const req = httpMocks.createRequest({ body, }) @@ -80,6 +83,8 @@ describe('Patch collections users route handler', () => { }) req.user = author.id req.params.collectionId = standardCollection.id + const [fragmentId] = standardCollection.fragments + req.params.fragmentId = fragmentId req.params.userId = 'invalid-id' const res = httpMocks.createResponse() await require(patchPath)(models)(req, res) @@ -88,32 +93,39 @@ describe('Patch collections users route handler', () => { const data = JSON.parse(res._getData()) expect(data.error).toEqual('item not found') }) - it('should return an error when the collection does not have authors', async () => { + it('should return an error when the fragment and the user do not match', async () => { const req = httpMocks.createRequest({ body, }) req.user = submittingAuthor.id - req.params.collectionId = authorsCollection.id - req.params.userId = submittingAuthor.id + req.params.collectionId = standardCollection.id + const [fragmentId] = standardCollection.fragments + req.params.fragmentId = fragmentId + req.params.userId = author.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('Collection does not have any authors') + expect(data.error).toEqual('Fragment and user do not match') }) - it('should return an error when the collection and the user do not match', async () => { + it('should return an error when the fragment does not exist', async () => { const req = httpMocks.createRequest({ body, }) req.user = submittingAuthor.id req.params.collectionId = standardCollection.id + req.params.fragmentId = 'invalid-fragment-id' req.params.userId = author.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('Collection and user do not match') + expect(data.error).toEqual( + `Fragment invalid-fragment-id does not match collection ${ + standardCollection.id + }`, + ) }) }) diff --git a/packages/component-user-manager/src/tests/fragmentsUsers/post.test.js b/packages/component-user-manager/src/tests/fragmentsUsers/post.test.js index b826f58d2a6fd26c78cac03392dc301e05ee8fca..f8783db6de7a72366f357a72827344c2ce45ff26 100644 --- a/packages/component-user-manager/src/tests/fragmentsUsers/post.test.js +++ b/packages/component-user-manager/src/tests/fragmentsUsers/post.test.js @@ -131,4 +131,23 @@ describe('Post fragments users route handler', () => { const data = JSON.parse(res._getData()) expect(data.error).toEqual('invalid-role is not defined') }) + it('should return an error when the fragment does not exist', async () => { + const req = httpMocks.createRequest({ + body, + }) + req.user = submittingAuthor.id + req.params.collectionId = standardCollection.id + req.params.fragmentId = 'invalid-fragment-id' + req.params.userId = author.id + const res = httpMocks.createResponse() + await require(postPath)(models)(req, res) + + expect(res.statusCode).toBe(400) + const data = JSON.parse(res._getData()) + expect(data.error).toEqual( + `Fragment invalid-fragment-id does not match collection ${ + standardCollection.id + }`, + ) + }) }) diff --git a/packages/component-user-manager/src/tests/helpers/Model.js b/packages/component-user-manager/src/tests/helpers/Model.js index e5f31fa11df30b229f84e129d41c33062f7b6d1d..db2c1aa562e02c44a1530f6f674dfbfb62938e0a 100644 --- a/packages/component-user-manager/src/tests/helpers/Model.js +++ b/packages/component-user-manager/src/tests/helpers/Model.js @@ -14,6 +14,9 @@ const build = () => { find: jest.fn(id => findMock(id, 'collections')), }, Team: {}, + Fragment: { + find: jest.fn(id => findMock(id, 'fragments', fixtures)), + }, } UserMock.find = jest.fn(id => findMock(id, 'users')) UserMock.findByEmail = jest.fn(email => findByEmailMock(email)) diff --git a/packages/component-user-manager/src/tests/users/resetPassword.test.js b/packages/component-user-manager/src/tests/users/resetPassword.test.js index f2a7522d2874cd428b57896a853943fe8dcb6d9b..325610530cadfa9922f05b87e60cd3bea14c7fbc 100644 --- a/packages/component-user-manager/src/tests/users/resetPassword.test.js +++ b/packages/component-user-manager/src/tests/users/resetPassword.test.js @@ -11,7 +11,10 @@ const chance = new Chance() const { author } = fixtures.users const clonedAuthor = clone(author) - +jest.mock('pubsweet-component-mail-service', () => ({ + sendSimpleEmail: jest.fn(), + sendNotificationEmail: jest.fn(), +})) const body = { email: clonedAuthor.email, firstName: clonedAuthor.firstName, diff --git a/packages/xpub-faraday/config/validations.js b/packages/xpub-faraday/config/validations.js index 2695bdacc5dca61ab377e95971de4ba2c867a280..a91cd4977f6b2806c783921d4aaf2182d46b29f5 100644 --- a/packages/xpub-faraday/config/validations.js +++ b/packages/xpub-faraday/config/validations.js @@ -72,13 +72,7 @@ module.exports = { reviewers: Joi.array(), lock: Joi.object(), decision: Joi.object(), - authors: Joi.array().items( - Joi.object({ - isSubmitting: Joi.boolean(), - isCorresponding: Joi.boolean(), - id: Joi.string().uuid(), - }), - ), + authors: Joi.array(), recommendations: Joi.array().items( Joi.object({ id: Joi.string().required(),