From 4562696cdba8112c722502bb13508bd5295cb2ff Mon Sep 17 00:00:00 2001 From: Scott O'Neal Date: Sat, 6 Jun 2015 20:53:52 -0400 Subject: [PATCH 1/3] Updated lib/index.js with emit on spawn and more robust error handling. Updated package json to have repository field and testing deps. --- lib/index.js | 22 +++++++++++++++++++--- package.json | 13 ++++++++++++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/lib/index.js b/lib/index.js index 1c84390..ffd4bad 100644 --- a/lib/index.js +++ b/lib/index.js @@ -30,7 +30,8 @@ module.exports = function (ref, action) { } hookshot.emit('hook', payload); hookshot.emit(payload.ref, payload); - res.send(202, 'Accepted\n'); + res.status(202); + res.send('Accepted\n'); }); if (arguments.length == 1) { @@ -51,13 +52,28 @@ module.exports = function (ref, action) { } hookshot.on(ref, function(payload) { - // shell command - spawn(shell, args, opts); + // Send emit spawn event w/ instance + hookshot.emit('spawn', spawn(shell, args, opts)); }); } else if (typeof action == 'function') { hookshot.on(ref, action); } + // Development Error middleware + if ( process.env.NODE_ENV === 'development' ) { + hookshot.use(function(err, req, res, next) { + console.log(err.stack); + next(err); + }); + } + + // Default Error middlware + hookshot.use(function(err, req, res, next) { + hookshot.emit('error', err); + res.status(500); + res.end(err.message); + }); + return hookshot; }; diff --git a/package.json b/package.json index 0d0cc42..38e4943 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,15 @@ "name": "hookshot", "author": "Marco Aurelio ", "version": "0.1.0", + "repository": { + "type": "git", + "url": "https://github.com/coreh/hookshot.git" + }, + "scripts": { + "test": "node_modules/.bin/mocha" + }, "dependencies": { - "express": "~4.9.0", + "express": "~4.9.0", "commander": "~2.3.0", "lockfile": "~1.0.0", "body-parser": "~1.8.2" @@ -11,5 +18,9 @@ "main": "lib", "bin": { "hookshot": "./bin/hookshot" + }, + "devDependencies": { + "mocha": "^2.2.5", + "supertest": "^1.0.1" } } From bc5b3c0d0e7135e220473f343a4ff0320a5b6662 Mon Sep 17 00:00:00 2001 From: Scott O'Neal Date: Sat, 6 Jun 2015 20:55:27 -0400 Subject: [PATCH 2/3] Created basic BDD tests. --- test/test.js | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 test/test.js diff --git a/test/test.js b/test/test.js new file mode 100644 index 0000000..9c171d9 --- /dev/null +++ b/test/test.js @@ -0,0 +1,130 @@ +var assert = require('assert'), + supertest = require('supertest'), + hookshot = require('../lib'); + +process.env.NODE_ENV = 'test'; + +describe('hookshot server', function() { + + var server, request; + + beforeEach(function() { + server = hookshot('test', 'exit 1'), + request = supertest(server); + }); + + it('should throw an error on invalid payload', function(done) { + request + .post('/') + .set('Accept', 'application/json') + .send({}) + .end(function(err) { + assert(err); + done(); + }); + }); + + it('should emit an error on invalid payload', function(done) { + + var errorEmitCheck = function(err) { + assert(err); + done(); + server.removeListener('error', errorEmitCheck); + }; + + server.on('error', errorEmitCheck); + + request + .post('/') + .set('Accept', 'application/json') + .send({}) + .expect(500) + .end(function(err) { + assert(err); + }); + }); + + it('should get a create event', function(done) { + server.on('create', function(payload) { + assert(payload); + done(); + }); + + request + .post('/') + .set('Accept', 'application/json') + .send({ ref: 'test', created: true }) + .expect(202) + .end(function(err, res) { + assert(!err); + }); + }); + + it('should get a delete event', function(done) { + server.on('delete', function(payload) { + assert(payload); + done(); + }); + + request + .post('/') + .set('Accept', 'application/json') + .send({ ref: 'test', deleted: true }) + .expect(202) + .end(function(err, res) { + assert(!err); + }); + }); + + it('should get a push event if created and deleted are falsy', function(done) { + server.on('push', function(payload) { + assert(payload); + done(); + }); + + request + .post('/') + .set('Accept', 'application/json') + .send({ ref: 'test' }) + .expect(202) + .end(function(err, res) { + assert(!err); + }); + }); + + it('should get reference event with payload on hook', function(done) { + server.on('test', function(payload) { + done(); + }); + + request + .post('/') + .set('Accept', 'application/json') + .send({ ref: 'test' }) + .expect(202) + .end(function(err, res) { + assert(!err); + }); + + }); + + it('should run command `exit 1` when running receiving a hook for reference "test"', function(done) { + + server.on('spawn', function(instance) { + instance.on('close', function(code) { + assert.equal(code, 1); + done(); + }); + }); + + request + .post('/') + .set('Accept', 'application/json') + .send({ ref: 'test' }) + .expect(202) + .end(function(err, res) { + assert(!err); + }); + }); +}); + From 974d6ce399519fdd7e221f2f955e6aaef28af831 Mon Sep 17 00:00:00 2001 From: Scott O'Neal Date: Tue, 9 Jun 2015 14:28:54 -0400 Subject: [PATCH 3/3] Cleaned up a couple of tests, added documentation for spawn event. --- README.md | 17 +++++++++++++++++ test/test.js | 13 +++++-------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index b3c048f..1b9c2a9 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,23 @@ hookshot() }) ``` +### Spawn Event + +If hookshot was created with a shell command as the action, it will throw a spawn event with the child_process spawn instance. + +```javascript +var server = hookshot('refs/head/master', 'git pull && make').listen(3000); + +server.on('spawn', function(spawn) { + // Bind on close to get exit code + spawn.on('close', function(code) { + if ( code !== 0 ) { + console.log('something went wrong'); + } + }); +}); +``` + ### CLI Tool A companion CLI tool is provided for convenience. To use it, install **hookshot** via npm using the `-g` flag: diff --git a/test/test.js b/test/test.js index 9c171d9..269ba11 100644 --- a/test/test.js +++ b/test/test.js @@ -19,20 +19,17 @@ describe('hookshot server', function() { .set('Accept', 'application/json') .send({}) .end(function(err) { - assert(err); + assert(err instanceof Error); done(); }); }); it('should emit an error on invalid payload', function(done) { - var errorEmitCheck = function(err) { - assert(err); + server.on('error', function(err) { + assert(err instanceof Error); done(); - server.removeListener('error', errorEmitCheck); - }; - - server.on('error', errorEmitCheck); + }); request .post('/') @@ -40,7 +37,7 @@ describe('hookshot server', function() { .send({}) .expect(500) .end(function(err) { - assert(err); + assert(err instanceof Error); }); });