From d0749fe9ab95cc6ba159bd3aea4242f007235fe8 Mon Sep 17 00:00:00 2001
From: Sebastian Mihalache <sebastian.mihalache@gmail.con>
Date: Tue, 12 Jun 2018 17:25:48 +0300
Subject: [PATCH] feat(component-user-manager): update remaining tests

---
 .../src/tests/fixtures/collections.js         |  7 ---
 .../src/tests/fixtures/fixtures.js            |  2 +
 .../src/tests/fixtures/fragments.js           |  9 ++++
 .../src/tests/fixtures/teams.js               |  8 +--
 .../src/tests/fragmentsUsers/delete.test.js   | 42 ++++++++++++---
 .../src/tests/fragmentsUsers/get.test.js      | 37 +++++++++++--
 .../src/tests/fragmentsUsers/patch.test.js    | 54 +++++++++++--------
 .../src/tests/fragmentsUsers/post.test.js     | 19 +++++++
 .../src/tests/helpers/Model.js                |  3 ++
 .../src/tests/users/resetPassword.test.js     |  5 +-
 packages/xpub-faraday/config/validations.js   |  8 +--
 11 files changed, 141 insertions(+), 53 deletions(-)

diff --git a/packages/component-user-manager/src/tests/fixtures/collections.js b/packages/component-user-manager/src/tests/fixtures/collections.js
index 6c4e02668..0d7c8b7f9 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 0ea29e85a..c6a428848 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 08d0eedf3..298f8342b 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 410b999e3..d3ddc7046 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 7242ac5c7..1a905e976 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 b5975b4ed..5045a72d0 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 03c35f392..038df5208 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 b826f58d2..f8783db6d 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 e5f31fa11..db2c1aa56 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 f2a7522d2..325610530 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 2695bdacc..a91cd4977 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(),
-- 
GitLab