├── .gitignore ├── README.md ├── package.json ├── server ├── _config.js ├── app.js ├── models │ └── blob.js └── routes │ └── index.js └── test └── test-server.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_Store 3 | npm-debug.log 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [blog post](http://mherman.org/blog/2015/09/10/testing-node-js-with-mocha-and-chai/#.VfJlgVNViko) 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "testing-node", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./server/app" 7 | }, 8 | "dependencies": { 9 | "body-parser": "~1.13.2", 10 | "cookie-parser": "~1.3.5", 11 | "debug": "~2.2.0", 12 | "express": "~4.13.1", 13 | "mongoose": "^4.1.5", 14 | "morgan": "~1.6.1" 15 | }, 16 | "devDependencies": { 17 | "chai": "^3.2.0", 18 | "chai-http": "^1.0.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /server/_config.js: -------------------------------------------------------------------------------- 1 | var config = {}; 2 | 3 | config.mongoURI = { 4 | development: 'mongodb://localhost/node-testing', 5 | test: 'mongodb://localhost/node-test' 6 | }; 7 | 8 | module.exports = config; 9 | -------------------------------------------------------------------------------- /server/app.js: -------------------------------------------------------------------------------- 1 | // *** main dependencies *** // 2 | var express = require('express'); 3 | var path = require('path'); 4 | var logger = require('morgan'); 5 | var cookieParser = require('cookie-parser'); 6 | var bodyParser = require('body-parser'); 7 | var http = require('http'); 8 | var mongoose = require('mongoose'); 9 | 10 | // *** routes *** // 11 | var routes = require('./routes/index.js'); 12 | 13 | // *** express instance *** // 14 | var app = express(); 15 | 16 | // *** config file *** // 17 | var config = require('./_config'); 18 | 19 | // *** mongoose *** /// 20 | mongoose.connect(config.mongoURI[app.settings.env], function(err, res) { 21 | if(err) { 22 | console.log('Error connecting to the database. ' + err); 23 | } else { 24 | console.log('Connected to Database: ' + config.mongoURI[app.settings.env]); 25 | } 26 | }); 27 | 28 | // *** config middleware *** // 29 | app.use(logger('dev')); 30 | app.use(bodyParser.json()); 31 | app.use(bodyParser.urlencoded({ extended: false })); 32 | app.use(cookieParser()); 33 | app.use(express.static(path.join(__dirname, '../client/public'))); 34 | 35 | // *** main routes *** // 36 | app.use('/', routes); 37 | 38 | // *** server config *** // 39 | var server = http.createServer(app); 40 | server.listen(1337, function() { 41 | console.log("Node server running on http://localhost:1337"); 42 | }); 43 | 44 | module.exports = app; 45 | -------------------------------------------------------------------------------- /server/models/blob.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'); 2 | var Schema = mongoose.Schema; 3 | 4 | var blobSchema = new Schema({ 5 | name: String, 6 | lastName: String 7 | }); 8 | 9 | 10 | module.exports = mongoose.model('blobs', blobSchema); 11 | -------------------------------------------------------------------------------- /server/routes/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var Blob = require('../models/blob'); 4 | 5 | router.get('/', function(req, res, next) { 6 | res.send('Hello, World!'); 7 | }); 8 | 9 | // *** api routes *** // 10 | router.get('/blobs', findAllBlobs); 11 | router.get('/blob/:id', findBlobById); 12 | router.post('/blobs', addBlob); 13 | router.put('/blob/:id', updateBlob); 14 | router.delete('/blob/:id', deleteBlob); 15 | 16 | 17 | // *** get ALL blobs *** // 18 | function findAllBlobs(req, res) { 19 | Blob.find(function(err, blobs) { 20 | if(err) { 21 | res.json({'ERROR': err}); 22 | } else { 23 | res.json(blobs); 24 | } 25 | }); 26 | } 27 | 28 | // *** get SINGLE blobs *** // 29 | function findBlobById(req, res) { 30 | Blob.findById(req.params.id, function(err, blob) { 31 | if(err) { 32 | res.json({'ERROR': err}); 33 | } else { 34 | res.json(blob); 35 | } 36 | }); 37 | } 38 | 39 | // *** post ALL blobs *** // 40 | function addBlob(req, res) { 41 | var newBlob = new Blob({ 42 | name: req.body.name, 43 | lastName: req.body.lastName 44 | }); 45 | newBlob.save(function(err) { 46 | if(err) { 47 | res.json({'ERROR': err}); 48 | } else { 49 | res.json({'SUCCESS': newBlob}); 50 | } 51 | }); 52 | } 53 | 54 | // *** put SINGLE blob *** // 55 | function updateBlob(req, res) { 56 | Blob.findById(req.params.id, function(err, blob) { 57 | blob.name = req.body.name; 58 | blob.lastName = req.body.lastName; 59 | blob.save(function(err) { 60 | if(err) { 61 | res.json({'ERROR': err}); 62 | } else { 63 | res.json({'UPDATED': blob}); 64 | } 65 | }); 66 | }); 67 | } 68 | 69 | // *** delete SINGLE blob *** // 70 | function deleteBlob(req, res) { 71 | Blob.findById(req.params.id, function(err, blob) { 72 | if(err) { 73 | res.json({'ERROR': err}); 74 | } else { 75 | blob.remove(function(err){ 76 | if(err) { 77 | res.json({'ERROR': err}); 78 | } else { 79 | res.json({'REMOVED': blob}); 80 | } 81 | }); 82 | } 83 | }); 84 | } 85 | 86 | module.exports = router; 87 | -------------------------------------------------------------------------------- /test/test-server.js: -------------------------------------------------------------------------------- 1 | process.env.NODE_ENV = 'test'; 2 | 3 | var chai = require('chai'); 4 | var chaiHttp = require('chai-http'); 5 | var mongoose = require("mongoose"); 6 | 7 | var server = require('../server/app'); 8 | var Blob = require("../server/models/blob"); 9 | 10 | var should = chai.should(); 11 | chai.use(chaiHttp); 12 | 13 | 14 | describe('Blobs', function() { 15 | 16 | Blob.collection.drop(); 17 | 18 | beforeEach(function(done){ 19 | var newBlob = new Blob({ 20 | name: 'Bat', 21 | lastName: 'man' 22 | }); 23 | newBlob.save(function(err) { 24 | done(); 25 | }); 26 | }); 27 | afterEach(function(done){ 28 | Blob.collection.drop(); 29 | done(); 30 | }); 31 | 32 | it('should list ALL blobs on /blobs GET', function(done) { 33 | chai.request(server) 34 | .get('/blobs') 35 | .end(function(err, res){ 36 | res.should.have.status(200); 37 | res.should.be.json; 38 | res.body.should.be.a('array'); 39 | res.body[0].should.have.property('_id'); 40 | res.body[0].should.have.property('name'); 41 | res.body[0].should.have.property('lastName'); 42 | res.body[0].name.should.equal('Bat'); 43 | res.body[0].lastName.should.equal('man'); 44 | done(); 45 | }); 46 | }); 47 | 48 | it('should list a SINGLE blob on /blob/ GET', function(done) { 49 | var newBlob = new Blob({ 50 | name: 'Super', 51 | lastName: 'man' 52 | }); 53 | newBlob.save(function(err, data) { 54 | chai.request(server) 55 | .get('/blob/'+data.id) 56 | .end(function(err, res){ 57 | res.should.have.status(200); 58 | res.should.be.json; 59 | res.body.should.be.a('object'); 60 | res.body.should.have.property('_id'); 61 | res.body.should.have.property('name'); 62 | res.body.should.have.property('lastName'); 63 | res.body.name.should.equal('Super'); 64 | res.body.lastName.should.equal('man'); 65 | res.body._id.should.equal(data.id); 66 | done(); 67 | }); 68 | }); 69 | }); 70 | 71 | it('should add a SINGLE blob on /blobs POST', function(done) { 72 | chai.request(server) 73 | .post('/blobs') 74 | .send({'name': 'Java', 'lastName': 'Script'}) 75 | .end(function(err, res){ 76 | res.should.have.status(200); 77 | res.should.be.json; 78 | res.body.should.be.a('object'); 79 | res.body.should.have.property('SUCCESS'); 80 | res.body.SUCCESS.should.be.a('object'); 81 | res.body.SUCCESS.should.have.property('name'); 82 | res.body.SUCCESS.should.have.property('lastName'); 83 | res.body.SUCCESS.should.have.property('_id'); 84 | res.body.SUCCESS.name.should.equal('Java'); 85 | res.body.SUCCESS.lastName.should.equal('Script'); 86 | done(); 87 | }); 88 | }); 89 | 90 | it('should update a SINGLE blob on /blob/ PUT', function(done) { 91 | chai.request(server) 92 | .get('/blobs') 93 | .end(function(err, res){ 94 | chai.request(server) 95 | .put('/blob/'+res.body[0]._id) 96 | .send({'name': 'Spider'}) 97 | .end(function(error, response){ 98 | response.should.have.status(200); 99 | response.should.be.json; 100 | response.body.should.be.a('object'); 101 | response.body.should.have.property('UPDATED'); 102 | response.body.UPDATED.should.be.a('object'); 103 | response.body.UPDATED.should.have.property('name'); 104 | response.body.UPDATED.should.have.property('_id'); 105 | response.body.UPDATED.name.should.equal('Spider'); 106 | done(); 107 | }); 108 | }); 109 | }); 110 | 111 | it('should delete a SINGLE blob on /blob/ DELETE', function(done) { 112 | chai.request(server) 113 | .get('/blobs') 114 | .end(function(err, res){ 115 | chai.request(server) 116 | .delete('/blob/'+res.body[0]._id) 117 | .end(function(error, response){ 118 | response.should.have.status(200); 119 | response.should.be.json; 120 | response.body.should.be.a('object'); 121 | response.body.should.have.property('REMOVED'); 122 | response.body.REMOVED.should.be.a('object'); 123 | response.body.REMOVED.should.have.property('name'); 124 | response.body.REMOVED.should.have.property('_id'); 125 | response.body.REMOVED.name.should.equal('Bat'); 126 | done(); 127 | }); 128 | }); 129 | }); 130 | 131 | }); 132 | --------------------------------------------------------------------------------