diff --git a/package.json b/package.json
index 8c24d7c7963f893fb15788583d44acd4efd9f670..a27527e807c264b0013c5863382d1e19bc95eac4 100644
--- a/package.json
+++ b/package.json
@@ -26,11 +26,29 @@
   },
   "scripts": {
     "clean": "lerna clean",
-    "test": "lerna run test",
+    "test": "jest",
     "lint": "npm run lint:js && npm run lint:style",
     "lint:js": "eslint 'packages/**/*.{js,jsx}'",
     "lint:style": "stylelint 'packages/**/*.{css,scss}'",
     "precommit": "lint-staged"
   },
+  "jest": {
+    "collectCoverage": true,
+    "collectCoverageFrom": [
+      "packages/cli/src/*.js",
+      "packages/cli/cli/*.js",
+      "client/src/**/*.{js,jsx}",
+      "components/**/*.{js,jsx}",
+      "db-manager/src/**/*.js",
+      "logger/src/**/*.js",
+      "server/src/**/*.js",
+      "sse/lib/**/*.js",
+      "theme-plugin/*.js",
+      "ui/src/**/*.{js,jsx}",
+      "!**/*.test.{js,jsx}",
+      "!**/node_modules/**"
+    ],
+    "projects": ["packages/*"]
+  },
   "workspaces": ["packages/*", "packages/components/packages/*"]
 }
diff --git a/packages/cli/package.json b/packages/cli/package.json
index dc1d42488eac98b282e1db575feaccb847f5481c..1cc44941077e894afae7cd2506d116c57e6813a6 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -43,13 +43,14 @@
     "nsp": "^2.8.1"
   },
   "jest": {
-    "testMatch": ["**/test/*.js", "**/test/cli/*.js"],
+    "testMatch": ["<rootDir>/test/*.test.js", "<rootDir>/test/cli/*.test.js"],
     "testPathIgnorePatterns": ["<rootDir>/build/"],
     "collectCoverage": true,
     "collectCoverageFrom": ["src/*.js", "cli/*.js"],
     "modulePaths": ["<rootDir>/node_modules"],
     "testEnvironment": "node",
     "unmockedModulePathPatterns": ["/src/models"],
+    "setupTestFrameworkScriptFile": "<rootDir>/test/jest-setup.js",
     "verbose": true
   }
 }
