From c2ced1121fc0e2f565dcec2037260872f9b1a88f Mon Sep 17 00:00:00 2001 From: Chris Trevino Date: Thu, 26 Mar 2015 10:00:21 -0700 Subject: [PATCH] Breaking apart the tests to improve the CodeClimate GPA by reducing complexity in the main test file --- src/jefferson.aliasing.test.js | 134 +++++++++++++ src/jefferson.params.test.js | 42 ++++ src/jefferson.proxies.test.js | 151 ++++++++++++++ src/jefferson.routing.test.js | 45 +++++ src/jefferson.test.js | 350 --------------------------------- 5 files changed, 372 insertions(+), 350 deletions(-) create mode 100644 src/jefferson.aliasing.test.js create mode 100644 src/jefferson.params.test.js create mode 100644 src/jefferson.proxies.test.js create mode 100644 src/jefferson.routing.test.js delete mode 100644 src/jefferson.test.js diff --git a/src/jefferson.aliasing.test.js b/src/jefferson.aliasing.test.js new file mode 100644 index 0000000..f88bb61 --- /dev/null +++ b/src/jefferson.aliasing.test.js @@ -0,0 +1,134 @@ +var chai = require('chai'), + expect = chai.expect, + express = require('express'), + request = require('supertest'), + jefferson = require('./jefferson'); + +describe('Jefferson Alias Configuration', () => { + + it('throws if a subchain reference is undefined', () => { + let conf = { + aliases: { + 'derp': [] + }, + routes: { + 'getUser': { + method: 'GET', + path: '/test-item', + middleware: [ + (req, res, next) => { + req.entity = {id: 1}; + next(); + }, + 'processAndReturn' + ] + } + } + }; + + let app = express(); + expect(() => jefferson(app, conf)).to.throw(); + }); + + it('throws if a alias section is undefined and an alias is referenced', () => { + let conf = { + routes: { + 'getUser': { + method: 'GET', + path: '/test-item', + middleware: [ + (req, res, next) => { + req.entity = {id: 1}; + next(); + }, + 'processAndReturn' + ] + } + } + }; + + let app = express(); + expect(() => jefferson(app, conf)).to.throw(); + }); + + it('can reference subchain aliases', (done) => { + let conf = { + aliases: { + processAndReturn: [ + (req, res, next) => { + req.entity.herp = 'derp'; + next(); + }, + (req, res) => { res.json(req.entity); } + ] + }, + routes: { + 'getUser': { + method: 'GET', + path: '/test-item', + middleware: [ + (req, res, next) => { + req.entity = {id: 1}; + next(); + }, + 'processAndReturn' + ] + } + } + }; + + let app = express(); + jefferson(app, conf); + + request(app) + .get('/test-item') + .expect(200) + .end((err, res) => { + if (err) { return done(err); } + expect(res.body.id).to.equal(1); + expect(res.body.herp).to.equal('derp'); + done(); + }); + }); + + it('can reference subchain aliases while the promise proxy is enabled', (done) => { + let conf = { + proxies: [require('../src/proxies/promise-handler')], + aliases: { + processAndReturn: [ + (req, res, next) => { + req.entity.herp = 'derp'; + next(); + }, + (req, res) => { res.json(req.entity); } + ] + }, + routes: { + 'getUser': { + method: 'GET', + path: '/test-item', + middleware: [ + (req, res, next) => { + req.entity = {id: 1}; + next(); + }, + 'processAndReturn' + ] + } + } + }; + + let app = express(); + jefferson(app, conf); + + request(app) + .get('/test-item') + .expect(200) + .end((err, res) => { + if (err) { return done(err); } + expect(res.body.id).to.equal(1); + expect(res.body.herp).to.equal('derp'); + done(); + }); + }); +}); \ No newline at end of file diff --git a/src/jefferson.params.test.js b/src/jefferson.params.test.js new file mode 100644 index 0000000..18b4f52 --- /dev/null +++ b/src/jefferson.params.test.js @@ -0,0 +1,42 @@ +var chai = require('chai'), + expect = chai.expect, + express = require('express'), + request = require('supertest'), + jefferson = require('./jefferson'); + +describe("Jefferson Parameter Resolution", () => { + + it('can resolve path parameters', (done) => { + let conf = { + params: { + userId: (req, res, next, id) => { + req.user = { id: id, name: 'derp' }; + next(); + } + }, + routes: { + 'getUser': { + method: 'GET', + path: '/users/:userId', + middleware: [ + (req, res) => { res.json(req.user); } + ] + } + } + }; + + let app = express(); + jefferson(app, conf); + + request(app) + .get('/users/1') + .expect('Content-Type', /json/) + .expect(200) + .end((err, res) => { + if (err) { return done(err); } + expect(res.body.id).to.equal('1'); + expect(res.body.name).to.equal('derp'); + done(); + }); + }); +}); \ No newline at end of file diff --git a/src/jefferson.proxies.test.js b/src/jefferson.proxies.test.js new file mode 100644 index 0000000..bba5885 --- /dev/null +++ b/src/jefferson.proxies.test.js @@ -0,0 +1,151 @@ +var chai = require('chai'), + expect = chai.expect, + express = require('express'), + request = require('supertest'), + jefferson = require('./jefferson'); + +describe("Jefferson Proxies", () => { + it('can configure handlers with proxies', (done) => { + let aTriggered = 0, + bTriggered = 0, + initialMiddlewareTriggered = false, + endMiddlewareTriggered = false; + let tripA = { + init (delegate) { + return (req, res, next) => { + aTriggered++; + delegate(req, res, next); + }; + } + }; + let tripB = { + init (delegate) { + return (req, res, next) => { + bTriggered++; + delegate(req, res, next); + }; + } + }; + let conf = { + proxies: [tripA, tripB], + routes: { + 'getItem': { + method: 'GET', + path: '/test-path', + middleware: [ + (req, res, next) => { + initialMiddlewareTriggered = true; + next(); + }, + (req, res) => { + endMiddlewareTriggered = true; + res.send('hello!'); + } + ] + } + } + }; + + let app = express(); + jefferson(app, conf); + + request(app) + .get('/test-path') + .expect('Content-Type', /text/) + .expect('Content-Length', '6') + .expect(200) + .end((err, res) => { + if (err) { + return done(err); + } + expect(aTriggered).to.equal(2); + expect(bTriggered).to.equal(2); + expect(initialMiddlewareTriggered).to.be.true; + expect(endMiddlewareTriggered).to.be.true; + done(); + }); + }); + + it('handles the case when there are no proxies in the proxy array', (done) => { + let initialMiddlewareTriggered = true, + endMiddlewareTriggered = false; + + let conf = { + proxies: [], + routes: { + 'getItem': { + method: 'GET', + path: '/test-path', + middleware: [ + (req, res, next) => { + initialMiddlewareTriggered = true; + next(); + }, + (req, res) => { + endMiddlewareTriggered = true; + res.send('hello!'); + } + ] + } + } + }; + + let app = express(); + jefferson(app, conf); + + request(app) + .get('/test-path') + .expect('Content-Type', /text/) + .expect('Content-Length', '6') + .expect(200) + .end((err, res) => { + if (err) { + return done(err); + } + expect(initialMiddlewareTriggered).to.be.true; + expect(endMiddlewareTriggered).to.be.true; + done(); + }); + }); + + it('invokes proxies with a middleware index', (done) => { + let invocations = ""; + let conf = { + proxies: [ + { + init: (delegate, conf, index) => { + return (req, res, next) => { + invocations = invocations + index; + delegate(req, res, next); + }; + } + } + ], + routes: { + 'getItem': { + method: 'GET', + path: '/test-path', + middleware: [ + (req, res, next) => next(), + (req, res, next) => next(), + (req, res) => res.send('hello!') + ] + } + } + }; + + let app = express(); + jefferson(app, conf); + + request(app) + .get('/test-path') + .expect(200) + .end((err, res) => { + if (err) { + return done(err); + } + expect(invocations).to.equal("012"); + done(); + }); + }); +}); \ No newline at end of file diff --git a/src/jefferson.routing.test.js b/src/jefferson.routing.test.js new file mode 100644 index 0000000..ec8022d --- /dev/null +++ b/src/jefferson.routing.test.js @@ -0,0 +1,45 @@ +'use strict'; + +var chai = require('chai'), + expect = chai.expect, + express = require('express'), + jefferson = require('./jefferson'), + debug = require('debug')('jefferson:test'); + +describe('Jefferson', () => { + + it('throws an error if an express app is not provided', () => { + expect(() => jefferson(null, {})).to.throw(); + }); + + it('throws an error if an application config is not provided', () => { + expect(() => jefferson(express())).to.throw(); + }); + + it('configures an application', () => { + let conf = { + routes: { + 'getCollection': { + method: 'GET', + path: '/test-path', + middleware: [ () => {} ] + }, + 'getItem': { + method: 'GET', + path: '/test-path/:id', + middleware: [ () => {} ] + } + } + }, + routed = 0, + app = { + get: (path, middleware) => { + routed++; + debug("mock application routing", path, middleware); + } + }; + + jefferson(app, conf); + expect(routed).to.equal(2); + }); +}); diff --git a/src/jefferson.test.js b/src/jefferson.test.js deleted file mode 100644 index 7ef4940..0000000 --- a/src/jefferson.test.js +++ /dev/null @@ -1,350 +0,0 @@ -'use strict'; - -var chai = require('chai'), - expect = require('chai').expect, - express = require('express'), - request = require('supertest'), - jefferson = require('./jefferson'), - debug = require('debug')('jefferson:test'); - -describe('Jefferson', () => { - - it('throws an error if an express app is not provided', () => { - expect(() => jefferson(null, {})).to.throw(); - }); - - it('throws an error if an application config is not provided', () => { - expect(() => jefferson(express())).to.throw(); - }); - - it('configures an application', () => { - let conf = { - routes: { - 'getCollection': { - method: 'GET', - path: '/test-path', - middleware: [ () => {} ] - }, - 'getItem': { - method: 'GET', - path: '/test-path/:id', - middleware: [ () => {} ] - } - } - }, - routed = 0, - app = { - get: (path, middleware) => { - routed++; - debug("mock application routing", path, middleware); - } - }; - - jefferson(app, conf); - expect(routed).to.equal(2); - }); - - it('can configure handlers with proxies', (done) => { - let aTriggered = 0, - bTriggered = 0, - initialMiddlewareTriggered = false, - endMiddlewareTriggered = false; - let tripA = { - init (delegate) { - return (req, res, next) => { - aTriggered++; - delegate(req, res, next); - }; - } - }; - let tripB = { - init (delegate) { - return (req, res, next) => { - bTriggered++; - delegate(req, res, next); - }; - } - }; - let conf = { - proxies: [tripA, tripB], - routes: { - 'getItem': { - method: 'GET', - path: '/test-path', - middleware: [ - (req, res, next) => { - initialMiddlewareTriggered = true; - next(); - }, - (req, res) => { - endMiddlewareTriggered = true; - res.send('hello!'); - } - ] - } - } - }; - - let app = express(); - jefferson(app, conf); - - request(app) - .get('/test-path') - .expect('Content-Type', /text/) - .expect('Content-Length', '6') - .expect(200) - .end((err, res) => { - if (err) { - return done(err); - } - expect(aTriggered).to.equal(2); - expect(bTriggered).to.equal(2); - expect(initialMiddlewareTriggered).to.be.true; - expect(endMiddlewareTriggered).to.be.true; - done(); - }); - }); - - it('handles the case when there are no proxies in the proxy array', (done) => { - let initialMiddlewareTriggered = true, - endMiddlewareTriggered = false; - - let conf = { - proxies: [], - routes: { - 'getItem': { - method: 'GET', - path: '/test-path', - middleware: [ - (req, res, next) => { - initialMiddlewareTriggered = true; - next(); - }, - (req, res) => { - endMiddlewareTriggered = true; - res.send('hello!'); - } - ] - } - } - }; - - let app = express(); - jefferson(app, conf); - - request(app) - .get('/test-path') - .expect('Content-Type', /text/) - .expect('Content-Length', '6') - .expect(200) - .end((err, res) => { - if (err) { - return done(err); - } - expect(initialMiddlewareTriggered).to.be.true; - expect(endMiddlewareTriggered).to.be.true; - done(); - }); - }); - - it('invokes proxies with a middleware index', (done) => { - let invocations = ""; - let conf = { - proxies: [ - { - init: (delegate, conf, index) => { - return (req, res, next) => { - invocations = invocations + index; - delegate(req, res, next); - }; - } - } - ], - routes: { - 'getItem': { - method: 'GET', - path: '/test-path', - middleware: [ - (req, res, next) => next(), - (req, res, next) => next(), - (req, res) => res.send('hello!') - ] - } - } - }; - - let app = express(); - jefferson(app, conf); - - request(app) - .get('/test-path') - .expect(200) - .end((err, res) => { - if (err) { - return done(err); - } - expect(invocations).to.equal("012"); - done(); - }); - }); - - it('can resolve path parameters', (done) => { - let conf = { - params: { - userId: (req, res, next, id) => { - req.user = { id: id, name: 'derp' }; - next(); - } - }, - routes: { - 'getUser': { - method: 'GET', - path: '/users/:userId', - middleware: [ - (req, res) => { res.json(req.user); } - ] - } - } - }; - - let app = express(); - jefferson(app, conf); - - request(app) - .get('/users/1') - .expect('Content-Type', /json/) - .expect(200) - .end((err, res) => { - if (err) { return done(err); } - expect(res.body.id).to.equal('1'); - expect(res.body.name).to.equal('derp'); - done(); - }); - }); - - it('throws if a subchain reference is undefined', () => { - let conf = { - aliases: { - 'derp': [] - }, - routes: { - 'getUser': { - method: 'GET', - path: '/test-item', - middleware: [ - (req, res, next) => { - req.entity = {id: 1}; - next(); - }, - 'processAndReturn' - ] - } - } - }; - - let app = express(); - expect(() => jefferson(app, conf)).to.throw(); - }); - - it('throws if a alias section is undefined and an alias is referenced', () => { - let conf = { - routes: { - 'getUser': { - method: 'GET', - path: '/test-item', - middleware: [ - (req, res, next) => { - req.entity = {id: 1}; - next(); - }, - 'processAndReturn' - ] - } - } - }; - - let app = express(); - expect(() => jefferson(app, conf)).to.throw(); - }); - - it('can reference subchain aliases', (done) => { - let conf = { - aliases: { - processAndReturn: [ - (req, res, next) => { - req.entity.herp = 'derp'; - next(); - }, - (req, res) => { res.json(req.entity); } - ] - }, - routes: { - 'getUser': { - method: 'GET', - path: '/test-item', - middleware: [ - (req, res, next) => { - req.entity = {id: 1}; - next(); - }, - 'processAndReturn' - ] - } - } - }; - - let app = express(); - jefferson(app, conf); - - request(app) - .get('/test-item') - .expect(200) - .end((err, res) => { - if (err) { return done(err); } - expect(res.body.id).to.equal(1); - expect(res.body.herp).to.equal('derp'); - done(); - }); - }); - - it('can reference subchain aliases while the promise proxy is enabled', (done) => { - let conf = { - proxies: [require('../src/proxies/promise-handler')], - aliases: { - processAndReturn: [ - (req, res, next) => { - req.entity.herp = 'derp'; - next(); - }, - (req, res) => { res.json(req.entity); } - ] - }, - routes: { - 'getUser': { - method: 'GET', - path: '/test-item', - middleware: [ - (req, res, next) => { - req.entity = {id: 1}; - next(); - }, - 'processAndReturn' - ] - } - } - }; - - let app = express(); - jefferson(app, conf); - - request(app) - .get('/test-item') - .expect(200) - .end((err, res) => { - if (err) { return done(err); } - expect(res.body.id).to.equal(1); - expect(res.body.herp).to.equal('derp'); - done(); - }); - }); -});