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