diff --git a/packages/cli/test/cli/add.js b/packages/cli/test/cli/add.test.js
similarity index 94%
rename from packages/cli/test/cli/add.js
rename to packages/cli/test/cli/add.test.js
index 0ec0254eb81421735c8f6a1e34be4e4edf305cc0..bfae775ecf67d047b467893953b407530243f495 100644
--- a/packages/cli/test/cli/add.js
+++ b/packages/cli/test/cli/add.test.js
@@ -24,9 +24,7 @@ const writeSpy = fs.writeJsonSync
 
 describe('add', () => {
   beforeAll(() => {
-    process.chdir(
-      path.join(__dirname, '..', '..', 'node_modules', '@pubsweet', 'starter'),
-    )
+    process.chdir(path.dirname(require.resolve('@pubsweet/starter')))
   })
 
   beforeEach(() => {
diff --git a/packages/cli/test/cli/adduser.js b/packages/cli/test/cli/adduser.test.js
similarity index 100%
rename from packages/cli/test/cli/adduser.js
rename to packages/cli/test/cli/adduser.test.js
diff --git a/packages/cli/test/cli/new.js b/packages/cli/test/cli/new.test.js
similarity index 100%
rename from packages/cli/test/cli/new.js
rename to packages/cli/test/cli/new.test.js
diff --git a/packages/cli/test/cli/remove.js b/packages/cli/test/cli/remove.test.js
similarity index 94%
rename from packages/cli/test/cli/remove.js
rename to packages/cli/test/cli/remove.test.js
index ca2fe44ad980d70d7560590d588ea0dddc7fcb4e..f2ebd2087b697b25d8cedd9cff1572b6e3f7c42f 100644
--- a/packages/cli/test/cli/remove.js
+++ b/packages/cli/test/cli/remove.test.js
@@ -24,9 +24,7 @@ const writeSpy = fs.writeJsonSync
 
 describe('remove', () => {
   beforeAll(() => {
-    process.chdir(
-      path.join(__dirname, '..', '..', 'node_modules', '@pubsweet', 'starter'),
-    )
+    process.chdir(path.dirname(require.resolve('@pubsweet/starter')))
   })
 
   beforeEach(() => {
diff --git a/packages/cli/test/cli/setupdb.js b/packages/cli/test/cli/setupdb.test.js
similarity index 100%
rename from packages/cli/test/cli/setupdb.js
rename to packages/cli/test/cli/setupdb.test.js
diff --git a/packages/cli/test/cli/start.js b/packages/cli/test/cli/start.test.js
similarity index 100%
rename from packages/cli/test/cli/start.js
rename to packages/cli/test/cli/start.test.js
diff --git a/packages/cli/test/helpers/index.js b/packages/cli/test/helpers/index.js
index e5e9718167c527fe246b7a1b30804a72a96adb74..fc837419deef6c66b43d094e3a4c6572ac21d9fb 100644
--- a/packages/cli/test/helpers/index.js
+++ b/packages/cli/test/helpers/index.js
@@ -3,7 +3,7 @@ const { spawn } = require('child_process')
 const path = require('path')
 const reduce = require('lodash/fp/reduce').convert({ cap: false })
 
-const pubsweet = path.resolve('bin/pubsweet.js')
+const pubsweet = path.resolve(__dirname, '..', '..', 'bin', 'pubsweet.js')
 
 const formatOpts = reduce(
   (acc, value, key) => acc.concat(`--${key}`, value),
@@ -41,6 +41,7 @@ const runCommandAsync = ({ args, options, cwd, nodeConfig, stdio }) =>
     stdio,
     env: getEnvWithConfig(nodeConfig),
     shell: true,
+    detached: true,
   })
 
 module.exports = {
diff --git a/packages/cli/test/integration.js b/packages/cli/test/integration.test.js
similarity index 89%
rename from packages/cli/test/integration.js
rename to packages/cli/test/integration.test.js
index 316d531b92636c7edc6d06d730012f4aaf9b7eeb..7a3e56f254ee385ccd8d8e1deeb35d7704b50402 100644
--- a/packages/cli/test/integration.js
+++ b/packages/cli/test/integration.test.js
@@ -18,6 +18,18 @@ const nodeConfig = {
     dbPath,
     adapter: 'leveldb',
   },
+  // TODO: Remove this once version of server that handles
+  // undefined app validations is released.
+  validations: 'path',
+  authsome: {
+    mode: 'authsome/src/modes/blog',
+  },
+  pubsweet: {
+    components: [],
+  },
+  'pubsweet-client': {
+    theme: 'PepperTheme',
+  },
 }
 
 const dbOptions = {
@@ -155,11 +167,17 @@ describe('CLI: integration test', () => {
       app.stdout.on('data', async data => {
         console.log('stdout:', data.toString())
         if (data.toString().includes('App is listening')) {
-          const result = await fetch('http://localhost:4000')
+          const result = await fetch('http://localhost:3000')
           expect(result.status).toBe(200)
-          done()
+          console.log('Killing the app')
+          process.kill(-app.pid)
         }
       })
+
+      app.on('close', (code, signal) => {
+        console.log(`App killed ${signal}`)
+        done()
+      })
     })
   })
 })
diff --git a/packages/cli/test/jest-setup.js b/packages/cli/test/jest-setup.js
new file mode 100644
index 0000000000000000000000000000000000000000..7363485a9e993cb751103f32c4a3705f7a4404c3
--- /dev/null
+++ b/packages/cli/test/jest-setup.js
@@ -0,0 +1,5 @@
+const path = require('path')
+
+process.env.NODE_CONFIG_DIR = path.resolve(__dirname, '..', 'config')
+
+process.cwd = () => path.resolve(__dirname, '..')
diff --git a/packages/client/package.json b/packages/client/package.json
index c0e171854bc299477dedbc9bc28414cbf5bed7f8..666b81586822477e4e16b5a9fbc47a938ba5c5ee 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -58,6 +58,7 @@
   "jest": {
     "testRegex": "/test/.+test.jsx?$",
     "collectCoverage": true,
+    "setupTestFrameworkScriptFile": "<rootDir>/test/jest-setup.js",
     "collectCoverageFrom": ["src/**/*.{js,jsx}"],
     "globals": {
       "window": {}
diff --git a/packages/client/test/jest-setup.js b/packages/client/test/jest-setup.js
new file mode 100644
index 0000000000000000000000000000000000000000..bc711820f3cbd4f37ae78a1ba825fa75a4f49134
--- /dev/null
+++ b/packages/client/test/jest-setup.js
@@ -0,0 +1,7 @@
+import Enzyme from 'enzyme'
+import Adapter from 'enzyme-adapter-react-16'
+import path from 'path'
+
+Enzyme.configure({ adapter: new Adapter() })
+
+process.env.NODE_CONFIG_DIR = path.resolve(__dirname, '..', 'config')
diff --git a/packages/components/package.json b/packages/components/package.json
index 5c6fe970da2c55f8181f96ca51206bd32d2a9a75..2aaafed342aa1f0ed0c622b9af6d28aa0069cebe 100644
--- a/packages/components/package.json
+++ b/packages/components/package.json
@@ -51,6 +51,7 @@
       "\\.s?css$": "identity-obj-proxy"
     },
     "transformIgnorePatterns": ["/node_modules/(?!pubsweet)"],
-    "testPathIgnorePatterns": ["/node_modules", "config/"]
+    "testPathIgnorePatterns": ["/node_modules", "config/"],
+    "setupTestFrameworkScriptFile": "<rootDir>/test/jest-setup.js"
   }
 }
diff --git a/packages/components/test/jest-setup.js b/packages/components/test/jest-setup.js
new file mode 100644
index 0000000000000000000000000000000000000000..bc711820f3cbd4f37ae78a1ba825fa75a4f49134
--- /dev/null
+++ b/packages/components/test/jest-setup.js
@@ -0,0 +1,7 @@
+import Enzyme from 'enzyme'
+import Adapter from 'enzyme-adapter-react-16'
+import path from 'path'
+
+Enzyme.configure({ adapter: new Adapter() })
+
+process.env.NODE_CONFIG_DIR = path.resolve(__dirname, '..', 'config')
diff --git a/packages/db-manager/package.json b/packages/db-manager/package.json
index 90c1b8f295732509c1f2e4e16bea4948d7e2f4ba..93b91ce9ec1250ac39c6811811e9a33e2b1eae97 100644
--- a/packages/db-manager/package.json
+++ b/packages/db-manager/package.json
@@ -19,10 +19,10 @@
     "npm": ">=3.0.0"
   },
   "jest": {
-    "testMatch": ["**/test/**/*.js"],
+    "testMatch": ["**/test/**/*.test.js"],
     "collectCoverage": true,
     "collectCoverageFrom": ["src/**/*.js"],
-    "modulePaths": ["<rootDir>/node_modules"],
+    "setupTestFrameworkScriptFile": "<rootDir>/test/jest-setup.js",
     "testEnvironment": "node",
     "verbose": true
   },
diff --git a/packages/db-manager/test/jest-setup.js b/packages/db-manager/test/jest-setup.js
new file mode 100644
index 0000000000000000000000000000000000000000..7de2beed55c538a4a39fe8495b07dde62f6db5f9
--- /dev/null
+++ b/packages/db-manager/test/jest-setup.js
@@ -0,0 +1,3 @@
+const path = require('path')
+
+process.env.NODE_CONFIG_DIR = path.resolve(__dirname, '..', 'config')
diff --git a/packages/logger/package.json b/packages/logger/package.json
index a154b4bc5075b6370d6efc702727d608f6848ba8..0a4aa1f2dd684cd942ebdcb42de9ace7e4afc557 100644
--- a/packages/logger/package.json
+++ b/packages/logger/package.json
@@ -25,12 +25,13 @@
     "winston": "^2.3.1"
   },
   "jest": {
-    "testMatch": ["**/test/**/*.js"],
+    "testMatch": ["**/test/**/*test.js"],
     "collectCoverage": true,
     "collectCoverageFrom": ["src/**/*.js"],
     "modulePaths": ["<rootDir>/node_modules"],
     "testEnvironment": "node",
-    "verbose": true
+    "verbose": true,
+    "setupTestFrameworkScriptFile": "<rootDir>/test/jest-setup.js"
   },
   "dependencies": {
     "config": "^1.26.2",
diff --git a/packages/logger/test/jest-setup.js b/packages/logger/test/jest-setup.js
new file mode 100644
index 0000000000000000000000000000000000000000..7de2beed55c538a4a39fe8495b07dde62f6db5f9
--- /dev/null
+++ b/packages/logger/test/jest-setup.js
@@ -0,0 +1,3 @@
+const path = require('path')
+
+process.env.NODE_CONFIG_DIR = path.resolve(__dirname, '..', 'config')
diff --git a/packages/server/package.json b/packages/server/package.json
index a980b7ad9c493c83db42db1c431e41c8326b0b65..6351a13cbddcb088f5fdeebbea126e89e7afaaad 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -65,6 +65,7 @@
     "testEnvironment": "node",
     "testRegex": "/test/.*_test.js$",
     "collectCoverage": true,
-    "collectCoverageFrom": ["src/**/*.js"]
+    "collectCoverageFrom": ["src/**/*.js"],
+    "setupTestFrameworkScriptFile": "<rootDir>/test/jest-setup.js"
   }
 }
