From cc42d9d4d365f595bc2ea08c2eb58ec5b8ade7c5 Mon Sep 17 00:00:00 2001
From: malexsan <alexandru.munt@gmail.com>
Date: Fri, 14 Dec 2018 12:02:43 +0200
Subject: [PATCH] test(add tests for component user use cases):

---
 .../src/modals/OpenModal.js                   |  5 --
 .../src/helpers/Model.js                      |  3 +
 .../app/components/OpenUserForm.js            |  2 +-
 .../server/tests/activateUser.test.js         | 27 +++++++-
 .../server/tests/createUserAsAdmin.test.js    | 64 +++++++++++++++++++
 .../server/tests/deactivateUser.test.js       | 28 ++++++++
 .../server/tests/editUser.test.js             | 30 +++++++++
 .../server/use-cases/activateUser.js          |  2 +-
 .../server/use-cases/deactivateUser.js        |  2 +-
 9 files changed, 153 insertions(+), 10 deletions(-)
 create mode 100644 packages/component-user/server/tests/createUserAsAdmin.test.js
 create mode 100644 packages/component-user/server/tests/deactivateUser.test.js
 create mode 100644 packages/component-user/server/tests/editUser.test.js

diff --git a/packages/component-faraday-ui/src/modals/OpenModal.js b/packages/component-faraday-ui/src/modals/OpenModal.js
index e713ea392..6e5bc43d2 100644
--- a/packages/component-faraday-ui/src/modals/OpenModal.js
+++ b/packages/component-faraday-ui/src/modals/OpenModal.js
@@ -24,11 +24,6 @@ const selectModalComponent = props => {
       modalComponent: props.component,
     }
   }
