From 6fc522320456a841b47145ec1970c257c80fd6f0 Mon Sep 17 00:00:00 2001
From: Sebastian <sebastian.mihalache@thinslices.com>
Date: Wed, 21 Feb 2018 10:22:31 +0200
Subject: [PATCH] add create user test

---
 packages/component-invite/package.json        | 12 ++-
 packages/component-invite/src/routes/post.js  |  2 +-
 .../component-invite/src/tests/mocks/User.js  |  6 ++
 .../component-invite/src/tests/post.test.js   | 84 ++++++++++++++++---
 yarn.lock                                     |  6 +-
 5 files changed, 93 insertions(+), 17 deletions(-)

diff --git a/packages/component-invite/package.json b/packages/component-invite/package.json
index c76ac6873..8f82cd7d5 100644
--- a/packages/component-invite/package.json
+++ b/packages/component-invite/package.json
@@ -14,7 +14,8 @@
     "url": "https://gitlab.coko.foundation/xpub/xpub"
   },
   "dependencies": {
-    "body-parser": "^1.17.2"
+    "body-parser": "^1.17.2",
+    "chance": "^1.0.13"
   },
   "peerDependencies": {
     "@pubsweet/logger": "^0.0.1",
@@ -30,7 +31,12 @@
     "moduleNameMapper": {
       "\\.s?css$": "identity-obj-proxy"
     },
-    "transformIgnorePatterns": ["/node_modules/(?!@?pubsweet)"],
-    "testPathIgnorePatterns": ["/node_modules", "config/"]
+    "transformIgnorePatterns": [
+      "/node_modules/(?!@?pubsweet)"
+    ],
+    "testPathIgnorePatterns": [
+      "/node_modules",
+      "config/"
+    ]
   }
 }
diff --git a/packages/component-invite/src/routes/post.js b/packages/component-invite/src/routes/post.js
index e48f0a824..52d366519 100644
--- a/packages/component-invite/src/routes/post.js
+++ b/packages/component-invite/src/routes/post.js
@@ -14,7 +14,7 @@ module.exports = models => async (req, res) => {
     logger.error('some parameters are missing')
     return
   }
-  // console.log(req.body)
+
   const collectionId = get(req, 'params.collectionId')
   const reqUser = await models.User.find(req.user)
   let collection
diff --git a/packages/component-invite/src/tests/mocks/User.js b/packages/component-invite/src/tests/mocks/User.js
index ae155c2ca..9a7459fc5 100644
--- a/packages/component-invite/src/tests/mocks/User.js
+++ b/packages/component-invite/src/tests/mocks/User.js
@@ -5,6 +5,12 @@ function User(properties) {
   this.email = properties.email
   this.username = properties.username
   this.password = properties.password
+  this.roles = properties.roles
+  this.title = properties.title
+  this.affiliation = properties.affiliation
+  this.firstName = properties.firstName
+  this.lastName = properties.lastName
+  this.admin = properties.admin
 }
 
 User.prototype.save = jest.fn(function saveUser() {
diff --git a/packages/component-invite/src/tests/post.test.js b/packages/component-invite/src/tests/post.test.js
index bb137ad5a..dc39ab175 100644
--- a/packages/component-invite/src/tests/post.test.js
+++ b/packages/component-invite/src/tests/post.test.js
@@ -5,8 +5,12 @@ const httpMocks = require('node-mocks-http')
 const random = require('lodash/random')
 const fixtures = require('./fixtures/fixtures')
 const UserMock = require('./mocks/User')
+const Chance = require('chance')
 
-const roles = ['editorInChief', 'author', 'admin']
+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: {},
@@ -37,27 +41,83 @@ const buildModels = (collection, findUser, emailUser) => {
   return models
 }
 
+const body = {
+  email: chance.email(),
+  role: globalRoles[random(0, globalRoles.length - 1)],
+  firstName: chance.first(),
+  lastName: chance.last(),
+  title: 'professor',
+  affiliation: 'MIT',
+}
+body.admin = body.role === 'admin'
+
+const getNotFoundError = () => {
+  const error = new Error()
+  error.name = 'NotFoundError'
+  error.status = 404
+
+  return error
+}
 describe('Post invite route handler', () => {
   it('should return success when the admin invites an Editor in Chief, Author or Admin', async () => {
-    const body = {
-      email: 'sebi.mihalache@gmail.com',
-      role: roles[random(0, roles.length - 1)],
-      firstName: 'john',
-      lastName: 'smith',
-      title: 'professor',
-      affiliation: 'MIT',
-    }
     const req = httpMocks.createRequest({
       body,
     })
     req.user = fixtures.users.admin
     const res = httpMocks.createResponse()
-    const error = new Error()
-    error.name = 'NotFoundError'
-    error.status = 404
+    const error = getNotFoundError()
     const models = buildModels(error, fixtures.users.admin, error)
     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)
+    expect(data.admin).toEqual(body.admin)
+  })
+  it('should return an error when the admin invites an user on a collection', async () => {
+    const req = httpMocks.createRequest({
+      body,
+    })
+    req.user = fixtures.users.admin
+    req.params.collectionId = '123'
+    const res = httpMocks.createResponse()
+    const error = getNotFoundError()
+    const models = buildModels(error, fixtures.users.admin)
+    await require('../routes/post')(models)(req, res)
+    expect(res.statusCode).toBe(403)
+    const data = JSON.parse(res._getData())
+    expect(data.error).toEqual(
+      `admin cannot invite an ${body.role} to a collection`,
+    )
+  })
+  it('should return an error when the admin invites a manuscript role', async () => {
+    body.role = manuscriptRoles[random(0, manuscriptRoles.length - 1)]
+    const req = httpMocks.createRequest({
+      body,
+    })
+    req.user = fixtures.users.admin
+    const res = httpMocks.createResponse()
+    const error = getNotFoundError()
+    const models = buildModels(error, fixtures.users.admin)
+    await require('../routes/post')(models)(req, res)
+    expect(res.statusCode).toBe(403)
+    const data = JSON.parse(res._getData())
+    expect(data.error).toEqual(`admin cannot invite a ${body.role}`)
+  })
+  it('should return an error params are missing', async () => {
+    delete body.email
+    const req = httpMocks.createRequest({
+      body,
+    })
+    req.user = fixtures.users.admin
+    const res = httpMocks.createResponse()
+    const error = getNotFoundError()
+    const models = buildModels(error, fixtures.users.admin)
+    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`)
   })
 })
diff --git a/yarn.lock b/yarn.lock
index c0723efbc..64ea89118 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1948,6 +1948,10 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1:
     escape-string-regexp "^1.0.5"
     supports-color "^5.2.0"
 
+chance@^1.0.13:
+  version "1.0.13"
+  resolved "https://registry.yarnpkg.com/chance/-/chance-1.0.13.tgz#666bec2db42b3084456a3e4f4c28a82db5ccb7e6"
+
 change-emitter@^0.1.2:
   version "0.1.6"
   resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515"
@@ -8938,7 +8942,7 @@ prompt@^1.0.0:
     utile "0.3.x"
     winston "2.1.x"
 
-"prompt@github:flatiron/prompt#1c95d1d8d333b5fbc13fa5f0619f3dcf0d514f87":
+prompt@flatiron/prompt#1c95d1d8d333b5fbc13fa5f0619f3dcf0d514f87:
   version "1.0.0"
   resolved "https://codeload.github.com/flatiron/prompt/tar.gz/1c95d1d8d333b5fbc13fa5f0619f3dcf0d514f87"
   dependencies:
-- 
GitLab