mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-20 01:03:23 +03:00
1882278b5b
- 🛠 add bunyan and prettyjson, remove morgan - ✨ add logging module - GhostLogger class that handles setup of bunyan - PrettyStream for stdout - ✨ config for logging - @TODO: testing level fatal? - ✨ log each request via GhostLogger (express middleware) - @TODO: add errors to output - 🔥 remove errors.updateActiveTheme - we can read the value from config - 🔥 remove 15 helper functions in core/server/errors/index.js - all these functions get replaced by modules: 1. logging 2. error middleware handling for html/json 3. error creation (which will be part of PR #7477) - ✨ add express error handler for html/json - one true error handler for express responses - contains still some TODO's, but they are not high priority for first implementation/integration - this middleware only takes responsibility of either rendering html responses or return json error responses - 🎨 use new express error handler in middleware/index - 404 and 500 handling - 🎨 return error instead of error message in permissions/index.js - the rule for error handling should be: if you call a unit, this unit should return a custom Ghost error - 🎨 wrap serve static module - rule: if you call a module/unit, you should always wrap this error - it's always the same rule - so the caller never has to worry about what comes back - it's always a clear error instance - in this case: we return our notfounderror if serve static does not find the resource - this avoid having checks everywhere - 🎨 replace usages of errors/index.js functions and adapt tests - use logging.error, logging.warn - make tests green - remove some usages of logging and throwing api errors -> because when a request is involved, logging happens automatically - 🐛 return errorDetails to Ghost-Admin - errorDetails is used for Theme error handling - 🎨 use 500er error for theme is missing error in theme-handler - 🎨 extend file rotation to 1w
133 lines
4.7 KiB
JavaScript
133 lines
4.7 KiB
JavaScript
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]),
|
|
loggingMock, resetXmlRpc;
|
|
|
|
loggingMock = {
|
|
error: function onError(err) {
|
|
should.exist(err);
|
|
err.message.should.eql('ping site is down');
|
|
|
|
// Reset xmlrpc handleError method and exit test
|
|
resetXmlRpc();
|
|
done();
|
|
}
|
|
};
|
|
|
|
resetXmlRpc = xmlrpc.__set__('logging', loggingMock);
|
|
|
|
ping(testPost);
|
|
|
|
ping1.isDone().should.be.true();
|
|
ping2.isDone().should.be.true();
|
|
});
|
|
});
|
|
});
|