2017-09-07 03:43:09 +08:00
|
|
|
const request = require('supertest');
|
|
|
|
const nock = require("nock");
|
|
|
|
const Logger = require('../logger.js');
|
|
|
|
const utils = require('../utils.js');
|
2019-03-27 04:03:05 +08:00
|
|
|
const config = require('config');
|
2017-09-07 03:43:09 +08:00
|
|
|
const Hook = require('../hook.js');
|
|
|
|
const Helpers = require('./helpers.js')
|
|
|
|
const sinon = require('sinon');
|
2017-11-07 02:46:12 +08:00
|
|
|
const winston = require('winston');
|
2017-09-07 03:43:09 +08:00
|
|
|
|
2019-03-30 04:52:58 +08:00
|
|
|
Application = require('../application.js');
|
|
|
|
|
|
|
|
const sharedSecret = process.env.SHARED_SECRET || sharedSecret;
|
|
|
|
|
|
|
|
let globalHooks = config.get('hooks');
|
2018-07-26 02:14:55 +08:00
|
|
|
|
2017-09-07 03:43:09 +08:00
|
|
|
// Block winston from logging
|
2017-11-07 02:46:12 +08:00
|
|
|
Logger.remove(winston.transports.Console);
|
2017-09-07 03:43:09 +08:00
|
|
|
describe('bbb-webhooks tests', () => {
|
2017-11-07 02:46:12 +08:00
|
|
|
before( (done) => {
|
2019-03-30 04:52:58 +08:00
|
|
|
globalHooks.queueSize = 10;
|
|
|
|
globalHooks.permanentURLs = [ { url: "http://wh.requestcatcher.com", getRaw: true } ];
|
2017-09-07 03:43:09 +08:00
|
|
|
application = new Application();
|
2017-11-07 02:46:12 +08:00
|
|
|
application.start( () => {
|
|
|
|
done();
|
|
|
|
});
|
2017-09-07 03:43:09 +08:00
|
|
|
});
|
2017-11-07 02:46:12 +08:00
|
|
|
beforeEach( (done) => {
|
2019-03-30 04:52:58 +08:00
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
Helpers.flushall(Application.redisClient());
|
2017-11-07 02:46:12 +08:00
|
|
|
hooks.forEach( hook => {
|
|
|
|
Helpers.flushredis(hook);
|
|
|
|
})
|
|
|
|
done();
|
|
|
|
})
|
2017-09-07 03:43:09 +08:00
|
|
|
after( () => {
|
2019-03-30 04:52:58 +08:00
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
Helpers.flushall(Application.redisClient());
|
2017-11-07 02:46:12 +08:00
|
|
|
hooks.forEach( hook => {
|
|
|
|
Helpers.flushredis(hook);
|
2017-09-07 03:43:09 +08:00
|
|
|
})
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('GET /hooks/list permanent', () => {
|
|
|
|
it('should list permanent hook', (done) => {
|
2018-07-26 09:05:51 +08:00
|
|
|
let getUrl = utils.checksumAPI(Helpers.url + Helpers.listUrl, sharedSecret);
|
2017-09-07 03:43:09 +08:00
|
|
|
getUrl = Helpers.listUrl + '?checksum=' + getUrl
|
2017-11-07 02:46:12 +08:00
|
|
|
|
2017-09-07 03:43:09 +08:00
|
|
|
request(Helpers.url)
|
|
|
|
.get(getUrl)
|
|
|
|
.expect('Content-Type', /text\/xml/)
|
|
|
|
.expect(200, (res) => {
|
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
if (hooks && hooks.some( hook => { return hook.permanent }) ) {
|
|
|
|
done();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
done(new Error ("permanent hook was not created"));
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('GET /hooks/create', () => {
|
2017-11-07 02:46:12 +08:00
|
|
|
after( (done) => {
|
2017-09-07 03:43:09 +08:00
|
|
|
const hooks = Hook.allGlobalSync();
|
2017-11-07 02:46:12 +08:00
|
|
|
Hook.removeSubscription(hooks[hooks.length-1].id, () => { done(); });
|
2017-09-07 03:43:09 +08:00
|
|
|
});
|
|
|
|
it('should create a hook', (done) => {
|
2018-07-26 09:05:51 +08:00
|
|
|
let getUrl = utils.checksumAPI(Helpers.url + Helpers.createUrl, sharedSecret);
|
2017-09-07 03:43:09 +08:00
|
|
|
getUrl = Helpers.createUrl + '&checksum=' + getUrl
|
2017-11-07 02:46:12 +08:00
|
|
|
|
2017-09-07 03:43:09 +08:00
|
|
|
request(Helpers.url)
|
2017-11-07 02:46:12 +08:00
|
|
|
.get(getUrl)
|
|
|
|
.expect('Content-Type', /text\/xml/)
|
|
|
|
.expect(200, (res) => {
|
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
if (hooks && hooks.some( hook => { return !hook.permanent }) ) {
|
|
|
|
done();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
done(new Error ("hook was not created"));
|
|
|
|
}
|
|
|
|
})
|
2017-09-07 03:43:09 +08:00
|
|
|
})
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('GET /hooks/destroy', () => {
|
2017-11-07 02:46:12 +08:00
|
|
|
before( (done) => {
|
|
|
|
Hook.addSubscription(Helpers.callback,null,false,() => { done(); });
|
2017-09-07 03:43:09 +08:00
|
|
|
});
|
|
|
|
it('should destroy a hook', (done) => {
|
2017-11-07 02:46:12 +08:00
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
const hook = hooks[hooks.length-1].id;
|
2018-07-26 09:05:51 +08:00
|
|
|
let getUrl = utils.checksumAPI(Helpers.url + Helpers.destroyUrl(hook), sharedSecret);
|
2017-11-07 02:46:12 +08:00
|
|
|
getUrl = Helpers.destroyUrl(hook) + '&checksum=' + getUrl
|
|
|
|
|
2017-09-07 03:43:09 +08:00
|
|
|
request(Helpers.url)
|
2017-11-07 02:46:12 +08:00
|
|
|
.get(getUrl)
|
|
|
|
.expect('Content-Type', /text\/xml/)
|
|
|
|
.expect(200, (res) => {
|
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
if(hooks && hooks.every( hook => { return hook.callbackURL != Helpers.callback }))
|
|
|
|
done();
|
|
|
|
})
|
2017-09-07 03:43:09 +08:00
|
|
|
})
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('GET /hooks/destroy permanent hook', () => {
|
|
|
|
it('should not destroy the permanent hook', (done) => {
|
2018-07-26 09:05:51 +08:00
|
|
|
let getUrl = utils.checksumAPI(Helpers.url + Helpers.destroyPermanent, sharedSecret);
|
2017-09-07 03:43:09 +08:00
|
|
|
getUrl = Helpers.destroyPermanent + '&checksum=' + getUrl
|
|
|
|
request(Helpers.url)
|
|
|
|
.get(getUrl)
|
|
|
|
.expect('Content-Type', /text\/xml/)
|
|
|
|
.expect(200, (res) => {
|
|
|
|
const hooks = Hook.allGlobalSync();
|
2019-03-30 04:52:58 +08:00
|
|
|
if (hooks && hooks[0].callbackURL == globalHooks.permanentURLs[0].url) {
|
2017-09-07 03:43:09 +08:00
|
|
|
done();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
done(new Error("should not delete permanent"));
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('GET /hooks/create getRaw hook', () => {
|
2017-11-07 02:46:12 +08:00
|
|
|
after( (done) => {
|
2017-09-07 03:43:09 +08:00
|
|
|
const hooks = Hook.allGlobalSync();
|
2017-11-07 02:46:12 +08:00
|
|
|
Hook.removeSubscription(hooks[hooks.length-1].id, () => { done(); });
|
2017-09-07 03:43:09 +08:00
|
|
|
});
|
|
|
|
it('should create a hook with getRaw=true', (done) => {
|
2018-07-26 09:05:51 +08:00
|
|
|
let getUrl = utils.checksumAPI(Helpers.url + Helpers.createUrl + Helpers.createRaw, sharedSecret);
|
2017-09-07 03:43:09 +08:00
|
|
|
getUrl = Helpers.createUrl + '&checksum=' + getUrl + Helpers.createRaw
|
2017-11-07 02:46:12 +08:00
|
|
|
|
2017-09-07 03:43:09 +08:00
|
|
|
request(Helpers.url)
|
2017-11-07 02:46:12 +08:00
|
|
|
.get(getUrl)
|
|
|
|
.expect('Content-Type', /text\/xml/)
|
|
|
|
.expect(200, (res) => {
|
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
if (hooks && hooks.some( (hook) => { return hook.getRaw })) {
|
|
|
|
done();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
done(new Error("getRaw hook was not created"))
|
|
|
|
}
|
|
|
|
})
|
2017-09-07 03:43:09 +08:00
|
|
|
})
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('Hook queues', () => {
|
|
|
|
before( () => {
|
2019-03-30 04:52:58 +08:00
|
|
|
Application.redisPubSubClient().psubscribe("test-channel");
|
2017-11-07 02:46:12 +08:00
|
|
|
Hook.addSubscription(Helpers.callback,null,false, (err,reply) => {
|
2017-09-07 03:43:09 +08:00
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
const hook = hooks[0];
|
|
|
|
const hook2 = hooks[hooks.length -1];
|
|
|
|
sinon.stub(hook, '_processQueue');
|
|
|
|
sinon.stub(hook2, '_processQueue');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
after( () => {
|
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
const hook = hooks[0];
|
|
|
|
const hook2 = hooks[hooks.length -1];
|
2019-03-30 04:52:58 +08:00
|
|
|
|
2017-09-07 03:43:09 +08:00
|
|
|
hook._processQueue.restore();
|
|
|
|
hook2._processQueue.restore();
|
|
|
|
Hook.removeSubscription(hooks[hooks.length-1].id);
|
2019-03-30 04:52:58 +08:00
|
|
|
Application.redisPubSubClient().unsubscribe("test-channel");
|
2017-09-07 03:43:09 +08:00
|
|
|
});
|
|
|
|
it('should have different queues for each hook', (done) => {
|
2019-03-30 04:52:58 +08:00
|
|
|
Application.redisClient().publish("test-channel", JSON.stringify(Helpers.rawMessage));
|
2017-11-07 02:46:12 +08:00
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
|
|
|
|
if (hooks && hooks[0].queue != hooks[hooks.length-1].queue) {
|
|
|
|
done();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
done(new Error("hooks using same queue"))
|
|
|
|
}
|
2017-09-07 03:43:09 +08:00
|
|
|
})
|
|
|
|
});
|
|
|
|
// reduce queue size, fill queue with requests, try to add another one, if queue does not exceed, OK
|
|
|
|
describe('Hook queues', () => {
|
2017-11-07 02:46:12 +08:00
|
|
|
before( () => {
|
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
const hook = hooks[0];
|
|
|
|
sinon.stub(hook, '_processQueue');
|
|
|
|
});
|
|
|
|
after( () => {
|
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
const hook = hooks[0];
|
|
|
|
hook._processQueue.restore();
|
|
|
|
Helpers.flushredis(hook);
|
|
|
|
})
|
2017-09-07 03:43:09 +08:00
|
|
|
it('should limit queue size to defined in config', (done) => {
|
|
|
|
let hook = Hook.allGlobalSync();
|
|
|
|
hook = hook[0];
|
2017-11-07 02:46:12 +08:00
|
|
|
for(i=0;i<=9;i++) { hook.enqueue("message" + i); }
|
2017-09-07 03:43:09 +08:00
|
|
|
|
2019-03-30 04:52:58 +08:00
|
|
|
if (hook && hook.queue.length <= globalHooks.queueSize) {
|
2017-09-07 03:43:09 +08:00
|
|
|
done();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
done(new Error("hooks exceeded max queue size"))
|
|
|
|
}
|
|
|
|
})
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('/POST mapped message', () => {
|
|
|
|
before( () => {
|
2019-03-30 04:52:58 +08:00
|
|
|
Application.redisPubSubClient().psubscribe("test-channel");
|
2017-09-07 03:43:09 +08:00
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
const hook = hooks[0];
|
|
|
|
hook.queue = [];
|
2017-11-07 02:46:12 +08:00
|
|
|
Helpers.flushredis(hook);
|
2017-09-07 03:43:09 +08:00
|
|
|
});
|
2017-11-07 02:46:12 +08:00
|
|
|
after( () => {
|
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
const hook = hooks[0];
|
|
|
|
Helpers.flushredis(hook);
|
2019-03-30 04:52:58 +08:00
|
|
|
Application.redisPubSubClient().unsubscribe("test-channel");
|
2017-11-07 02:46:12 +08:00
|
|
|
})
|
2017-09-07 03:43:09 +08:00
|
|
|
it('should post mapped message ', (done) => {
|
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
const hook = hooks[0];
|
2017-11-07 02:46:12 +08:00
|
|
|
|
2019-03-30 04:52:58 +08:00
|
|
|
const getpost = nock(globalHooks.permanentURLs[0].url)
|
2017-11-07 02:46:12 +08:00
|
|
|
.filteringRequestBody( (body) => {
|
|
|
|
let parsed = JSON.parse(body)
|
|
|
|
return parsed[0].data.id ? "mapped" : "not mapped";
|
|
|
|
})
|
|
|
|
.post("/", "mapped")
|
|
|
|
.reply(200, (res) => {
|
|
|
|
done();
|
|
|
|
});
|
2019-03-30 04:52:58 +08:00
|
|
|
Application.redisClient().publish("test-channel", JSON.stringify(Helpers.rawMessage));
|
2017-09-07 03:43:09 +08:00
|
|
|
})
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('/POST raw message', () => {
|
|
|
|
before( () => {
|
2019-03-30 04:52:58 +08:00
|
|
|
Application.redisPubSubClient().psubscribe("test-channel");
|
2017-09-07 03:43:09 +08:00
|
|
|
Hook.addSubscription(Helpers.callback,null,true, (err,hook) => {
|
2017-11-07 02:46:12 +08:00
|
|
|
Helpers.flushredis(hook);
|
2017-09-07 03:43:09 +08:00
|
|
|
})
|
|
|
|
});
|
|
|
|
after( () => {
|
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
Hook.removeSubscription(hooks[hooks.length-1].id);
|
2017-11-07 02:46:12 +08:00
|
|
|
Helpers.flushredis(hooks[hooks.length-1]);
|
2019-03-30 04:52:58 +08:00
|
|
|
Application.redisPubSubClient().unsubscribe("test-channel");
|
2017-09-07 03:43:09 +08:00
|
|
|
});
|
|
|
|
it('should post raw message ', (done) => {
|
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
const hook = hooks[0];
|
|
|
|
|
|
|
|
const getpost = nock(Helpers.callback)
|
2017-11-07 02:46:12 +08:00
|
|
|
.filteringRequestBody( (body) => {
|
|
|
|
if (body.indexOf("PresenterAssignedEvtMsg")) {
|
|
|
|
return "raw message";
|
|
|
|
}
|
|
|
|
else { return "not raw"; }
|
|
|
|
})
|
|
|
|
.post("/", "raw message")
|
|
|
|
.reply(200, () => {
|
|
|
|
done();
|
|
|
|
});
|
2019-03-30 04:52:58 +08:00
|
|
|
const permanent = nock(globalHooks.permanentURLs[0].url)
|
2017-11-07 02:46:12 +08:00
|
|
|
.post("/")
|
|
|
|
.reply(200)
|
2019-03-30 04:52:58 +08:00
|
|
|
Application.redisClient().publish("test-channel", JSON.stringify(Helpers.rawMessage));
|
2017-09-07 03:43:09 +08:00
|
|
|
})
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('/POST multi message', () => {
|
|
|
|
before( () =>{
|
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
const hook = hooks[0];
|
2017-11-07 02:46:12 +08:00
|
|
|
Helpers.flushredis(hook);
|
|
|
|
hook.queue = ["multiMessage1"];
|
2017-09-07 03:43:09 +08:00
|
|
|
});
|
|
|
|
it('should post multi message ', (done) => {
|
|
|
|
const hooks = Hook.allGlobalSync();
|
|
|
|
const hook = hooks[0];
|
2017-11-07 02:46:12 +08:00
|
|
|
hook.enqueue("multiMessage2")
|
2019-03-30 04:52:58 +08:00
|
|
|
const getpost = nock(globalHooks.permanentURLs[0].url)
|
2017-11-07 02:46:12 +08:00
|
|
|
.filteringPath( (path) => {
|
|
|
|
return path.split('?')[0];
|
|
|
|
})
|
|
|
|
.filteringRequestBody( (body) => {
|
|
|
|
if (body.indexOf("multiMessage1") != -1 && body.indexOf("multiMessage2") != -1) {
|
|
|
|
return "multiMess"
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return "not multi"
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.post("/", "multiMess")
|
|
|
|
.reply(200, (res) => {
|
|
|
|
done();
|
|
|
|
});
|
2017-09-07 03:43:09 +08:00
|
|
|
})
|
|
|
|
});
|
|
|
|
});
|