Ghost/core/test/unit/xmlrpc_spec.js
Hannah Wolfe f489d7df72 xmlrpc + slack init() -> listen() & fixup tests
no issue

- changes xmlrcp & slack `init` function to be `listen`
- update the code to use `listen` instead of `init`
- changes the tests to make sure that event listeners are not wired up
- adds 100% test coverage

Since we added slack event listeners, the xmlrpc event tests have been throwing an error:
 > Unhandled rejection Error
See: http://puu.sh/phvjZ.png

This is because both xmlrpc & slack are listening to `post.published` events.
xmlrpc didn't require any extra stubbing, but the slack listener did
By turning the listeners off after the tests, we reset the environment to not impact the next event test

We probably need to do more work like this to improve the systems around event handling and
make them more robust
2016-06-09 15:38:19 +01:00

134 lines
4.7 KiB
JavaScript

/*globals describe, beforeEach, afterEach, it*/
var _ = require('lodash'),
nock = require('nock'),
should = require('should'),
sinon = require('sinon'),
rewire = require('rewire'),
testUtils = require('../utils'),
configUtils = require('../utils/configUtils'),
xmlrpc = rewire('../../server/data/xml/xmlrpc'),
events = require('../../server/events'),
// storing current environment
currentEnv = process.env.NODE_ENV;
// To stop jshint complaining
should.equal(true, true);
describe('XMLRPC', function () {
var sandbox, eventStub;
beforeEach(function () {
sandbox = sinon.sandbox.create();
eventStub = sandbox.stub(events, 'on');
// give environment a value that will ping
process.env.NODE_ENV = 'production';
});
afterEach(function () {
sandbox.restore();
configUtils.restore();
nock.cleanAll();
// reset the environment
process.env.NODE_ENV = currentEnv;
});
it('listen() should initialise event correctly', function () {
xmlrpc.listen();
eventStub.calledOnce.should.be.true();
eventStub.calledWith('post.published', xmlrpc.__get__('listener')).should.be.true();
});
it('listener() calls ping() with toJSONified model', function () {
var testPost = _.clone(testUtils.DataGenerator.Content.posts[2]),
testModel = {toJSON: function () {return testPost; }},
pingStub = sandbox.stub(),
resetXmlRpc = xmlrpc.__set__('ping', pingStub),
listener = xmlrpc.__get__('listener');
listener(testModel);
pingStub.calledOnce.should.be.true();
pingStub.calledWith(testPost).should.be.true();
// Reset xmlrpc ping method
resetXmlRpc();
});
describe('ping()', function () {
var ping = xmlrpc.__get__('ping');
it('with a post should execute two pings', function () {
var ping1 = nock('http://blogsearch.google.com').post('/ping/RPC2').reply(200),
ping2 = nock('http://rpc.pingomatic.com').post('/').reply(200),
testPost = _.clone(testUtils.DataGenerator.Content.posts[2]);
ping(testPost);
ping1.isDone().should.be.true();
ping2.isDone().should.be.true();
});
it('with default post should not execute pings', function () {
var ping1 = nock('http://blogsearch.google.com').post('/ping/RPC2').reply(200),
ping2 = nock('http://rpc.pingomatic.com').post('/').reply(200),
testPost = _.clone(testUtils.DataGenerator.Content.posts[2]);
testPost.slug = 'welcome-to-ghost';
ping(testPost);
ping1.isDone().should.be.false();
ping2.isDone().should.be.false();
});
it('with a page should not execute pings', function () {
var ping1 = nock('http://blogsearch.google.com').post('/ping/RPC2').reply(200),
ping2 = nock('http://rpc.pingomatic.com').post('/').reply(200),
testPage = _.clone(testUtils.DataGenerator.Content.posts[5]);
ping(testPage);
ping1.isDone().should.be.false();
ping2.isDone().should.be.false();
});
it('when privacy.useRpcPing is false should not execute pings', function () {
var ping1 = nock('http://blogsearch.google.com').post('/ping/RPC2').reply(200),
ping2 = nock('http://rpc.pingomatic.com').post('/').reply(200),
testPost = _.clone(testUtils.DataGenerator.Content.posts[2]);
configUtils.set({privacy: {useRpcPing: false}});
ping(testPost);
ping1.isDone().should.be.false();
ping2.isDone().should.be.false();
});
it('captures errors from requests', function (done) {
var ping1 = nock('http://blogsearch.google.com').post('/ping/RPC2').reply(200),
ping2 = nock('http://rpc.pingomatic.com').post('/').replyWithError('ping site is down'),
testPost = _.clone(testUtils.DataGenerator.Content.posts[2]),
errorMock, resetXmlRpc;
errorMock = {
logError: function logError(error) {
should.exist(error);
error.message.should.eql('ping site is down');
// Reset xmlrpc handleError method and exit test
resetXmlRpc();
done();
}
};
resetXmlRpc = xmlrpc.__set__('errors', errorMock);
ping(testPost);
ping1.isDone().should.be.true();
ping2.isDone().should.be.true();
});
});
});