From 5bfedb5e2c371bc07bdd0786ad732c69e645d49d Mon Sep 17 00:00:00 2001
From: Samuel Galson <samgalson@gmail.com>
Date: Tue, 17 Apr 2018 12:14:11 +0100
Subject: [PATCH] refactor(jest-env): mock pubsweet db module instead

---
 app/jest.config.js              |  6 +++++
 client/jest.config.js           |  6 +++++
 config/test.js                  |  1 -
 package.json                    |  8 +-----
 server/auth/orcid.test.js       |  9 +++++++
 server/db-helpers/index.js      |  5 ----
 server/jest-setup.js            | 37 +++++++++++++++++++++++++
 server/jest.config.js           |  7 +++++
 server/submission/index.test.js | 45 +++++++++++++++++++++++++++++++
 server/submission/package.json  |  4 ++-
 yarn.lock                       | 48 ++++++++++++++++++++++++++++++---
 11 files changed, 158 insertions(+), 18 deletions(-)
 create mode 100644 app/jest.config.js
 create mode 100644 client/jest.config.js
 create mode 100644 server/jest-setup.js
 create mode 100644 server/jest.config.js
 create mode 100644 server/submission/index.test.js

diff --git a/app/jest.config.js b/app/jest.config.js
new file mode 100644
index 0000000..dab70a4
--- /dev/null
+++ b/app/jest.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+  rootDir: '../',
+  setupTestFrameworkScriptFile: '<rootDir>/test/helpers/jest-setup.js',
+  testMatch: ['<rootDir>/test/**/*.test.js'],
+  transformIgnorePatterns: ['/node_modules/(?!@?pubsweet)'],
+}
diff --git a/client/jest.config.js b/client/jest.config.js
new file mode 100644
index 0000000..f99f058
--- /dev/null
+++ b/client/jest.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+  rootDir: '../',
+  setupTestFrameworkScriptFile: '<rootDir>/test/helpers/jest-setup.js',
+  testMatch: ['<rootDir>/client/**/*.test.js'],
+  transformIgnorePatterns: ['/node_modules/(?!@?pubsweet)'],
+}
diff --git a/config/test.js b/config/test.js
index 7a16ffb..e0e8f37 100644
--- a/config/test.js
+++ b/config/test.js
@@ -2,7 +2,6 @@ const { deferConfig } = require('config/defer')
 
 module.exports = {
   'pubsweet-server': {
-    db: { database: global.__testDbName || 'test' },
     port: 4000,
     baseUrl: deferConfig(
       cfg => `http://localhost:${cfg['pubsweet-server'].port}`,
diff --git a/package.json b/package.json
index 152459b..51db374 100644
--- a/package.json
+++ b/package.json
@@ -55,13 +55,7 @@
     ]
   },
   "jest": {
-    "setupTestFrameworkScriptFile": "<rootDir>/test/helpers/jest-setup.js",
-    "testMatch": [
-      "**/*.test.js"
-    ],
-    "transformIgnorePatterns": [
-      "/node_modules/(?!@?pubsweet)"
-    ]
+    "projects": ["<rootDir>/client", "<rootDir>/app", "<rootDir>/server"]
   },
   "resolutions": {
     "grid-styled/styled-components": "3.2.5"
diff --git a/server/auth/orcid.test.js b/server/auth/orcid.test.js
index ec0f44a..485094a 100644
--- a/server/auth/orcid.test.js
+++ b/server/auth/orcid.test.js
@@ -11,6 +11,15 @@ const makeApp = () => {
   return supertest(app)
 }
 
+/* Example JWT
+ * {
+ *   "username": "0000000331460256",
+ *   "id": "7a9da753-93f7-4245-bc85-10058d578e40",
+ *   "iat": 1523965654,
+ *   "exp": 1524052054
+ * }
+ */
+
 describe('ORCID auth', () => {
   beforeEach(() => createTables(true))
 
diff --git a/server/db-helpers/index.js b/server/db-helpers/index.js
index ce46d7a..25ec409 100644
--- a/server/db-helpers/index.js
+++ b/server/db-helpers/index.js
@@ -1,5 +1,4 @@
 const uuid = require('uuid')
-
 const Model = require('pubsweet-server/src/models/Model')
 // const NotFoundError = require('pubsweet-server/src/errors/NotFoundError')
 const db = require('pubsweet-server/src/db')
@@ -37,10 +36,6 @@ const select = async selector => {
     Object.values(selector),
   )
 
-  /* if (!rows.length) { */
-  /*     return {}; */
-  /* } */
-
   return rows
   // return manuscriptToGraphql(rows[0].data, rows[0].id)
 }
diff --git a/server/jest-setup.js b/server/jest-setup.js
new file mode 100644
index 0000000..e80ddc2
--- /dev/null
+++ b/server/jest-setup.js
@@ -0,0 +1,37 @@
+let testDbName
+
+jest.mock('pubsweet-server/src/db', () => {
+  const pg = require('pg')
+  const logger = require('@pubsweet/logger')
+  testDbName = `test_${Math.floor(Math.random() * 9999999)}`
+  const pool = new pg.Pool({ db: testDbName })
+  pool.on('error', err => {
+    if (err.message !== 'terminating connection due to administrator command') {
+      logger.error(err)
+    }
+  })
+  pool.testDbName = testDbName
+
+  return pool
+})
+
+let db
+
+beforeAll(async () => {
+  const pg = require('pg')
+  db = new pg.Client()
+  await db.connect()
+  await db.query(`CREATE DATABASE ${testDbName}`)
+  const { createTables } = require('@pubsweet/db-manager')
+  await createTables(true)
+})
+
+afterAll(async () => {
+  await db.query(`REVOKE CONNECT ON DATABASE ${testDbName} FROM public`)
+  await db.query(`
+      SELECT pg_terminate_backend(pg_stat_activity.pid)
+      FROM pg_stat_activity
+      WHERE pg_stat_activity.datname = '${testDbName}'`)
+  await db.query(`DROP DATABASE ${testDbName}`)
+  await db.end()
+})
diff --git a/server/jest.config.js b/server/jest.config.js
new file mode 100644
index 0000000..33836b4
--- /dev/null
+++ b/server/jest.config.js
@@ -0,0 +1,7 @@
+module.exports = {
+  rootDir: '../',
+  setupTestFrameworkScriptFile: '<rootDir>/server/jest-setup.js',
+  testMatch: ['<rootDir>/server/**/*.test.js'],
+  transformIgnorePatterns: ['/node_modules/(?!@?pubsweet)'],
+  testEnvironment: 'node',
+}
diff --git a/server/submission/index.test.js b/server/submission/index.test.js
new file mode 100644
index 0000000..59e6d9f
--- /dev/null
+++ b/server/submission/index.test.js
@@ -0,0 +1,45 @@
+const supertest = require('supertest')
+const app = require('pubsweet-server/src/').configureApp(require('express')())
+const { createTables } = require('@pubsweet/db-manager')
+
+const getClient = async () => {
+  const User = require('pubsweet-server/src/models/User')
+  const authentication = require('pubsweet-server/src/authentication')
+
+  const user = new User({
+    username: 'testuser',
+    orcid: 'testuser-orcid-id',
+  })
+  await user.save()
+
+  return query =>
+    supertest(app)
+      .post('/graphql')
+      .send({ query })
+      .set('Accept', 'application/json')
+      .set({ Authorization: `Bearer ${authentication.token.create(user)}` })
+}
+
+describe('Submission', () => {
+  let request
+
+  beforeEach(async () => {
+    await createTables(true)
+    request = await getClient()
+  })
+
+  it('Gets form data', async () => {
+    const query = `
+      query CurrentSubmission {
+        currentSubmission {
+          id
+          title
+          source
+        }
+      }
+    `
+
+    const { body } = await request(query)
+    expect(body.errors).toHaveLength(0)
+  })
+})
diff --git a/server/submission/package.json b/server/submission/package.json
index 9bce750..23f771b 100644
--- a/server/submission/package.json
+++ b/server/submission/package.json
@@ -9,7 +9,9 @@
   "scripts": {},
   "keywords": [],
   "dependencies": {
-    "config": "^1.30.0"
+    "apollo-boost": "^0.1.4",
+    "config": "^1.30.0",
+    "graphql-tag": "^2.8.0"
   },
   "peerDependencies": {
     "pubsweet-server": ">=2.0.0"
diff --git a/yarn.lock b/yarn.lock
index eb3c382..077519f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -151,6 +151,10 @@
   version "1.3.18"
   resolved "https://registry.yarnpkg.com/@types/error-stack-parser/-/error-stack-parser-1.3.18.tgz#e01c9f8c85ca83b610320c62258b0c9026ade0f7"
 
+"@types/graphql@0.12.6":
+  version "0.12.6"
+  resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-0.12.6.tgz#3d619198585fcabe5f4e1adfb5cf5f3388c66c13"
+
 "@types/lodash@^4.14.72":
   version "4.14.106"
   resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.106.tgz#6093e9a02aa567ddecfe9afadca89e53e5dce4dd"
@@ -325,13 +329,25 @@ anymatch@^2.0.0:
     micromatch "^3.1.4"
     normalize-path "^2.1.1"
 
+apollo-boost@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/apollo-boost/-/apollo-boost-0.1.4.tgz#c17ce6cd17f5c2859e06880aab9af0265fc929e2"
+  dependencies:
+    apollo-cache-inmemory "^1.1.12"
+    apollo-client "^2.2.8"
+    apollo-link "^1.0.6"
+    apollo-link-error "^1.0.3"
+    apollo-link-http "^1.3.1"
+    apollo-link-state "^0.4.0"
+    graphql-tag "^2.4.2"
+
 apollo-cache-control@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.1.0.tgz#0c7c9abc312dea3a60e1cb70e0869df2cd970688"
   dependencies:
     graphql-extensions "^0.0.x"
 
-apollo-cache-inmemory@^1.1.7:
+apollo-cache-inmemory@^1.1.12, apollo-cache-inmemory@^1.1.7:
   version "1.1.12"
   resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.1.12.tgz#ab489bf046b3e026556ab28bdebb6e010cac9531"
   dependencies:
@@ -355,7 +371,7 @@ apollo-client-preset@^1.0.8:
     apollo-link-http "^1.3.1"
     graphql-tag "^2.4.2"
 
-apollo-client@^2.2.2:
+apollo-client@^2.2.2, apollo-client@^2.2.8:
   version "2.2.8"
   resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.2.8.tgz#b604d31ab2d2dd00db3105d8793b93ee02ce567e"
   dependencies:
@@ -381,6 +397,12 @@ apollo-link-dedup@^1.0.0:
   dependencies:
     apollo-link "^1.2.1"
 
+apollo-link-error@^1.0.3:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.0.9.tgz#83bbe019a3bca7c602c399889b313a7e5e22713f"
+  dependencies:
+    apollo-link "^1.2.2"
+
 apollo-link-http-common@^0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.3.tgz#82ae0d4ff0cdd7c5c8826411d9dd7f7d8049ca46"
@@ -394,7 +416,7 @@ apollo-link-http@^1.3.1:
     apollo-link "^1.2.1"
     apollo-link-http-common "^0.2.3"
 
-apollo-link-state@^0.4.1:
+apollo-link-state@^0.4.0, apollo-link-state@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/apollo-link-state/-/apollo-link-state-0.4.1.tgz#65e9e0e12c67936b8c4b12b8438434f393104579"
   dependencies:
@@ -409,6 +431,14 @@ apollo-link@^1.0.0, apollo-link@^1.0.6, apollo-link@^1.2.1:
     apollo-utilities "^1.0.0"
     zen-observable-ts "^0.8.6"
 
+apollo-link@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.2.tgz#54c84199b18ac1af8d63553a68ca389c05217a03"
+  dependencies:
+    "@types/graphql" "0.12.6"
+    apollo-utilities "^1.0.0"
+    zen-observable-ts "^0.8.9"
+
 apollo-server-core@^1.3.4:
   version "1.3.4"
   resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-1.3.4.tgz#06715290b32375236d90701acb42f415ab78497f"
@@ -2367,7 +2397,7 @@ concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.0:
     readable-stream "^2.2.2"
     typedarray "^0.0.6"
 
-config@^1.21.0, config@^1.26.2, config@^1.29.0:
+config@^1.21.0, config@^1.26.2, config@^1.29.0, config@^1.30.0:
   version "1.30.0"
   resolved "https://registry.yarnpkg.com/config/-/config-1.30.0.tgz#1d60a9f35348a13c175798d384e81a5a16c3ba6e"
   dependencies:
@@ -11502,6 +11532,16 @@ zen-observable-ts@^0.8.6:
   dependencies:
     zen-observable "^0.7.0"
 
+zen-observable-ts@^0.8.9:
+  version "0.8.9"
+  resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.9.tgz#d3c97af08c0afdca37ebcadf7cc3ee96bda9bab1"
+  dependencies:
+    zen-observable "^0.8.0"
+
 zen-observable@^0.7.0:
   version "0.7.1"
   resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.7.1.tgz#f84075c0ee085594d3566e1d6454207f126411b3"
+
+zen-observable@^0.8.0:
+  version "0.8.8"
+  resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.8.tgz#1ea93995bf098754a58215a1e0a7309e5749ec42"
-- 
GitLab