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.
This commit is contained in:
Robert Schäfer 2019-01-08 14:57:13 +01:00
parent b2bad4fedb
commit 9262fbb44f
8 changed files with 65 additions and 33 deletions

View File

@ -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! **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 ```bash
yarn run test yarn run test
# -or- # -or-

View File

@ -14,7 +14,7 @@
"lint": "eslint src --config .eslintrc.js", "lint": "eslint src --config .eslintrc.js",
"test": "nyc --reporter=text-lcov yarn run test:jest", "test": "nyc --reporter=text-lcov yarn run test:jest",
"test:jest": "$npm_package_config_no_auth run-p --race start test:cmd: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", "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: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", "db:script:reset": "wait-on tcp:4001 && babel-node src/seed/reset-db.js",
@ -25,7 +25,9 @@
"license": "MIT", "license": "MIT",
"jest": { "jest": {
"verbose": true, "verbose": true,
"testMatch": ["**/src/**/?(*.)+(spec|test).js?(x)" ] "testMatch": ["**/src/**/?(*.)+(spec|test).js?(x)" ],
"globalSetup": "<rootDir>/src/jest/globalSetup",
"globalTeardown": "<rootDir>/src/jest/globalTeardown"
}, },
"dependencies": { "dependencies": {
"apollo-cache-inmemory": "~1.3.11", "apollo-cache-inmemory": "~1.3.11",

View File

@ -1,23 +1,8 @@
import { request } from 'graphql-request' import { request } from 'graphql-request'
import createServer from './server'
import mocks from './mocks'
import { create, cleanDatabase } from './seed/factories' import { create, cleanDatabase } from './seed/factories'
import jwt from 'jsonwebtoken' import jwt from 'jsonwebtoken'
let getHost let getHost = () => 'http://127.0.0.1:3123'
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()
})
describe('login', () => { describe('login', () => {
const mutation = (params) => { const mutation = (params) => {

1
src/jest/globalSetup.js Normal file
View File

@ -0,0 +1 @@
module.exports = require('./hooks').setup

View File

@ -0,0 +1 @@
module.exports = require('./hooks').teardown

16
src/jest/hooks.js Normal file
View File

@ -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
}

View File

@ -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')
})
})
})
})
})

View File

@ -1,15 +0,0 @@
describe('query', () => {
describe('statistics', () => {
describe('authenticated user', () => {
describe('read', () => {
xit('is forbidden', () => {})
})
})
describe('admin', () => {
describe('read', () => {
xit('is permitted', () => {})
})
})
})
})