From 9d00b04bb676826b6823bfb06a2f6bd8a1522a7b Mon Sep 17 00:00:00 2001 From: Dustin McBride Date: Tue, 24 May 2016 21:07:37 -0700 Subject: [PATCH 1/2] init commit --- dustin/.gitignore | 1 + dustin/index.js | 0 dustin/lib/superJSONparser.js | 20 +++++++++++ dustin/package.json | 26 ++++++++++++++ dustin/server.js | 25 ++++++++++++++ dustin/test/integration_test.js | 36 ++++++++++++++++++++ dustin/test/unit_test.js | 60 +++++++++++++++++++++++++++++++++ 7 files changed, 168 insertions(+) create mode 100644 dustin/.gitignore create mode 100644 dustin/index.js create mode 100644 dustin/lib/superJSONparser.js create mode 100644 dustin/package.json create mode 100644 dustin/server.js create mode 100644 dustin/test/integration_test.js create mode 100644 dustin/test/unit_test.js diff --git a/dustin/.gitignore b/dustin/.gitignore new file mode 100644 index 0000000..07e6e47 --- /dev/null +++ b/dustin/.gitignore @@ -0,0 +1 @@ +/node_modules diff --git a/dustin/index.js b/dustin/index.js new file mode 100644 index 0000000..e69de29 diff --git a/dustin/lib/superJSONparser.js b/dustin/lib/superJSONparser.js new file mode 100644 index 0000000..6291a22 --- /dev/null +++ b/dustin/lib/superJSONparser.js @@ -0,0 +1,20 @@ +"use strict"; + +module.exports = (req, res, next) =>{ + var body = ''; + req.on('data', (data) => { + body += data.toString(); + }); + req.on('end', () => { + try { + var parsed = JSON.parse(body); + req.body = parsed; + + } catch (e) { + e.message = 'Invalid JSON'; + e.statusCode = 422; + return next(e); + } + next(); + }); +} diff --git a/dustin/package.json b/dustin/package.json new file mode 100644 index 0000000..263e99c --- /dev/null +++ b/dustin/package.json @@ -0,0 +1,26 @@ +{ + "name": "dustin", + "version": "1.0.0", + "description": "", + "main": "index.js", + "directories": { + "test": "test" + }, + "dependencies": {}, + "devDependencies": { + "chai": "^3.5.0", + "chai-http": "^2.0.1", + "gulp": "^3.9.1", + "gulp-eslint": "^2.0.0", + "gulp-mocha": "^2.2.0", + "mocha": "^2.4.5", + "mock-req": "^0.2.0" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/dustin/server.js b/dustin/server.js new file mode 100644 index 0000000..47069a6 --- /dev/null +++ b/dustin/server.js @@ -0,0 +1,25 @@ +"use strict"; +const express = require('express'); +const superJSONparser = require('./lib/superJSONparser'); +const app = express(); + +var apiRouter = new express.Router(); + +apiRouter.use(superJSONparser); + +apiRouter.post('/', (req,res,next) =>{ +res.send('{"Message": "POST received"}') +res.end(); +}) + +app.use("/api", apiRouter); + +app.use((req, res) => { + res.status(404).json({ + msg: "page not found" + }) +}); + +app.listen(3000, () => { + console.log("server up on 3000") +}); diff --git a/dustin/test/integration_test.js b/dustin/test/integration_test.js new file mode 100644 index 0000000..a7c4fda --- /dev/null +++ b/dustin/test/integration_test.js @@ -0,0 +1,36 @@ +'use strict'; +const superJSONparser = require('../lib/superJSONparser'); +var MockReq = require('mock-req'); +const chai = require('chai'); +const expect = require('chai').expect; +const chaiHTTP = require('chai-http'); +chai.use(chaiHTTP); +const request = chai.request; +require('../server') + +describe('INTEGRATION TEST: SuperJSONparser should', function () { + it('super return a super error for non JSON', function (done) { + let payload = {message:"test message"} + request('localhost:3000') + .post('/api') + .send(payload) + .end(function (err, res) { + //console.log(err); + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.text).to.eql('{"Message": "POST received"}'); + done(); + }); + }); + + it('super return a super error for non JSON', function (done) { + let payload = "dsfa" + request('localhost:3000') + .post('/api') + .send(payload) + .end(function (err, res) { + expect(err).to.have.status(422); + done(); + }); + }); + }); diff --git a/dustin/test/unit_test.js b/dustin/test/unit_test.js new file mode 100644 index 0000000..b74b9c5 --- /dev/null +++ b/dustin/test/unit_test.js @@ -0,0 +1,60 @@ +'use strict'; +const superJSONparser = require('../lib/superJSONparser'); +var MockReq = require('mock-req'); +const chai = require('chai'); +const expect = require('chai').expect; +const chaiHTTP = require('chai-http'); +var res = {} + + +describe('UNIT TEST: SuperJSONparser should', function() { + it('super parse good JSON', function(done) { + + var req = new MockReq({ + method: 'POST', + url: '/' + }) + + //let payload = ("adfasd") + let payload = {hello:"test"} + + req.write(payload); + req.end(); + + superJSONparser(req, res, function(e){ + if (e) { + done(e); + } else { + expect(req.body).to.eql(payload) + done(); + } + }); + }); + + + it('super return a super error for non JSON', function(done) { + + var req = new MockReq({ + method: 'POST', + url: '/' + }) + + let payload = ("adfasd") + //let payload = {hello:"test"} + + req.write(payload); + req.end(); + + superJSONparser(req, res, function(e){ + if (e) { + expect(e.message).to.eql('Invalid JSON') + expect(e.statusCode).to.equal(422) + done(); + } else { + //error + done(new Error("Got good JSON")); + } + + }); +}); +}); From 371bdd3fb0f69fb81205a2baf7544e102e053336 Mon Sep 17 00:00:00 2001 From: Dustin McBride Date: Wed, 25 May 2016 09:10:51 -0700 Subject: [PATCH 2/2] gulpfile and fixed linter issues --- dustin/.eslintrc.js | 29 +++++++++++++++ dustin/gulpfile.js | 22 ++++++++++++ dustin/index.js | 0 dustin/lib/superJSONparser.js | 8 ++--- dustin/server.js | 18 +++++----- dustin/test/integration_test.js | 30 ++++++++-------- dustin/test/unit_test.js | 62 ++++++++++++++------------------- 7 files changed, 105 insertions(+), 64 deletions(-) create mode 100644 dustin/.eslintrc.js create mode 100644 dustin/gulpfile.js delete mode 100644 dustin/index.js diff --git a/dustin/.eslintrc.js b/dustin/.eslintrc.js new file mode 100644 index 0000000..ed2ec67 --- /dev/null +++ b/dustin/.eslintrc.js @@ -0,0 +1,29 @@ +module.exports = { + "env": { + "es6": true, + "node": true, + "mocha": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "sourceType": "module" + }, + "rules": { + "indent": [ + "error", + 2 + ], + "linebreak-style": [ + "error", + "unix" + ], + "quotes": [ + "error", + "single" + ], + "semi": [ + "error", + "always" + ] + } +}; diff --git a/dustin/gulpfile.js b/dustin/gulpfile.js new file mode 100644 index 0000000..fc90c44 --- /dev/null +++ b/dustin/gulpfile.js @@ -0,0 +1,22 @@ +const gulp = require('gulp'); +const mocha = require('gulp-mocha'); +const lint = require('gulp-eslint'); + +gulp.task('linter' , () => { + return gulp.src(['./*.js', './test/*.js', './lib/*.js']) + .pipe(lint()) + .pipe(lint.format()); +}); + +gulp.task('tests', () => { + return gulp.src(['./*.js', './test/*.js', './lib/*.js'], {read: false}) + .pipe(mocha({reporter: 'nyan'})); +}); + +gulp.task('watch', () => { + gulp.watch(['./*.js', './test/*.js', './lib/*.js'], ['linter', 'tests']); +}); + +gulp.task('default', ['linter', 'tests', 'watch'], () => { + +}); diff --git a/dustin/index.js b/dustin/index.js deleted file mode 100644 index e69de29..0000000 diff --git a/dustin/lib/superJSONparser.js b/dustin/lib/superJSONparser.js index 6291a22..3c16273 100644 --- a/dustin/lib/superJSONparser.js +++ b/dustin/lib/superJSONparser.js @@ -1,4 +1,4 @@ -"use strict"; +'use strict'; module.exports = (req, res, next) =>{ var body = ''; @@ -7,9 +7,7 @@ module.exports = (req, res, next) =>{ }); req.on('end', () => { try { - var parsed = JSON.parse(body); - req.body = parsed; - + req.body = JSON.parse(body); } catch (e) { e.message = 'Invalid JSON'; e.statusCode = 422; @@ -17,4 +15,4 @@ module.exports = (req, res, next) =>{ } next(); }); -} +}; diff --git a/dustin/server.js b/dustin/server.js index 47069a6..2da2459 100644 --- a/dustin/server.js +++ b/dustin/server.js @@ -1,4 +1,4 @@ -"use strict"; +'use strict'; const express = require('express'); const superJSONparser = require('./lib/superJSONparser'); const app = express(); @@ -7,19 +7,19 @@ var apiRouter = new express.Router(); apiRouter.use(superJSONparser); -apiRouter.post('/', (req,res,next) =>{ -res.send('{"Message": "POST received"}') -res.end(); -}) +apiRouter.post('/', (req, res, next) => { + res.send('{"Message": "POST received"}'); + res.end(); +}); -app.use("/api", apiRouter); +app.use('/api', apiRouter); app.use((req, res) => { res.status(404).json({ - msg: "page not found" - }) + msg: 'page not found' + }); }); app.listen(3000, () => { - console.log("server up on 3000") + console.log('server up on 3000'); }); diff --git a/dustin/test/integration_test.js b/dustin/test/integration_test.js index a7c4fda..7bc1fee 100644 --- a/dustin/test/integration_test.js +++ b/dustin/test/integration_test.js @@ -1,16 +1,16 @@ 'use strict'; -const superJSONparser = require('../lib/superJSONparser'); -var MockReq = require('mock-req'); const chai = require('chai'); const expect = require('chai').expect; const chaiHTTP = require('chai-http'); chai.use(chaiHTTP); const request = chai.request; -require('../server') +require('../server'); describe('INTEGRATION TEST: SuperJSONparser should', function () { it('super return a super error for non JSON', function (done) { - let payload = {message:"test message"} + let payload = { + message: 'test message' + }; request('localhost:3000') .post('/api') .send(payload) @@ -21,16 +21,16 @@ describe('INTEGRATION TEST: SuperJSONparser should', function () { expect(res.text).to.eql('{"Message": "POST received"}'); done(); }); - }); + }); - it('super return a super error for non JSON', function (done) { - let payload = "dsfa" - request('localhost:3000') - .post('/api') - .send(payload) - .end(function (err, res) { - expect(err).to.have.status(422); - done(); - }); + it('super return a super error for non JSON', function (done) { + let payload = 'dsfa'; + request('localhost:3000') + .post('/api') + .send(payload) + .end(function (err, res) { + expect(err).to.have.status(422); + done(); }); - }); + }); +}); diff --git a/dustin/test/unit_test.js b/dustin/test/unit_test.js index b74b9c5..179141d 100644 --- a/dustin/test/unit_test.js +++ b/dustin/test/unit_test.js @@ -1,60 +1,52 @@ 'use strict'; const superJSONparser = require('../lib/superJSONparser'); var MockReq = require('mock-req'); -const chai = require('chai'); const expect = require('chai').expect; -const chaiHTTP = require('chai-http'); -var res = {} +var res = {}; +describe('UNIT TEST: SuperJSONparser should', function () { + it('super parse good JSON', function (done) { -describe('UNIT TEST: SuperJSONparser should', function() { - it('super parse good JSON', function(done) { - - var req = new MockReq({ - method: 'POST', - url: '/' - }) - - //let payload = ("adfasd") - let payload = {hello:"test"} - - req.write(payload); - req.end(); + var req = new MockReq({ + method: 'POST', + url: '/' + }); + let payload = { + hello: 'test' + }; + req.write(payload); + req.end(); - superJSONparser(req, res, function(e){ + superJSONparser(req, res, function (e) { if (e) { done(e); } else { - expect(req.body).to.eql(payload) + expect(req.body).to.eql(payload); done(); } }); }); + it('super return a super error for non JSON', function (done) { - it('super return a super error for non JSON', function(done) { - - var req = new MockReq({ - method: 'POST', - url: '/' - }) - - let payload = ("adfasd") - //let payload = {hello:"test"} + var req = new MockReq({ + method: 'POST', + url: '/' + }); - req.write(payload); - req.end(); + let payload = ('adfasd'); + req.write(payload); + req.end(); - superJSONparser(req, res, function(e){ + superJSONparser(req, res, function (e) { if (e) { - expect(e.message).to.eql('Invalid JSON') - expect(e.statusCode).to.equal(422) + expect(e.message).to.eql('Invalid JSON'); + expect(e.statusCode).to.equal(422); done(); } else { //error - done(new Error("Got good JSON")); + done(new Error('Got good JSON')); } - + }); }); }); -});