From 96d540320495c1e3264f4f3b5bd6d4b8b7c57d32 Mon Sep 17 00:00:00 2001 From: YOUR FULL NAME Date: Tue, 24 May 2016 21:08:12 -0700 Subject: [PATCH 1/4] made the first files --- .gitignore | 1 + gulpfile.js | 0 package.json | 35 +++++++++++++++++++++++++++++++++++ server.js | 0 4 files changed, 36 insertions(+) create mode 100644 .gitignore create mode 100644 gulpfile.js create mode 100644 package.json create mode 100644 server.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..e69de29 diff --git a/package.json b/package.json new file mode 100644 index 0000000..deb38e2 --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "drew_express_middleware", + "version": "1.0.0", + "description": "##To Submit this Assignment * fork this repository * write all of your code in a folder containing your name * push to your repository * submit a pull request to this repository * submit a link to your PR in canvas", + "main": "gulpfile.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/drewferris/express_middleware.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/drewferris/express_middleware/issues" + }, + "homepage": "https://github.com/drewferris/express_middleware#readme", + "devDependencies": { + "chai": "^3.5.0", + "chai-http": "^2.0.1", + "gulp": "^3.9.1", + "gulp-eslint": "^2.0.0", + "gulp-mocha": "^2.2.0", + "gulp-watch": "^4.3.5", + "mocha": "^2.4.5" + }, + "dependencies": { + "body-parser": "^1.15.1", + "express": "^4.13.4" + } +} diff --git a/server.js b/server.js new file mode 100644 index 0000000..e69de29 From e0eee57906fc1f6560e3955ab12a6ca5ed0fc78a Mon Sep 17 00:00:00 2001 From: YOUR FULL NAME Date: Wed, 25 May 2016 01:01:10 -0700 Subject: [PATCH 2/4] made first tests --- gulpfile.js | 30 ++++++++++++++++++++ lib/jsonModelParser.js | 20 +++++++++++++ package.json | 3 +- server.js | 62 +++++++++++++++++++++++++++++++++++++++++ test/middleware_test.js | 58 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 lib/jsonModelParser.js create mode 100644 test/middleware_test.js diff --git a/gulpfile.js b/gulpfile.js index e69de29..fdcf6b9 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -0,0 +1,30 @@ +const gulp = require('gulp'); +const eslint = require('gulp-eslint'); +const mocha = require('gulp-mocha'); +const watch = require('gulp-watch'); + +gulp.task('lint', () => { + gulp.src(['./*.js', './test/*.js']) + .pipe(eslint({ + env: [ + 'mocha', + 'es6' + ] + })) + .pipe(eslint.format()); +}); + +gulp.task('mocha', () => { + return gulp.src('./test/*.js', { + read: false + }) + .pipe(mocha({ + reporter: 'nyan' + })); +}); + +gulp.task('watch', () => { + gulp.watch(['./*.js', './test/*.js' ], ['mocha', 'lint']); +}); + +gulp.task('default', ['mocha', 'lint', 'watch']); diff --git a/lib/jsonModelParser.js b/lib/jsonModelParser.js new file mode 100644 index 0000000..45e6c0a --- /dev/null +++ b/lib/jsonModelParser.js @@ -0,0 +1,20 @@ +'use strict'; + +module.exports = (req, res, next) => { + var incJson = ''; + req.on('data', (data) => { + incJson += data.toString(); + }); + req.on('end', () => { + try { + var parsed = JSON.parse(incJson); + req.body = parsed; + req.model.data = parsed; + } catch(e) { + e.message = 'invalid json'; + e.statusCode = 422; + return next(e); + } + next(); + }); +} diff --git a/package.json b/package.json index deb38e2..59d06ee 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "gulp-eslint": "^2.0.0", "gulp-mocha": "^2.2.0", "gulp-watch": "^4.3.5", - "mocha": "^2.4.5" + "mocha": "^2.4.5", + "mock-req": "^0.2.0" }, "dependencies": { "body-parser": "^1.15.1", diff --git a/server.js b/server.js index e69de29..87de369 100644 --- a/server.js +++ b/server.js @@ -0,0 +1,62 @@ +'use strict'; + +const express = require('express'); +const app = express(); +const jsonModelParser = require('./lib/jsonModelParser'); + +var routerGetData = new express.Router(); +var routerSetData = new express.Router(); +var fileRouter = new express.Router(); + +const model = { + data: { + msg: "hello ther" + }, + + nodata: { + msg: "No model" + } +}; + + +app.use((req, res, next) => { + req.model = model; + next(); +}); + + +routerSetData.use(jsonModelParser); + +routerGetData.get('/', (req, res) => { + res.type('json'); + if (req.model.data) { + res.send(req.model.data); + } else { + res.send(req.model.nodata); + } +}); + +routerSetData.post('/', (req, res) => { + res.type('json'); + res.json({ + msg: 'valid data', + data: req.body + }); +}) + +app.use('/drew', routerGetData); +app.use('/drew', routerSetData); +app.use((err, req, res, next) => { + console.log(err); + res.status(err.statusCode || 500).json({ + msg: err.message + }); +}); + +app.use((req, res) => { + res.status(404).json({ + msg: 'page not found' + }); +}); + +app.listen(3000, () => console.log('server up on 3000')); diff --git a/test/middleware_test.js b/test/middleware_test.js new file mode 100644 index 0000000..258eba8 --- /dev/null +++ b/test/middleware_test.js @@ -0,0 +1,58 @@ +'use strict'; + +const chai = require('chai'); +const chaiHTTP = require('chai-http'); +const expect = chai.expect; +chai.use(chaiHTTP); +const request = chai.request; +const jsonModelParser = require('../lib/jsonModelParser'); +var MockReq = require('mock-req'); +require('../server') + +describe('jsonModelParser tests', () => { + it('should receive a get request', (done) => { + request('localhost:3000') + .get('/drew') + .end((err, res) => { + expect(err).to.eql(null); + expect(res.body.msg).to.eql('hello ther'); + expect(res).to.have.status(200); + done(); + }); + }); + + it('should receive a post request', (done) => { + request('localhost:3000') + .post('/drew') + .send('{"test": "test"}') + .end((err, res) => { + expect(err).to.eql(null); + expect(res.body.msg).to.eql('valid data'); + expect(res).to.have.status(200); + done(); + }); + }); + + it('should error for bad path', (done) => { + request('localhost:3000') + .get('/') + .end((err, res) => { + expect(err).to.not.eql(null) + expect(res).to.have.status(404) + expect(res.body.msg).to.eql('page not found'); + done(); + }) + }) + + it('should error for invalid JSON', (done) => { + request('localhost:3000') + .post('/drew') + .send("booger") + .end((err, res) => { + expect(err).to.not.eql(null) + expect(res).to.have.status(422) + expect(res.body.msg).to.eql('invalid json'); + done(); + }) + }) +}) From 7bef342be34f5598e4b18952144741bdb3879bf3 Mon Sep 17 00:00:00 2001 From: YOUR FULL NAME Date: Wed, 25 May 2016 01:46:44 -0700 Subject: [PATCH 3/4] made final tests --- lib/jsonModelParser.js | 2 +- test/middleware_test2.js | 50 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 test/middleware_test2.js diff --git a/lib/jsonModelParser.js b/lib/jsonModelParser.js index 45e6c0a..4cd4d0e 100644 --- a/lib/jsonModelParser.js +++ b/lib/jsonModelParser.js @@ -9,7 +9,7 @@ module.exports = (req, res, next) => { try { var parsed = JSON.parse(incJson); req.body = parsed; - req.model.data = parsed; + } catch(e) { e.message = 'invalid json'; e.statusCode = 422; diff --git a/test/middleware_test2.js b/test/middleware_test2.js new file mode 100644 index 0000000..20f646b --- /dev/null +++ b/test/middleware_test2.js @@ -0,0 +1,50 @@ +'use strict'; +const jsonModelParser = require('../lib/jsonModelParser'); +var MockReq = require('mock-req'); +const chai = require('chai'); +const chaiHTTP = require('chai-http'); +const expect = chai.expect; +var res = {}; + +describe('tests for jsonModelParser', () => { + it('should parse JSON', (done) => { + + var req = new MockReq({ + method: 'POST', + url: '/' + }) + + let data = {will:"work"} + req.write(data); + req.end(); + jsonModelParser(req, res, function(e) { + if(e) { + done(e); + } else { + expect(req.body).to.eql(data) + done(); + } + }); + }); + + it('error on non JSON', (done) => { + + var req = new MockReq({ + method: 'POST', + url: '/' + }) + + let data = ("work") + req.write(data); + req.end(); + jsonModelParser(req, res, function(e) { + if(e) { + expect(e.message).to.eql('invalid json') + expect(e.statusCode).to.eql(422) + done(); + } else { + done(new Error('JSON worked')); + } + }); + }); +}) From b2bbc9f426aabc2e96f765fd460b90ef5a33e50e Mon Sep 17 00:00:00 2001 From: YOUR FULL NAME Date: Wed, 25 May 2016 09:56:56 -0700 Subject: [PATCH 4/4] made linter corrections --- server.js | 8 ++---- test/middleware_test.js | 60 ++++++++++++++++++++-------------------- test/middleware_test2.js | 16 +++++------ 3 files changed, 41 insertions(+), 43 deletions(-) diff --git a/server.js b/server.js index 87de369..9d245e5 100644 --- a/server.js +++ b/server.js @@ -10,21 +10,19 @@ var fileRouter = new express.Router(); const model = { data: { - msg: "hello ther" + msg: 'hello ther' }, nodata: { - msg: "No model" + msg: 'No model' } }; - app.use((req, res, next) => { req.model = model; next(); }); - routerSetData.use(jsonModelParser); routerGetData.get('/', (req, res) => { @@ -42,7 +40,7 @@ routerSetData.post('/', (req, res) => { msg: 'valid data', data: req.body }); -}) +}); app.use('/drew', routerGetData); app.use('/drew', routerSetData); diff --git a/test/middleware_test.js b/test/middleware_test.js index 258eba8..4ed4876 100644 --- a/test/middleware_test.js +++ b/test/middleware_test.js @@ -7,52 +7,52 @@ chai.use(chaiHTTP); const request = chai.request; const jsonModelParser = require('../lib/jsonModelParser'); var MockReq = require('mock-req'); -require('../server') +require('../server'); describe('jsonModelParser tests', () => { it('should receive a get request', (done) => { - request('localhost:3000') - .get('/drew') - .end((err, res) => { - expect(err).to.eql(null); - expect(res.body.msg).to.eql('hello ther'); - expect(res).to.have.status(200); - done(); - }); - }); + request('localhost:3000') + .get('/drew') + .end((err, res) => { + expect(err).to.eql(null); + expect(res.body.msg).to.eql('hello ther'); + expect(res).to.have.status(200); + done(); + }); + }); it('should receive a post request', (done) => { - request('localhost:3000') - .post('/drew') - .send('{"test": "test"}') - .end((err, res) => { - expect(err).to.eql(null); - expect(res.body.msg).to.eql('valid data'); - expect(res).to.have.status(200); - done(); - }); - }); + request('localhost:3000') + .post('/drew') + .send('{"test": "test"}') + .end((err, res) => { + expect(err).to.eql(null); + expect(res.body.msg).to.eql('valid data'); + expect(res).to.have.status(200); + done(); + }); + }); it('should error for bad path', (done) => { request('localhost:3000') .get('/') .end((err, res) => { - expect(err).to.not.eql(null) - expect(res).to.have.status(404) + expect(err).to.not.eql(null); + expect(res).to.have.status(404); expect(res.body.msg).to.eql('page not found'); done(); - }) - }) + }); + }); it('should error for invalid JSON', (done) => { request('localhost:3000') .post('/drew') - .send("booger") + .send('booger') .end((err, res) => { - expect(err).to.not.eql(null) - expect(res).to.have.status(422) + expect(err).to.not.eql(null); + expect(res).to.have.status(422); expect(res.body.msg).to.eql('invalid json'); done(); - }) - }) -}) + }); + }); +}); diff --git a/test/middleware_test2.js b/test/middleware_test2.js index 20f646b..8aec556 100644 --- a/test/middleware_test2.js +++ b/test/middleware_test2.js @@ -12,16 +12,16 @@ describe('tests for jsonModelParser', () => { var req = new MockReq({ method: 'POST', url: '/' - }) + }); - let data = {will:"work"} + let data = {will:'work'}; req.write(data); req.end(); jsonModelParser(req, res, function(e) { if(e) { done(e); } else { - expect(req.body).to.eql(data) + expect(req.body).to.eql(data); done(); } }); @@ -32,19 +32,19 @@ describe('tests for jsonModelParser', () => { var req = new MockReq({ method: 'POST', url: '/' - }) + }); - let data = ("work") + let data = ('work'); req.write(data); req.end(); jsonModelParser(req, res, function(e) { if(e) { - expect(e.message).to.eql('invalid json') - expect(e.statusCode).to.eql(422) + expect(e.message).to.eql('invalid json'); + expect(e.statusCode).to.eql(422); done(); } else { done(new Error('JSON worked')); } }); }); -}) +});