From 6a5ea251a526bdbc61234a51f72db627fc775c65 Mon Sep 17 00:00:00 2001 From: Sam Lord Date: Tue, 14 Dec 2021 12:23:17 +0000 Subject: [PATCH] Fix usage of member function for errors no issue --- .../mw-error-handler/lib/mw-error-handler.js | 9 ++- .../test/error-handler.test.js | 75 ++++++++++++++++++- 2 files changed, 76 insertions(+), 8 deletions(-) diff --git a/ghost/mw-error-handler/lib/mw-error-handler.js b/ghost/mw-error-handler/lib/mw-error-handler.js index 62ff08dade..bfd2780219 100644 --- a/ghost/mw-error-handler/lib/mw-error-handler.js +++ b/ghost/mw-error-handler/lib/mw-error-handler.js @@ -1,6 +1,7 @@ const _ = require('lodash'); const debug = require('@tryghost/debug')('error-handler'); const errors = require('@tryghost/errors'); +const {prepareStackForUser} = require('@tryghost/errors').utils; const tpl = require('@tryghost/tpl'); const messages = { @@ -77,7 +78,7 @@ module.exports.prepareError = (err, req, res, next) => { // alternative for res.status(); res.statusCode = err.statusCode; - err = err.prepareErrorForUser(); + prepareStackForUser(err); // never cache errors res.set({ @@ -117,14 +118,14 @@ const jsonErrorRendererV2 = (err, req, res, next) => { // eslint-disable-line no }); }; -const prepareUserMessage = (err, res) => { +const prepareUserMessage = (err, req) => { const userError = { message: err.message, context: err.context }; - const docName = _.get(res, 'frameOptions.docName'); - const method = _.get(res, 'frameOptions.method'); + const docName = _.get(req, 'frameOptions.docName'); + const method = _.get(req, 'frameOptions.method'); if (docName && method) { let action; diff --git a/ghost/mw-error-handler/test/error-handler.test.js b/ghost/mw-error-handler/test/error-handler.test.js index 85d69d1e08..9f630b1891 100644 --- a/ghost/mw-error-handler/test/error-handler.test.js +++ b/ghost/mw-error-handler/test/error-handler.test.js @@ -1,10 +1,77 @@ // Switch these lines once there are useful utils // const testUtils = require('./utils'); require('./utils'); +const {InternalServerError} = require('@tryghost/errors'); +const {prepareError, handleJSONResponse, handleJSONResponseV2, handleHTMLResponse} = require('../lib/mw-error-handler'); -describe('Hello world', function () { - it('Runs a test', function () { - // TODO: Write me! - 'hello'.should.eql('hello'); +describe('Prepare Error', function () { + it('Correctly prepares a normal error', function (done) { + prepareError(new Error('test!'), {}, { + set: () => {} + }, (err) => { + err.statusCode.should.eql(500); + err.name.should.eql('InternalServerError'); + err.stack.should.startWith('Error: test!'); + done(); + }); + }); +}); + +describe('Error renderers', function () { + it('Renders JSON', function (done) { + const errorRenderer = handleJSONResponse({ + errorHandler: () => {} + })[2]; + + errorRenderer(new Error('test!'), {}, { + json: (data) => { + data.errors.length.should.eql(1); + data.errors[0].message.should.eql('test!'); + done(); + } + }, () => {}); + }); + + it('Renders JSON for v2', function (done) { + const errorRenderer = handleJSONResponseV2({ + errorHandler: () => {} + })[2]; + + errorRenderer(new Error('test!'), {}, { + json: (data) => { + data.errors.length.should.eql(1); + data.errors[0].message.should.eql('test!'); + done(); + } + }, () => {}); + }); + + it('Uses templates when required', function (done) { + const errorRenderer = handleJSONResponseV2({ + errorHandler: () => {} + })[2]; + + errorRenderer(new InternalServerError({ + message: 'test!' + }), { + frameOptions: { + docName: 'blog', + method: 'browse' + } + }, { + json: (data) => { + data.errors.length.should.eql(1); + data.errors[0].message.should.eql('Internal server error, cannot list blog.'); + done(); + } + }, () => {}); + }); + + it('Exports the HTML renderer', function () { + const renderer = handleHTMLResponse({ + errorHandler: () => {} + }); + + renderer.length.should.eql(2); }); });