-  if (props.single) {
-    return {
-      modalComponent: props.component,
-    }
-  }
   if (props.single) {
     return {
       modalComponent: SingleActionModal,
diff --git a/packages/component-fixture-manager/src/helpers/Model.js b/packages/component-fixture-manager/src/helpers/Model.js
index b59599b91..1f292351b 100644
--- a/packages/component-fixture-manager/src/helpers/Model.js
+++ b/packages/component-fixture-manager/src/helpers/Model.js
@@ -26,6 +26,9 @@ const build = fixtures => {
   UserMock.updateProperties = jest.fn(user =>
     updatePropertiesMock(user, 'users'),
   )
+  UserMock.update = jest.fn((id, input) => input)
+  UserMock.fetchOne = jest.fn(user => user)
+  UserMock.create = jest.fn(input => input)
 
   TeamMock.find = jest.fn(id => findMock(id, 'teams', fixtures))
   TeamMock.updateProperties = jest.fn(team =>
diff --git a/packages/component-user/app/components/OpenUserForm.js b/packages/component-user/app/components/OpenUserForm.js
index 481a3b503..985c02360 100644
--- a/packages/component-user/app/components/OpenUserForm.js
+++ b/packages/component-user/app/components/OpenUserForm.js
@@ -20,9 +20,9 @@ const OpenUserForm = ({ edit, user, onSubmit, modalKey }) => (
       edit ? (
         <IconButton
           fontIcon="editIcon"
-          paddingBottom={1.5}
           iconSize={2}
           onClick={showModal}
+          paddingBottom={1.5}
           pt={1 / 2}
         />
       ) : (
diff --git a/packages/component-user/server/tests/activateUser.test.js b/packages/component-user/server/tests/activateUser.test.js
index 20d542400..864b65f69 100644
--- a/packages/component-user/server/tests/activateUser.test.js
+++ b/packages/component-user/server/tests/activateUser.test.js
@@ -1,5 +1,28 @@
+const { cloneDeep } = require('lodash')
+const { Model, fixtures } = require('pubsweet-component-fixture-service')
+
+const { activateUser } = require('../use-cases')
+
 describe('activate use case', () => {
-  it('should work', () => {
-    expect(true).toBeFalsy()
+  let testFixtures = {}
+  let models
+  const invalidPrefix = 'invalid***'
+
+  beforeEach(() => {
+    testFixtures = cloneDeep(fixtures)
+    models = Model.build(testFixtures)
+  })
+
+  it('activate an user', async () => {
+    const { user } = testFixtures.users
+    user.username = `${invalidPrefix}${user.username}`
+    user.isActive = false
+
+    const result = await activateUser
+      .initialize({ User: models.User })
+      .execute({ id: user.id, input: user })
+
+    expect(result.isActive).toBeTruthy()
+    expect(result.username.indexOf(invalidPrefix)).toBeLessThan(0)
   })
 })
diff --git a/packages/component-user/server/tests/createUserAsAdmin.test.js b/packages/component-user/server/tests/createUserAsAdmin.test.js
new file mode 100644
index 000000000..80c3155a6
--- /dev/null
+++ b/packages/component-user/server/tests/createUserAsAdmin.test.js
@@ -0,0 +1,64 @@
+const { cloneDeep } = require('lodash')
+const { Model, fixtures } = require('pubsweet-component-fixture-service')
+
+const { createUserAsAdmin } = require('../use-cases')
+
+class MockNotification {
+  constructor(user) {
+    this.user = user
+  }
+
+  async notifyUserAddedByAdmin(role) {
+    jest.fn(() => this)
+  }
+}
+
+describe('create user', () => {
+  let testFixtures = {}
+  let models
+
+  beforeEach(() => {
+    testFixtures = cloneDeep(fixtures)
+    models = Model.build(testFixtures)
+  })
+
+  it('edit an user as admin', async () => {
+    const input = {
+      email: 'alexandrescu@gmail.com',
+      username: 'alexandrescu@gmail.com',
+    }
+    const ctx = {
+      user: {
+        admin: true,
+      },
+    }
+
+    const result = await createUserAsAdmin
+      .initialize({ User: models.User, Notification: MockNotification, ctx })
+      .execute({
+        input,
+      })
+
+    expect(result).toMatchObject(input)
+  })
+
+  it('does not allow non admins to create user', async (...props) => {
+    const ctx = {
+      user: {
+        admin: false,
+      },
+    }
+
+    try {
+      await createUserAsAdmin
+        .initialize({
+          User: models.User,
+          Notification: MockNotification,
+          ctx,
+        })
+        .execute({})
+    } catch (e) {
+      expect(e.message).toBe('Unauthorized')
+    }
+  })
+})
diff --git a/packages/component-user/server/tests/deactivateUser.test.js b/packages/component-user/server/tests/deactivateUser.test.js
new file mode 100644
index 000000000..46a335ffa
--- /dev/null
+++ b/packages/component-user/server/tests/deactivateUser.test.js
@@ -0,0 +1,28 @@
+const { cloneDeep } = require('lodash')
+const { Model, fixtures } = require('pubsweet-component-fixture-service')
+
+const { deactivateUser } = require('../use-cases')
+
+describe('deactivate use case', () => {
+  let testFixtures = {}
+  let models
+  const invalidPrefix = 'invalid***'
+
+  beforeEach(() => {
+    testFixtures = cloneDeep(fixtures)
+    models = Model.build(testFixtures)
+  })
+
+  it('deactivate an user', async () => {
+    const { user } = testFixtures.users
+    user.isActive = false
+
+    const result = await deactivateUser
+      .initialize({ User: models.User })
+      .execute({ id: user.id, input: user })
+
+    expect(result.isActive).toBeFalsy()
+    // invalid prefix should be present in the username
+    expect(result.username.indexOf(invalidPrefix)).toBeGreaterThanOrEqual(0)
+  })
+})
diff --git a/packages/component-user/server/tests/editUser.test.js b/packages/component-user/server/tests/editUser.test.js
new file mode 100644
index 000000000..baf29782f
--- /dev/null
+++ b/packages/component-user/server/tests/editUser.test.js
@@ -0,0 +1,30 @@
+const { cloneDeep } = require('lodash')
+const { Model, fixtures } = require('pubsweet-component-fixture-service')
+
+const { editUser } = require('../use-cases')
+
+describe('edit user as admin', () => {
+  let testFixtures = {}
+  let models
+
+  beforeEach(() => {
+    testFixtures = cloneDeep(fixtures)
+    models = Model.build(testFixtures)
+  })
+
+  it('edit an user', async () => {
+    const { user } = testFixtures.users
+    const input = {
+      ...user,
+      affiliation: 'TSD',
+      firstName: 'Sebibastian',
+    }
+
+    const result = await editUser.initialize({ User: models.User }).execute({
+      id: input.id,
+      input,
+    })
+
+    expect(result).toMatchObject(input)
+  })
+})
diff --git a/packages/component-user/server/use-cases/activateUser.js b/packages/component-user/server/use-cases/activateUser.js
index 74256c6c9..7572f52fc 100644
--- a/packages/component-user/server/use-cases/activateUser.js
+++ b/packages/component-user/server/use-cases/activateUser.js
@@ -1,6 +1,6 @@
 module.exports.initialize = ({ User, ctx }) => ({
   execute: async ({ id, input }) => {
     const username = input.username.replace('invalid***', '')
-    return User.update(id, { ...input, username }, ctx)
+    return User.update(id, { ...input, username, isActive: true }, ctx)
   },
 })
diff --git a/packages/component-user/server/use-cases/deactivateUser.js b/packages/component-user/server/use-cases/deactivateUser.js
index 02747935d..6c1703b63 100644
--- a/packages/component-user/server/use-cases/deactivateUser.js
+++ b/packages/component-user/server/use-cases/deactivateUser.js
@@ -2,6 +2,6 @@ module.exports.initialize = ({ User, ctx }) => ({
   execute: async ({ id, input }) => {
     const username = `invalid***${input.username}`
 
-    return User.update(id, { ...input, username }, ctx)
+    return User.update(id, { ...input, username, isActive: false }, ctx)
   },
 })
-- 
GitLab