Skip to content

Commit c97fb1a

Browse files
committed
Initial commit
0 parents  commit c97fb1a

File tree

6 files changed

+158
-0
lines changed

6 files changed

+158
-0
lines changed

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Mongoose testing examples
2+
3+
This repository contains example code for my article on [unit testing Mongoose models and code using Mongoose models](http://codeutopia.net/blog/2016/06/10/mongoose-models-and-unit-tests-the-definitive-guide/).

package.json

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"name": "mongoose-testing",
3+
"version": "0.0.0",
4+
"description": "",
5+
"main": "index.js",
6+
"directories": {
7+
"test": "test"
8+
},
9+
"dependencies": {
10+
"chai": "^3.5.0",
11+
"mocha": "^2.5.3",
12+
"mongoose": "^4.4.20",
13+
"sinon": "^1.17.4"
14+
},
15+
"devDependencies": {},
16+
"scripts": {
17+
"test": "mocha"
18+
},
19+
"author": "",
20+
"license": "ISC"
21+
}

src/Meme.js

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
var mongoose = require('mongoose');
2+
3+
4+
var memeSchema = new mongoose.Schema({
5+
name: { type: String, required: true },
6+
dank: { type: Boolean },
7+
repost: {
8+
type: Boolean,
9+
validate: function(v) {
10+
return v === true && this.dank === true;
11+
}
12+
}
13+
});
14+
15+
memeSchema.methods.checkForReposts = function(cb) {
16+
this.model('Meme').findOne({
17+
name: this.name,
18+
repost: true
19+
}, function(err, val) {
20+
cb(!!val);
21+
});
22+
};
23+
24+
module.exports = mongoose.model('Meme', memeSchema);

src/routes.js

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
var Meme = require('./Meme');
2+
3+
module.exports.allMemes = function(req, res) {
4+
Meme.find({ repost: req.params.reposts }, function(err, memes) {
5+
res.send(memes);
6+
});
7+
};

test/MemeTest.js

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
var expect = require('chai').expect;
2+
var sinon = require('sinon');
3+
var Promise = require('promise-polyfill');
4+
5+
var Meme = require('../src/Meme');
6+
7+
describe('meme', function() {
8+
it('should be invalid if name is empty', function(done) {
9+
var m = new Meme();
10+
11+
m.validate(function(err) {
12+
expect(err.errors.name).to.exist;
13+
done();
14+
});
15+
});
16+
17+
it('should have validation error for repost if not dank', function(done) {
18+
var m = new Meme({ repost: true });
19+
20+
m.validate(function(err) {
21+
expect(err.errors.repost).to.exist;
22+
done();
23+
});
24+
});
25+
26+
it('should be valid repost when dank', function(done) {
27+
var m = new Meme({ repost: true, dank: true });
28+
29+
m.validate(function(err) {
30+
expect(err.errors.repost).to.not.exist;
31+
done();
32+
});
33+
});
34+
35+
it('should check for reposts with same name', sinon.test(function() {
36+
this.stub(Meme, 'findOne');
37+
var expectedName = 'This name should be used in the check';
38+
var m = new Meme({ name: expectedName });
39+
40+
m.checkForReposts(function() { });
41+
42+
sinon.assert.calledWith(Meme.findOne, {
43+
name: expectedName,
44+
repost: true
45+
});
46+
}));
47+
48+
it('should call back with true when repost exists', sinon.test(function(done) {
49+
var repostObject = { name: 'foo' };
50+
this.stub(Meme, 'findOne').yields(null, repostObject);
51+
var m = new Meme({ name: 'some name' });
52+
53+
m.checkForReposts(function(hasReposts) {
54+
expect(hasReposts).to.be.true;
55+
done();
56+
});
57+
}));
58+
});

test/routesTest.js

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
var expect = require('chai').expect;
2+
var sinon = require('sinon');
3+
4+
var routes = require('../src/routes');
5+
var Meme = require('../src/Meme');
6+
7+
describe('routes', function() {
8+
beforeEach(function() {
9+
sinon.stub(Meme, 'find');
10+
});
11+
12+
13+
afterEach(function() {
14+
Meme.find.restore();
15+
});
16+
17+
it('should send all memes', function() {
18+
var a = { name: 'a' };
19+
var b = { name: 'b' };
20+
var expectedModels = [a, b];
21+
Meme.find.yields(null, expectedModels);
22+
var req = { params: { } };
23+
var res = {
24+
send: sinon.stub()
25+
};
26+
27+
routes.allMemes(req, res);
28+
29+
sinon.assert.calledWith(res.send, expectedModels);
30+
});
31+
32+
it('should query for non-reposts if set as request parameter', function() {
33+
Meme.find.yields(null, []);
34+
var req = {
35+
params: {
36+
reposts: true
37+
}
38+
};
39+
var res = { send: sinon.stub() };
40+
41+
routes.allMemes(req, res);
42+
43+
sinon.assert.calledWith(Meme.find, { repost: true });
44+
});
45+
});

0 commit comments

Comments
 (0)