From 9bd5b1371b6725c59e18147df4190be0e9778c87 Mon Sep 17 00:00:00 2001
From: Sebastian <sebastian.mihalache@thinslices.com>
Date: Wed, 28 Feb 2018 16:11:43 +0000
Subject: [PATCH] test(component-invite): add multiple assignations to a user

---
 .../src/controllers/assignCollectionRole.js   |  3 ++-
 .../src/routes/postAssignation.js             | 24 +++++++++++--------
 .../src/tests/fixtures/users.js               | 12 ++++++----
 .../src/tests/postAssignation.test.js         | 10 ++++----
 .../src/tests/postInvite.test.js              |  4 ++--
 packages/xpub-faraday/config/validations.js   |  2 +-
 6 files changed, 31 insertions(+), 24 deletions(-)

diff --git a/packages/component-invite/src/controllers/assignCollectionRole.js b/packages/component-invite/src/controllers/assignCollectionRole.js
index cccf36662..aa1943241 100644
--- a/packages/component-invite/src/controllers/assignCollectionRole.js
+++ b/packages/component-invite/src/controllers/assignCollectionRole.js
@@ -47,7 +47,8 @@ module.exports = async (
       isAccepted: false,
       collectionId,
     }
-    user.assignation = assignation
+    user.assignations = []
+    user.assignations.push(assignation)
     user = await user.save()
     await mailService.setupAssignEmail(
       user.email,
diff --git a/packages/component-invite/src/routes/postAssignation.js b/packages/component-invite/src/routes/postAssignation.js
index 17f841bbb..5829a21ed 100644
--- a/packages/component-invite/src/routes/postAssignation.js
+++ b/packages/component-invite/src/routes/postAssignation.js
@@ -11,31 +11,35 @@ module.exports = models => async (req, res) => {
   }
 
   const user = await models.User.find(req.user)
-  if (!user.assignation) {
+  if (!user.assignations) {
     res.status(400).json({ error: 'The user has no assignation' })
     logger.error('The request user does not have any assignation')
     return
   }
   const { collectionId } = req.params
-  if (collectionId !== user.assignation.collectionId) {
+  const assignations = user.assignations.filter(
+    assignation => assignation.collectionId === collectionId,
+  )
+
+  if (assignations.length === 0) {
     res.status(400).json({
-      error: 'User collection and provided collection do not match',
+      error: `Collection ${collectionId} does not match any user assignation`,
     })
     logger.error(
-      `Param ${collectionId} does not match user collection: ${
-        user.assignation.collectionId
-      }`,
+      `Collection ${collectionId} does not match any user assignation`,
     )
     return
   }
 
-  if (type !== user.assignation.type) {
+  const matchingAssignation = assignations[0]
+
+  if (type !== matchingAssignation.type) {
     res.status(400).json({
       error: 'User assignation type and provided type do not match',
     })
     logger.error(
       `Param ${type} does not match user assignation type: ${
-        user.assignation.type
+        matchingAssignation.type
       }`,
     )
     return
@@ -44,9 +48,9 @@ module.exports = models => async (req, res) => {
   try {
     await models.Collection.find(collectionId)
     // TODO: create a team and add the team id to the user's teams array
-    user.assignation.hasAnswer = true
+    matchingAssignation.hasAnswer = true
     if (accept === true) {
-      user.assignation.isAccepted = true
+      matchingAssignation.isAccepted = true
     }
     await user.save()
     res.status(204).json()
diff --git a/packages/component-invite/src/tests/fixtures/users.js b/packages/component-invite/src/tests/fixtures/users.js
index 012d67453..b918c91c6 100644
--- a/packages/component-invite/src/tests/fixtures/users.js
+++ b/packages/component-invite/src/tests/fixtures/users.js
@@ -31,11 +31,13 @@ const users = {
     admin: false,
     id: 'handling123',
     roles: ['handlingEditor'],
-    assignation: {
-      type: 'handlingEditor',
-      hasAnswer: false,
-      isAccepted: false,
-    },
+    assignations: [
+      {
+        type: 'handlingEditor',
+        hasAnswer: false,
+        isAccepted: false,
+      },
+    ],
     save: jest.fn(() => users.handlingEditor),
   },
   author: {
diff --git a/packages/component-invite/src/tests/postAssignation.test.js b/packages/component-invite/src/tests/postAssignation.test.js
index 5610f418c..a2e4dbd9b 100644
--- a/packages/component-invite/src/tests/postAssignation.test.js
+++ b/packages/component-invite/src/tests/postAssignation.test.js
@@ -53,8 +53,8 @@ describe('Post assignation route handler', () => {
     await require(postAssignationPath)(models)(req, res)
 
     expect(res.statusCode).toBe(204)
-    expect(acceptingHE.assignation.hasAnswer).toBeTruthy()
-    expect(acceptingHE.assignation.isAccepted).toBeTruthy()
+    expect(acceptingHE.assignations[0].hasAnswer).toBeTruthy()
+    expect(acceptingHE.assignations[0].isAccepted).toBeTruthy()
   })
   it('should return success when the handling editor refuses work on a collection', async () => {
     const refusingHE = cloneDeep(handlingEditor)
@@ -71,8 +71,8 @@ describe('Post assignation route handler', () => {
     await require(postAssignationPath)(models)(req, res)
 
     expect(res.statusCode).toBe(204)
-    expect(refusingHE.assignation.hasAnswer).toBeTruthy()
-    expect(refusingHE.assignation.isAccepted).toBeFalsy()
+    expect(refusingHE.assignations[0].hasAnswer).toBeTruthy()
+    expect(refusingHE.assignations[0].isAccepted).toBeFalsy()
   })
   it('should return an error params are missing', async () => {
     const body = {
@@ -116,7 +116,7 @@ describe('Post assignation route handler', () => {
     const req = httpMocks.createRequest({
       body,
     })
-    delete noAssignationEditor.assignation
+    delete noAssignationEditor.assignations
     req.user = noAssignationEditor
     const res = httpMocks.createResponse()
     const models = buildModels(standardCollection, noAssignationEditor)
diff --git a/packages/component-invite/src/tests/postInvite.test.js b/packages/component-invite/src/tests/postInvite.test.js
index d03f3ebc8..5a3bdc423 100644
--- a/packages/component-invite/src/tests/postInvite.test.js
+++ b/packages/component-invite/src/tests/postInvite.test.js
@@ -208,7 +208,7 @@ describe('Post invite route handler', () => {
     const data = JSON.parse(res._getData())
     expect(data.roles).toContain(body.role)
     expect(data.email).toEqual(body.email)
-    expect(data.assignation.collectionId).toEqual(req.params.collectionId)
+    expect(data.assignations[0].collectionId).toEqual(req.params.collectionId)
   })
   it('should return success when the handlingEditor invites a reviewer with a collection', async () => {
     const body = {
@@ -228,6 +228,6 @@ describe('Post invite route handler', () => {
     const data = JSON.parse(res._getData())
     expect(data.roles).toContain(body.role)
     expect(data.email).toEqual(body.email)
-    expect(data.assignation.collectionId).toEqual(req.params.collectionId)
+    expect(data.assignations[0].collectionId).toEqual(req.params.collectionId)
   })
 })
diff --git a/packages/xpub-faraday/config/validations.js b/packages/xpub-faraday/config/validations.js
index 4a7535172..49323a02f 100644
--- a/packages/xpub-faraday/config/validations.js
+++ b/packages/xpub-faraday/config/validations.js
@@ -93,7 +93,7 @@ module.exports = {
     lastName: Joi.string().allow(''),
     affiliation: Joi.string().allow(''),
     title: Joi.string().allow(''),
-    assignation: Joi.object(),
+    assignations: Joi.array(),
   },
   team: {
     group: Joi.string(),
-- 
GitLab