From dfb9c716ae9d582df67d49119c6f80b2165472ba Mon Sep 17 00:00:00 2001 From: Sebastian <sebastian.mihalache@thinslices.com> Date: Wed, 21 Feb 2018 14:16:54 +0200 Subject: [PATCH] add full create user tests --- packages/component-invite/src/routes/post.js | 8 +- .../src/tests/fixtures/collections.js | 4 +- .../src/tests/fixtures/fixtures.js | 2 + .../src/tests/fixtures/teams.js | 15 ++ .../src/tests/fixtures/users.js | 18 +++ .../component-invite/src/tests/mocks/Team.js | 16 +++ .../component-invite/src/tests/post.test.js | 136 +++++++++++++++--- 7 files changed, 171 insertions(+), 28 deletions(-) create mode 100644 packages/component-invite/src/tests/fixtures/teams.js create mode 100644 packages/component-invite/src/tests/mocks/Team.js diff --git a/packages/component-invite/src/routes/post.js b/packages/component-invite/src/routes/post.js index 52d366519..b70c27364 100644 --- a/packages/component-invite/src/routes/post.js +++ b/packages/component-invite/src/routes/post.js @@ -32,13 +32,13 @@ module.exports = models => async (req, res) => { res.status(inviteRight.status).json({ error: inviteRight.message, }) - logger.error(`incorrect role when inviting a user`) + logger.error(`incorrect role when inviting a ${role}`) return } } else if (collectionId) { if (!configRoles.collection.includes(role)) { res - .status(400) + .status(403) .json({ error: `Role ${role} cannot be set on collections` }) logger.error(`invitation has been attempted with invalid role: ${role}`) return @@ -65,7 +65,7 @@ module.exports = models => async (req, res) => { error: `${reqUser.roles || 'undefined roles'} cannot invite a ${role} without a collection`, }) - logger.error(`request user does not have any defined roles`) + logger.error(`cannot invite manuscript roles without a collection`) return } @@ -74,7 +74,7 @@ module.exports = models => async (req, res) => { if (user) { res.status(400).json({ error: 'User already exists' }) - logger.error('admin tried to invite existing user') + logger.error('someone tried to invite existing user') return } } catch (e) { diff --git a/packages/component-invite/src/tests/fixtures/collections.js b/packages/component-invite/src/tests/fixtures/collections.js index 959e3b413..91eaf3b20 100644 --- a/packages/component-invite/src/tests/fixtures/collections.js +++ b/packages/component-invite/src/tests/fixtures/collections.js @@ -1,12 +1,10 @@ -const users = require('./users') - module.exports = { standardCollection: { id: '2c4fb766-a798-4c32-b857-c5d21a2ab331', title: 'Standard Collection', type: 'collection', fragments: [], - owners: [users.admin.id], + owners: [], save: jest.fn(), }, } diff --git a/packages/component-invite/src/tests/fixtures/fixtures.js b/packages/component-invite/src/tests/fixtures/fixtures.js index b0a926aa1..0ea29e85a 100644 --- a/packages/component-invite/src/tests/fixtures/fixtures.js +++ b/packages/component-invite/src/tests/fixtures/fixtures.js @@ -1,7 +1,9 @@ const users = require('./users') const collections = require('./collections') +const teams = require('./teams') module.exports = { users, collections, + teams, } diff --git a/packages/component-invite/src/tests/fixtures/teams.js b/packages/component-invite/src/tests/fixtures/teams.js new file mode 100644 index 000000000..1410dc9e2 --- /dev/null +++ b/packages/component-invite/src/tests/fixtures/teams.js @@ -0,0 +1,15 @@ +const users = require('./users') + +module.exports = { + teamType: { + name: 'editorInChief', + permissions: 'editor', + }, + group: 'editor', + name: 'Editor in Chief', + object: { + type: 'collection', + id: '123', + }, + members: [users.editorInChief.id], +} diff --git a/packages/component-invite/src/tests/fixtures/users.js b/packages/component-invite/src/tests/fixtures/users.js index 6a13d1eb2..dc4e6ed5c 100644 --- a/packages/component-invite/src/tests/fixtures/users.js +++ b/packages/component-invite/src/tests/fixtures/users.js @@ -7,4 +7,22 @@ module.exports = { admin: true, id: 'admin123', }, + editorInChief: { + type: 'user', + username: 'editor', + email: 'editor@example.com', + password: 'test', + admin: false, + id: 'editor123', + roles: ['editorInChief'], + }, + handlingEditor: { + type: 'user', + username: 'handling', + email: 'handling@example.com', + password: 'test', + admin: false, + id: 'handling123', + roles: ['handlingEditor'], + }, } diff --git a/packages/component-invite/src/tests/mocks/Team.js b/packages/component-invite/src/tests/mocks/Team.js new file mode 100644 index 000000000..f84ef4dcf --- /dev/null +++ b/packages/component-invite/src/tests/mocks/Team.js @@ -0,0 +1,16 @@ +/* eslint-disable func-names-any */ + +function Team(properties) { + this.teamType = properties.teamType + this.group = properties.group + this.name = properties.name + this.object = properties.object + this.members = properties.members +} + +Team.prototype.save = jest.fn(function saveTeam() { + this.id = '111222' + return Promise.resolve(this) +}) + +module.exports = Team diff --git a/packages/component-invite/src/tests/post.test.js b/packages/component-invite/src/tests/post.test.js index dc39ab175..3d90848cf 100644 --- a/packages/component-invite/src/tests/post.test.js +++ b/packages/component-invite/src/tests/post.test.js @@ -6,11 +6,13 @@ const random = require('lodash/random') const fixtures = require('./fixtures/fixtures') const UserMock = require('./mocks/User') const Chance = require('chance') +const TeamMock = require('./mocks/Team') jest.mock('pubsweet-component-mail-service', () => ({ setupEmail: jest.fn() })) const chance = new Chance() const globalRoles = ['editorInChief', 'author', 'admin'] const manuscriptRoles = ['handlingEditor', 'reviewer'] + const buildModels = (collection, findUser, emailUser) => { const models = { User: {}, @@ -22,8 +24,8 @@ const buildModels = (collection, findUser, emailUser) => { : Promise.resolve(collection), ), }, + Team: {}, } - UserMock.find = jest.fn( () => findUser instanceof Error @@ -38,6 +40,7 @@ const buildModels = (collection, findUser, emailUser) => { ) models.User = UserMock + models.Team = TeamMock return models } @@ -51,22 +54,22 @@ const body = { } body.admin = body.role === 'admin' -const getNotFoundError = () => { - const error = new Error() - error.name = 'NotFoundError' - error.status = 404 +const notFoundError = new Error() +notFoundError.name = 'NotFoundError' +notFoundError.status = 404 + +const adminUser = fixtures.users.admin +const editorInChiefUser = fixtures.users.editorInChief +const handlingEditorUser = fixtures.users.handlingEditor - return error -} describe('Post invite route handler', () => { - it('should return success when the admin invites an Editor in Chief, Author or Admin', async () => { + it('should return success when the admin invites a global role', async () => { const req = httpMocks.createRequest({ body, }) - req.user = fixtures.users.admin + req.user = adminUser const res = httpMocks.createResponse() - const error = getNotFoundError() - const models = buildModels(error, fixtures.users.admin, error) + const models = buildModels(notFoundError, adminUser, notFoundError) await require('../routes/post')(models)(req, res) expect(res.statusCode).toBe(200) @@ -80,11 +83,10 @@ describe('Post invite route handler', () => { const req = httpMocks.createRequest({ body, }) - req.user = fixtures.users.admin + req.user = adminUser req.params.collectionId = '123' const res = httpMocks.createResponse() - const error = getNotFoundError() - const models = buildModels(error, fixtures.users.admin) + const models = buildModels(notFoundError, adminUser) await require('../routes/post')(models)(req, res) expect(res.statusCode).toBe(403) const data = JSON.parse(res._getData()) @@ -94,13 +96,13 @@ describe('Post invite route handler', () => { }) it('should return an error when the admin invites a manuscript role', async () => { body.role = manuscriptRoles[random(0, manuscriptRoles.length - 1)] + body.admin = false const req = httpMocks.createRequest({ body, }) - req.user = fixtures.users.admin + req.user = adminUser const res = httpMocks.createResponse() - const error = getNotFoundError() - const models = buildModels(error, fixtures.users.admin) + const models = buildModels(notFoundError, adminUser) await require('../routes/post')(models)(req, res) expect(res.statusCode).toBe(403) const data = JSON.parse(res._getData()) @@ -111,13 +113,105 @@ describe('Post invite route handler', () => { const req = httpMocks.createRequest({ body, }) - req.user = fixtures.users.admin + req.user = adminUser const res = httpMocks.createResponse() - const error = getNotFoundError() - const models = buildModels(error, fixtures.users.admin) + const models = buildModels(notFoundError, adminUser) await require('../routes/post')(models)(req, res) expect(res.statusCode).toBe(400) const data = JSON.parse(res._getData()) - expect(data.error).toEqual(`Email and role are required`) + expect(data.error).toEqual('Email and role are required') + body.email = chance.email() + }) + it('should return an error when the a non-admin invites a globalRole on a collection', async () => { + body.role = globalRoles[random(0, globalRoles.length - 1)] + body.admin = body.role === 'admin' + const req = httpMocks.createRequest({ + body, + }) + req.user = editorInChiefUser + req.params.collectionId = '123' + const res = httpMocks.createResponse() + const models = buildModels(notFoundError, editorInChiefUser) + await require('../routes/post')(models)(req, res) + expect(res.statusCode).toBe(403) + const data = JSON.parse(res._getData()) + expect(data.error).toEqual(`Role ${body.role} cannot be set on collections`) + }) + it('should return an error when an non-admin invites without a collection', async () => { + body.role = manuscriptRoles[random(0, manuscriptRoles.length - 1)] + body.admin = false + const req = httpMocks.createRequest({ + body, + }) + req.user = editorInChiefUser + const res = httpMocks.createResponse() + + const models = buildModels(notFoundError, editorInChiefUser) + await require('../routes/post')(models)(req, res) + expect(res.statusCode).toBe(403) + // console.log(res._getData()) + const data = JSON.parse(res._getData()) + expect(data.error).toEqual( + `${req.user.roles} cannot invite a ${body.role} without a collection`, + ) + }) + it('should return an error when inviting an existing user', async () => { + body.role = globalRoles[random(0, globalRoles.length - 1)] + body.admin = body.role === 'admin' + const req = httpMocks.createRequest({ + body, + }) + req.user = adminUser + const res = httpMocks.createResponse() + const models = buildModels(notFoundError, adminUser, editorInChiefUser) + await require('../routes/post')(models)(req, res) + + expect(res.statusCode).toBe(400) + const data = JSON.parse(res._getData()) + expect(data.error).toEqual('User already exists') + }) + it('should return success when the editor in chief invites a manuscript role with a collection', async () => { + body.role = manuscriptRoles[random(0, manuscriptRoles.length - 1)] + body.admin = false + const req = httpMocks.createRequest({ + body, + }) + req.user = editorInChiefUser + req.params.collectionId = '123' + const res = httpMocks.createResponse() + const models = buildModels( + fixtures.collections.standardCollection, + editorInChiefUser, + notFoundError, + ) + await require('../routes/post')(models)(req, res) + + expect(res.statusCode).toBe(200) + const data = JSON.parse(res._getData()) + expect(data.roles[0]).toEqual(body.role) + expect(data.firstName).toEqual(body.firstName) + expect(data.email).toEqual(body.email) + }) + it('should return success when the handlintEditor invites a reviewer with a collection', async () => { + body.role = 'reviewer' + body.admin = false + const req = httpMocks.createRequest({ + body, + }) + req.user = handlingEditorUser + req.params.collectionId = '123' + const res = httpMocks.createResponse() + const models = buildModels( + fixtures.collections.standardCollection, + handlingEditorUser, + notFoundError, + ) + await require('../routes/post')(models)(req, res) + + expect(res.statusCode).toBe(200) + const data = JSON.parse(res._getData()) + expect(data.roles[0]).toEqual(body.role) + expect(data.firstName).toEqual(body.firstName) + expect(data.email).toEqual(body.email) }) }) -- GitLab