From febba7653aae8926e0e61ccaf4ec518781abd760 Mon Sep 17 00:00:00 2001 From: Marcus Hammarberg Date: Tue, 21 Apr 2015 08:22:28 +0700 Subject: [PATCH] After writing first blog post --- package.json | 2 +- test.js | 78 --------------------------------------------- test/testHelpers.js | 16 ++++++++++ test/user.del.js | 31 ++++++++++++++++++ test/user.get.js | 35 ++++++++++++++++++++ test/user.post.js | 46 ++++++++++++++++++++++++++ test/user.update.js | 32 +++++++++++++++++++ userRoutes.js | 20 ++++++++++++ 8 files changed, 181 insertions(+), 79 deletions(-) delete mode 100644 test.js create mode 100644 test/testHelpers.js create mode 100644 test/user.del.js create mode 100644 test/user.get.js create mode 100644 test/user.post.js create mode 100644 test/user.update.js diff --git a/package.json b/package.json index 89fe2f5..8619a91 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "main": "app.js", "scripts": { "start": "node --harmony app.js", - "test": "./node_modules/mocha/bin/mocha --harmony-generators test.js -u bdd -R spec" + "test": "./node_modules/mocha/bin/mocha --harmony-generators -u bdd -R spec" }, "author": "Marcus Hammarberg", "license": "BSD-2-Clause", diff --git a/test.js b/test.js deleted file mode 100644 index 0eb6515..0000000 --- a/test.js +++ /dev/null @@ -1,78 +0,0 @@ -var co = require('co'); -var users = require('./userRoutes.js').users; - -var app = require('./app.js'); -var request = require('supertest').agent(app.listen()); - -describe('Simple User Api:', function(){ - - var test_user = { name: 'Marcus', City : 'Bandung, Indonesia'}; - - it('creates a new user', function(done){ - // Post - request - .post('/user') - .send(test_user) - .expect('location', /^\/user\/[0-9a-fA-F]{24}$/) // Mongo Object Id /user/234234523562512512 - .expect(200, done); - }); - - - var removeAll = function(done){ - co(function *(){ - yield users.remove({}); - })(done); - }; - - beforeEach(function (done) { - removeAll(done); - }); - - afterEach(function (done) { - removeAll(done); - }); - - it('get existing user', function (done) { - co(function *() { - // Insert test user in database - var user = yield users.insert(test_user); - var userUrl = '/user/' + user._id; - - // Get - request - .get(userUrl) - .set('Accept', 'application/json') - .expect('Content-Type', /json/) - .expect(/Marcus/) - .expect(/Bandung, Indonesia/) - .expect(200, done); - })(); - }); - - it('updates an existing user', function(done){ - co(function *() { - // Insert test user in database - var user = yield users.insert(test_user); - var userUrl = '/user/' + user._id; - - request - .put(userUrl) - .send({name: 'Marcus v2', City: 'Bandung Updated'}) - .expect('location', userUrl) - .expect(204, done); - })(); - }); - - it('deletes an existing user', function(done){ - co(function *() { - // Insert test user in database - var user = yield users.insert(test_user); - var userUrl = '/user/' + user._id; - - // Delete the user - request - .del(userUrl) - .expect(200, done); - })(); - }); -}); \ No newline at end of file diff --git a/test/testHelpers.js b/test/testHelpers.js new file mode 100644 index 0000000..44d3ec2 --- /dev/null +++ b/test/testHelpers.js @@ -0,0 +1,16 @@ +var co = require('co'); + +var app = require('../app.js'); +module.exports.request = require('supertest').agent(app.listen()); + +var users = require('../userRoutes.js').users; +module.exports.users = users; + +module.exports.removeAll = function(done){ + co(function *(){ + yield users.remove({}); + // and other things we need to clean up + })(done); +}; + +module.exports.test_user = { name: 'Marcus', city : 'Bandung, Indonesia'}; \ No newline at end of file diff --git a/test/user.del.js b/test/user.del.js new file mode 100644 index 0000000..0593258 --- /dev/null +++ b/test/user.del.js @@ -0,0 +1,31 @@ +var co = require('co'); +var helpers = require('./testHelpers.js'); +var users = helpers.users; +var request = helpers.request; + +describe('DEL to /user/:id', function(){ + + var test_user = {}; + + beforeEach(function (done) { + test_user = helpers.test_user; + helpers.removeAll(done); + }); + + afterEach(function (done) { + helpers.removeAll(done); + }); + + it('deletes an existing user', function(done){ + co(function *() { + // Insert test user in database + var user = yield users.insert(test_user); + var userUrl = '/user/' + user._id; + + // Delete the user + request + .del(userUrl) + .expect(200, done); + })(); + }); +}); \ No newline at end of file diff --git a/test/user.get.js b/test/user.get.js new file mode 100644 index 0000000..f24203f --- /dev/null +++ b/test/user.get.js @@ -0,0 +1,35 @@ +var co = require('co'); +var helpers = require('./testHelpers.js'); +var users = helpers.users; +var request = helpers.request; + +describe('GET /user/:id ', function(){ + + var test_user = {}; + + beforeEach(function (done) { + test_user = helpers.test_user; + helpers.removeAll(done); + }); + + afterEach(function (done) { + helpers.removeAll(done); + }); + + it('returns JSON for existing user', function (done) { + co(function *() { + // Insert test user in database + var user = yield users.insert(test_user); + var userUrl = '/user/' + user._id; + + // Get + request + .get(userUrl) + .set('Accept', 'application/json') + .expect('Content-Type', /json/) + .expect(/Marcus/) + .expect(/Bandung, Indonesia/) + .expect(200, done); + })(); + }); +}); \ No newline at end of file diff --git a/test/user.post.js b/test/user.post.js new file mode 100644 index 0000000..5bb2d2a --- /dev/null +++ b/test/user.post.js @@ -0,0 +1,46 @@ +var helpers = require('./testHelpers.js'); +var users = helpers.users; +var request = helpers.request; + +describe('POST to /user', function(){ + + var test_user = {}; + + beforeEach(function (done) { + test_user = helpers.test_user; + helpers.removeAll(done); + }); + + afterEach(function (done) { + helpers.removeAll(done); + }); + + it('creates a new user for complete posted data', function(done){ + // Post + request + .post('/user') + .send(test_user) + .expect('location', /^\/user\/[0-9a-fA-F]{24}$/) // Mongo Object Id /user/234234523562512512 + .expect(200, done); + }); + + it('returns validation error if name is not present', function(done){ + var u = { city : "A city without a user name"}; + + request + .post('/user') + .send(u) + .expect('ValidationError', "Name is required") + .expect(200, done); + }); + + it('returns validation error if city is not present', function(done){ + var u = { name : "A name without a city"}; + + request + .post('/user') + .send(u) + .expect('ValidationError', "City is required") + .expect(200, done); + }); +}); \ No newline at end of file diff --git a/test/user.update.js b/test/user.update.js new file mode 100644 index 0000000..7a9d96a --- /dev/null +++ b/test/user.update.js @@ -0,0 +1,32 @@ +var co = require('co'); +var helpers = require('./testHelpers.js'); +var users = helpers.users; +var request = helpers.request; + +describe('PUT to /user', function(){ + + var test_user = {}; + + beforeEach(function (done) { + test_user = helpers.test_user; + helpers.removeAll(done); + }); + + afterEach(function (done) { + helpers.removeAll(done); + }); + + it('updates an existing user for complete put data', function(done){ + co(function *() { + // Insert test user in database + var user = yield users.insert(test_user); + var userUrl = '/user/' + user._id; + + request + .put(userUrl) + .send({name: 'Marcus v2', City: 'Bandung Updated'}) + .expect('location', userUrl) + .expect(204, done); + })(); + }); +}); \ No newline at end of file diff --git a/userRoutes.js b/userRoutes.js index 2002df1..2135c30 100644 --- a/userRoutes.js +++ b/userRoutes.js @@ -9,6 +9,18 @@ module.exports.users = users; module.exports.add = function * () { var postedUser = yield parse(this); + if(!exists(postedUser.name)){ + this.set('ValidationError', 'Name is required'); + this.status = 200; + return; + }; + + if(!exists(postedUser.city)){ + this.set('ValidationError', 'City is required'); + this.status = 200; + return; + }; + var insertedUser = yield users.insert(postedUser); this.set("location", "/user/" + insertedUser._id); @@ -33,4 +45,12 @@ module.exports.update = function * (id) { module.exports.remove = function * (id) { yield users.remove({_id : id}); this.status = 200; +}; + +var exists = function (value) { + if(value === undefined) + return false; + if(value === null) + return false; + return true; }; \ No newline at end of file