ac-koa-hipchat
Version:
A Koa.js library for building Atlassian Connect HipChat add-ons
173 lines (157 loc) • 5.32 kB
JavaScript
var assert = require('assert');
var supertest = require('supertest');
var fixtures = require('./fixtures');
var check = require('check-types');
var verify = check.verify;
var rsvp = require('rsvp');
var Promise = rsvp.Promise;
var _ = require('lodash');
var ack = require('ac-koa');
var MemoryStore = require('ac-node').MemoryStore;
var MockHttpClient = require('ac-node-hipchat/test/mock-http-client');
var tenant = fixtures.load('tenant.json');
describe('ack hipchat add-on from builder', function () {
var pkg = fixtures.load('package.json');
var store = MemoryStore();
var scope = 'hipchat';
var tenantStore;
var server;
var client;
var app;
beforeEach(function () {
app = ack(pkg, {
store: store,
httpClient: MockHttpClient(10)
});
tenantStore = store.narrow(scope).narrow('tenant');
});
afterEach(function (done) {
store.clear().then(function () {
server.close(done);
});
});
it('should mount and fire events for builder webhooks with no url', function (done) {
var addon = app.addon(scope)
.hipchat()
.scopes('send_notification')
.allowGlobal(true);
var roomMessage = new Promise(function (resolve) {
addon.webhook('room_message', /^\/test(?:\s+(\w+)\s+(\w+)|$)?/i, function *() {
resolve(this);
});
});
server = app.listen(function () {
client = supertest.agent(server);
tenantStore.set(tenant.id, tenant).then(function () {
var postBody = {
event: 'room_message',
oauth_client_id: tenant.id,
webhook_id: 1,
item: {
room: {
id: 1
},
message: {
id: 2,
from: {
name: 'user'
},
message: '/TEST arg1 arg2 arg3'
}
}
};
client
.post('/hipchat/addon/webhook?name=' + addon.descriptor.capabilities.webhook[0].name)
.send(postBody)
.expect(204, function (err) {
if (err) return done(err);
roomMessage.then(function (eventContext) {
var body = eventContext.request.body;
assert.deepEqual(body, postBody);
assert.ok(eventContext);
assert.deepEqual(eventContext.tenant, tenant);
assert.ok(eventContext.tenantStore);
assert.ok(eventContext.tenantClient);
assert.equal(eventContext.webhookId, body.webhook_id);
assert.ok(eventContext.room);
assert.ok(eventContext.sender);
assert.ok(eventContext.message);
assert.equal(eventContext.room.id, 1);
assert.equal(eventContext.sender.name, 'user');
assert.equal(eventContext.message.id, 2);
assert.equal(eventContext.content, '/TEST arg1 arg2 arg3');
assert.ok(eventContext.match);
assert.equal(eventContext.match.length, 3);
assert.equal(eventContext.match[1], 'arg1');
assert.equal(eventContext.match[2], 'arg2');
assert.equal(eventContext.match[3], undefined);
done();
}).catch(done);
});
});
});
});
it('should mount and idividually fire room_message events', function (done) {
var addon = app.addon(scope)
.hipchat()
.scopes('send_notification')
.allowGlobal(true);
var roomMessage1 = new Promise(function (resolve) {
var counter = 0;
addon.webhook('room_message', /^\/test1(?:\s|$)/i, function *() {
counter += 1;
if (counter > 1) throw new Error('Too many callbacks for /test1');
resolve(this);
});
});
var roomMessage2 = new Promise(function (resolve) {
var counter = 0;
addon.webhook('room_message', /^\/test2(?:\s|$)/i, function *() {
counter += 1;
if (counter > 1) throw new Error('Too many callbacks for /test2');
resolve(this);
});
});
server = app.listen(function () {
client = supertest.agent(server);
tenantStore.set(tenant.id, tenant).then(function () {
function post(msg, index, promise) {
return new Promise(function (resolve, reject) {
var postBody = {
event: 'room_message',
oauth_client_id: tenant.id,
webhook_id: 1,
item: {
room: {
id: 1
},
message: {
id: 2,
from: {
name: 'user'
},
message: msg
}
}
};
client
.post('/hipchat/addon/webhook?name=' + addon.descriptor.capabilities.webhook[index].name)
.send(postBody)
.expect(204, function (err) {
if (err) return reject(err);
promise.then(function (eventContext) {
resolve();
}).catch(reject);
});
});
}
rsvp.all([
post('/test1', 0, roomMessage1),
post('/test2', 1, roomMessage2)
]).then(function () {
done();
}).catch(done);
});
});
});
});