Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions ghost/core/core/server/web/gift-preview/controller.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const logging = require('@tryghost/logging');
const errors = require('@tryghost/errors');
const {generateGiftPreviewImage} = require('./image');

function getCadenceLabel(cadence, duration) {
Expand Down Expand Up @@ -32,6 +33,10 @@ async function giftPreview(req, res) {

try {
gift = await giftService.getByToken(token);

if (!gift) {
throw new errors.NotFoundError({message: `Gift not found for token`});
}
} catch (err) {
logging.warn(`Gift preview: failed to load required gift data, redirecting to homepage`, err);

Expand Down
12 changes: 12 additions & 0 deletions ghost/core/test/unit/server/web/gift-preview/controller.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,18 @@ describe('Gift Preview Controller', function () {
sinon.assert.calledWith(res.redirect, 302, 'https://example.com/');
});

it('redirects to homepage when gift token is not found (null)', async function () {
sinon.stub(labs, 'isSet').withArgs('giftSubscriptions').returns(true);
giftServiceWrapper.service = {
getByToken: sinon.stub().resolves(null)
};

await controller.giftPreview(req, res);

sinon.assert.calledOnce(res.redirect);
sinon.assert.calledWith(res.redirect, 302, 'https://example.com/');
});

it('returns HTML with OG tags for a valid gift', async function () {
sinon.stub(labs, 'isSet').withArgs('giftSubscriptions').returns(true);
giftServiceWrapper.service = {
Expand Down
Loading