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..fdcf6b9 --- /dev/null +++ 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..4cd4d0e --- /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; + + } catch(e) { + e.message = 'invalid json'; + e.statusCode = 422; + return next(e); + } + next(); + }); +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..59d06ee --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "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", + "mock-req": "^0.2.0" + }, + "dependencies": { + "body-parser": "^1.15.1", + "express": "^4.13.4" + } +} diff --git a/server.js b/server.js new file mode 100644 index 0000000..9d245e5 --- /dev/null +++ b/server.js @@ -0,0 +1,60 @@ +'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..4ed4876 --- /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(); + }); + }); +}); diff --git a/test/middleware_test2.js b/test/middleware_test2.js new file mode 100644 index 0000000..8aec556 --- /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')); + } + }); + }); +});