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