diff --git a/packages/server/test/db_test.js b/packages/server/test/db_test.js
index a91b0b9eba78ff2ef21a6b86dde83de46f27a763..69ecc99d0c022b3a94bbc88aec47b202cc895d08 100644
--- a/packages/server/test/db_test.js
+++ b/packages/server/test/db_test.js
@@ -1,3 +1,7 @@
+const path = require('path')
+
+process.env.NODE_CONFIG_DIR = path.resolve(__dirname, '..', 'config')
+
 describe('db configuration', () => {
   it('overrides default adapter with config', async () => {
     const originalNodeEnv = process.env.NODE_ENV
diff --git a/packages/server/test/jest-setup.js b/packages/server/test/jest-setup.js
new file mode 100644
index 0000000000000000000000000000000000000000..7de2beed55c538a4a39fe8495b07dde62f6db5f9
--- /dev/null
+++ b/packages/server/test/jest-setup.js
@@ -0,0 +1,3 @@
+const path = require('path')
+
+process.env.NODE_CONFIG_DIR = path.resolve(__dirname, '..', 'config')
diff --git a/packages/server/test/register_components_test.js b/packages/server/test/register_components_test.js
index a43a5507f92a84ef04303e10416d28a9472d7a65..3af0161ac694573b949d8455664059af67ae84e7 100644
--- a/packages/server/test/register_components_test.js
+++ b/packages/server/test/register_components_test.js
@@ -3,12 +3,7 @@ const request = require('supertest')
 const path = require('path')
 const config = require('config')
 
-const mockComponentPath = path.join(
-  process.cwd(),
-  'test',
-  'mocks',
-  'mock_component.js',
-)
+const mockComponentPath = path.resolve(__dirname, 'mocks', 'mock_component.js')
 config.pubsweet = { components: [mockComponentPath] }
 
 const api = require('./helpers/api')