github-webhook-forwarding
Version:
Forwards Github Webhooks to overcome the maximum number of webhooks allowed by Github (20)
115 lines (107 loc) • 3.19 kB
JavaScript
var path = require('path')
var http = require('http')
var log = require('npmlog')
var express = require('express')
var fs = require('vigour-fs-promised')
var handleWebhook = require('../../lib/server/handlewebhook')
var subsFileDir = path.join(__dirname, 'handleSubscriptionData')
var subsFilePath = path.join(subsFileDir, 'subscriptions.json')
var config = {
subsFilePath: subsFilePath
}
var middleware = handleWebhook(config)
var gwfMockPort = 8000
var ports = [8003, 8004]
var subscriptions = ports.map(function (port) {
return 'http://localhost:' + port + '/push'
})
var nb = subscriptions.length
describe('handlewebhook', function () {
var count = 0
var payloadStart = 'Bugs'
var payloadEnd = ' Bunny'
var payload = payloadStart + payloadEnd
var mockHeaders = {
host: 'localhost:' + gwfMockPort,
connection: 'close',
boom: 'AH!',
'content-length': payload.length
}
before(function () {
return fs.writeJSONAsync(subsFilePath, subscriptions, { mkdirp: true })
})
// git-spy mocks
before(function () {
return Promise.all(ports.map(function (port) {
return new Promise(function (resolve, reject) {
var app = express()
app.post('/push', function (req, res, next) {
count += 1
var total = ''
// log.info('req.headers', req.headers)
// log.info('mockHeaders', mockHeaders)
// expect(req.headers).to.deep.equal(mockHeaders)
req.on('error', errHandler('git-spy req'))
res.on('error', errHandler('git-spy res'))
req.on('data', function (chunk) {
total += chunk.toString()
})
req.on('end', function () {
expect(total).to.equal(payload)
})
res.status(202)
res.end('ACCEPTED')
})
app.listen(port, '127.0.0.1', resolve)
})
}))
})
// GWF mock
before(function (done) {
var app = express()
app.post('/push', function (req, res, next) {
middleware(req, res, next)
}, function () {
expect('next to be called').to.equal(false)
})
app.listen(gwfMockPort, '127.0.0.1', done)
})
it('should respond with 202', function (done) {
// GitHub mock
var req = http.request({
method: 'POST',
path: '/push',
port: gwfMockPort,
headers: mockHeaders
}, function (res) {
res.on('error', errHandler('GitHub mock response'))
// log.info('GitHub mock getting response:', res.statusCode, res.statusMessage)
expect(res.statusCode).to.equal(202)
var total = ''
res.on('data', function (chunk) {
total += chunk.toString()
})
res.on('end', function () {
expect(total).to.equal('ACCEPTED')
done()
})
})
req.on('error', errHandler('req'))
req.write(payloadStart)
req.write(payloadEnd)
req.end()
})
it('should forward webhook to every subscriber', function () {
expect(count).to.equal(nb)
})
after(function () {
return fs.removeAsync(subsFileDir)
})
// after: close servers...
})
var errHandler = function (tag) {
return function (reason) {
log.error(tag, reason)
}
}