diff --git a/app.js b/app.js index 646139c87..24fc74032 100644 --- a/app.js +++ b/app.js @@ -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 } } \ No newline at end of file diff --git a/bin/www b/bin/www index b5e911bd1..15289a512 100644 --- a/bin/www +++ b/bin/www @@ -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 ) -}) \ No newline at end of file +init( ).then( ( { app } ) => startHttp( app ) ) + .catch( err => { + debug( err ) + } ) \ No newline at end of file diff --git a/modules/core/tests/graph.spec.js b/modules/core/tests/graph.spec.js index d6a2b99d9..f2d4a2dba 100644 --- a/modules/core/tests/graph.spec.js +++ b/modules/core/tests/graph.spec.js @@ -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 { diff --git a/package.json b/package.json index 5a2c876e2..fae22ca84 100644 --- a/package.json +++ b/package.json @@ -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",