refactor(init logic): changes init logic so tests can start & stop a full server independently

This commit is contained in:
Dimitrie Stefanescu
2020-04-25 12:24:20 +01:00
parent 5e88b890e9
commit 8da320beee
4 changed files with 64 additions and 52 deletions
+45 -3
View File
@@ -1,5 +1,6 @@
'use strict'
let http = require( 'http' )
const express = require( 'express' )
const logger = require( 'morgan-debug' )
const bodyParser = require( 'body-parser' )
@@ -7,13 +8,17 @@ const debug = require( 'debug' )( 'speckle:errors' )
const { ApolloServer } = require( 'apollo-server-express' )
const { contextApiTokenHelper } = require( './modules/shared' )
const knex = require('./db/knex')
const knex = require( './db/knex' )
/**
* Initialises the express application together with the graphql server middleware.
* @return {[type]} an express applicaiton and the graphql server
*/
exports.init = async ( ) => {
const app = express( )
await knex.migrate.latest()
await knex.migrate.latest( )
if ( process.env.NODE_ENV !== 'test' ) {
app.use( logger( 'speckle', 'dev', {} ) )
@@ -53,4 +58,41 @@ exports.init = async ( ) => {
} )
return { app, graphqlServer }
}
/**
* Starts a http server, hoisting the express app to it.
* @param {[type]} app [description]
* @return {[type]} [description]
*/
exports.startHttp = async ( app ) => {
let port = process.env.PORT || 3000
app.set( 'port', port )
let server = http.createServer( app )
server.on( 'error', error => {
let bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port
switch ( error.code ) {
case 'EACCES':
console.error( bind + ' whattt requires elevated privileges' )
process.exit( 1 )
break
case 'EADDRINUSE':
console.error( bind + ' is already in use' )
process.exit( 1 )
break
default:
throw error
}
} )
server.on( 'listening', ( ) => {
console.log( `Listening on ${server.address().port}` )
} )
server.listen( port )
return { server }
}
+5 -38
View File
@@ -3,42 +3,9 @@
'use strict'
let debug = require( 'debug' )( 'www:server' )
let http = require( 'http' )
let { init, startHttp } = require( '../app' )
let { init } = require( '../app' )
init( ).
then( ( { app } ) => {
let port = process.env.PORT || 3000
app.set( 'port', port )
let server = http.createServer( app )
server.on( 'error', error => {
let bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port
switch ( error.code ) {
case 'EACCES':
console.error( bind + ' whattt requires elevated privileges' )
process.exit( 1 )
break
case 'EADDRINUSE':
console.error( bind + ' is already in use' )
process.exit( 1 )
break
default:
throw error
}
} )
server.on( 'listening', ( ) => {
debug( `Listening on ${server.address().port}` )
} )
server.listen( port )
} )
.catch( err => {
debug( err )
})
init( ).then( ( { app } ) => startHttp( app ) )
.catch( err => {
debug( err )
} )
+10 -7
View File
@@ -3,7 +3,7 @@ const chaiHttp = require( 'chai-http' )
const assert = require( 'assert' )
const root = require( 'app-root-path' )
const { init } = require( `${root}/app` )
const { init, startHttp } = require( `${root}/app` )
const expect = chai.expect
chai.use( chaiHttp )
@@ -15,34 +15,37 @@ const { createUser, createToken } = require( '../users/services' )
describe( 'GraphQL API Core', ( ) => {
let userA = { name: 'd1', username: 'd1', email: 'd.1@speckle.systems', password: 'wow' }
let userB = { name: 'd2', username: 'd2', email: 'd.2@speckle.systems', password: 'wow' }
let app
let testServer
let addr
before( async ( ) => {
await knex.migrate.latest( )
// let app = await init( )
require( `${root}/bin/www` )
let { app } = await init( )
let { server } = await startHttp( app )
testServer = server
userA.id = await createUser( userA )
userA.token = `Bearer ${(await createToken( userA.id, 'test token user A', [ 'streams:read', 'streams:write', 'user:read', 'token:create', 'token:read' ] ))}`
userB.id = await createUser( userB )
userB.token = `Bearer ${(await createToken( userB.id, 'test token user B', [ 'streams:read', 'streams:write', 'user:read', 'token:create', 'token:read' ] ))}`
addr = `http://localhost:${process.env.PORT || 3000}`
} )
after( async ( ) => {
await knex.migrate.rollback( )
testServer.close()
} )
describe( 'Mutations', ( ) => {
it( 'Should create a stream', async ( ) => {
// const res = await chai.request(app).post('/graphql').send().set()
assert.fail('todo')
} )
} )
describe( 'Queries', ( ) => {
it( 'Should retrieve my profile', async ( ) => {
const res = await chai.request( 'http://localhost:3000' ).post( '/graphql' ).set( 'Authorization', userA.token ).send( {
const res = await chai.request( addr ).post( '/graphql' ).set( 'Authorization', userA.token ).send( {
query: `
{
user {
+4 -4
View File
@@ -4,10 +4,10 @@
"description": "speckle server",
"main": "index.js",
"scripts": {
"dev": "NODE_ENV=development DEBUG=www:server,speckle:* nodemon ./bin/www --watch . --watch ./bin/www -e js,graphql,env",
"test": "DEBUG=speckle:test,speckle:errors NODE_ENV=test nyc nyc --reporter=html mocha -s 0 --exit",
"test-watch": "DEBUG=speckle:test,speckle:errors NODE_ENV=test mocha --watch -s 0 --exit",
"test-graph": "DEBUG=speckle:test,speckle:errors NODE_ENV=test mocha ./modules/core/tests/graph.spec.js --watch -s 0 --exit --no-config"
"dev": "PORT=3000 NODE_ENV=development DEBUG=www:server,speckle:* nodemon ./bin/www --watch . --watch ./bin/www -e js,graphql,env",
"test": "PORT=3001 DEBUG=speckle:test,speckle:errors NODE_ENV=test nyc nyc --reporter=html mocha -s 0 --exit",
"test-watch": "PORT=3001 DEBUG=speckle:test,speckle:errors NODE_ENV=test mocha --watch -s 0 --exit",
"test-graph": "PORT=3001 DEBUG=speckle:test,speckle:errors NODE_ENV=test mocha ./modules/core/tests/graph.spec.js --watch -s 0 --exit --no-config"
},
"author": "",
"license": "MIT",