From 9262fbb44ffa53e3d89c0ecab8a8e625b015a7da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Tue, 8 Jan 2019 14:57:13 +0100 Subject: [PATCH] Start a test server only once. This keeps our tests small. It is quite a headache though, because of an issue with jest and with transpiling. For reasons that I don't understand running `yarn run test:jest` sometimes complains about open handles. I would love to hear how to make our build more reliable. --- README.md | 9 +++++ package.json | 6 ++-- ...-schema.test.js => graphql-schema.spec.js} | 17 +--------- src/jest/globalSetup.js | 1 + src/jest/globalTeardown.js | 1 + src/jest/hooks.js | 16 +++++++++ src/middleware/permissionsMiddleware.spec.js | 33 +++++++++++++++++++ src/middleware/permissionsMiddleware.test.js | 15 --------- 8 files changed, 65 insertions(+), 33 deletions(-) rename src/{graphql-schema.test.js => graphql-schema.spec.js} (85%) create mode 100644 src/jest/globalSetup.js create mode 100644 src/jest/globalTeardown.js create mode 100644 src/jest/hooks.js create mode 100644 src/middleware/permissionsMiddleware.spec.js delete mode 100644 src/middleware/permissionsMiddleware.test.js diff --git a/README.md b/README.md index da8758334..eb814d1f0 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,15 @@ npm run db:reset **Beware**: We have no multiple database setup at the moment. We clean the database after each test, running the tests will wipe out all your data! +First build `server.js`: +```bash +yarn run build +# -or- +npm run build +``` +The additional build step will become obsolete, as soon as [jest transforms global setup teardown modules](https://github.com/facebook/jest/issues/5164). + +Now run the tests: ```bash yarn run test # -or- diff --git a/package.json b/package.json index 9d83da85b..0b624efee 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "lint": "eslint src --config .eslintrc.js", "test": "nyc --reporter=text-lcov yarn run test:jest", "test:jest": "$npm_package_config_no_auth run-p --race start test:cmd:jest", - "test:cmd:jest": "jest --forceExit", + "test:cmd:jest": "jest --forceExit --detectOpenHandles", "test:coverage": "nyc report --reporter=text-lcov > coverage.lcov", "db:script:seed": "wait-on tcp:4001 && babel-node src/seed/seed-db.js", "db:script:reset": "wait-on tcp:4001 && babel-node src/seed/reset-db.js", @@ -25,7 +25,9 @@ "license": "MIT", "jest": { "verbose": true, - "testMatch": ["**/src/**/?(*.)+(spec|test).js?(x)" ] + "testMatch": ["**/src/**/?(*.)+(spec|test).js?(x)" ], + "globalSetup": "/src/jest/globalSetup", + "globalTeardown": "/src/jest/globalTeardown" }, "dependencies": { "apollo-cache-inmemory": "~1.3.11", diff --git a/src/graphql-schema.test.js b/src/graphql-schema.spec.js similarity index 85% rename from src/graphql-schema.test.js rename to src/graphql-schema.spec.js index a58fb3599..a9ea1108a 100644 --- a/src/graphql-schema.test.js +++ b/src/graphql-schema.spec.js @@ -1,23 +1,8 @@ import { request } from 'graphql-request' -import createServer from './server' -import mocks from './mocks' import { create, cleanDatabase } from './seed/factories' import jwt from 'jsonwebtoken' -let getHost -let app -let port - -beforeEach(async () => { - const server = createServer({ mocks }) - app = await server.start({ port: 0 }) - port = app.address().port - getHost = () => `http://127.0.0.1:${port}` -}) - -afterEach(async () => { - await app.close() -}) +let getHost = () => 'http://127.0.0.1:3123' describe('login', () => { const mutation = (params) => { diff --git a/src/jest/globalSetup.js b/src/jest/globalSetup.js new file mode 100644 index 000000000..e2bfa24a5 --- /dev/null +++ b/src/jest/globalSetup.js @@ -0,0 +1 @@ +module.exports = require('./hooks').setup diff --git a/src/jest/globalTeardown.js b/src/jest/globalTeardown.js new file mode 100644 index 000000000..944503234 --- /dev/null +++ b/src/jest/globalTeardown.js @@ -0,0 +1 @@ +module.exports = require('./hooks').teardown diff --git a/src/jest/hooks.js b/src/jest/hooks.js new file mode 100644 index 000000000..d5bcf2f2e --- /dev/null +++ b/src/jest/hooks.js @@ -0,0 +1,16 @@ +const createServer = require('../../dist/server.js').default +let app + +const setup = async function () { + const server = createServer() + app = await server.start({ port: 3123 }) +} + +const teardown = async function () { + await app.close() +} + +module.exports = { + setup, + teardown +} diff --git a/src/middleware/permissionsMiddleware.spec.js b/src/middleware/permissionsMiddleware.spec.js new file mode 100644 index 000000000..fb612bb91 --- /dev/null +++ b/src/middleware/permissionsMiddleware.spec.js @@ -0,0 +1,33 @@ +import { request } from 'graphql-request' +import createServer from '../server' +import mocks from '../mocks' +import { create, cleanDatabase } from '../seed/factories' +import generateJwt from '../jwt/generateToken' + +describe('authorization', () => { + describe('given an existing user', () => { + + describe('logged in', () => { + let jwt + beforeEach(() => { + // jwt = generateJwt(user) + }) + + describe('query own user profile', () => { + const mutation = (params) => { + const { email, password } = params + return `{ + User(email: "${email}") { + name + } + }` + } + + it('returns the owner\'s email address', async () => { + // const data = await request(getHost(), mutation({ email: 'test@example.org' })) + console.log('it runs') + }) + }) + }) + }) +}) diff --git a/src/middleware/permissionsMiddleware.test.js b/src/middleware/permissionsMiddleware.test.js deleted file mode 100644 index 3cf808e39..000000000 --- a/src/middleware/permissionsMiddleware.test.js +++ /dev/null @@ -1,15 +0,0 @@ -describe('query', () => { - describe('statistics', () => { - describe('authenticated user', () => { - describe('read', () => { - xit('is forbidden', () => {}) - }) - }) - - describe('admin', () => { - describe('read', () => { - xit('is permitted', () => {}) - }) - }) - }) -})