diff --git a/core/server/lib/mobiledoc/cards/gallery.js b/core/server/lib/mobiledoc/cards/gallery.js index 9252a85bb6..0a2884c29a 100644 --- a/core/server/lib/mobiledoc/cards/gallery.js +++ b/core/server/lib/mobiledoc/cards/gallery.js @@ -25,7 +25,20 @@ module.exports = { // let version = opts.options.version; let dom = opts.env.dom; - if (!payload.images || payload.images.length === 0) { + let isValidImage = (image) => { + return image.fileName + && image.src + && image.width + && image.height; + }; + + let validImages = []; + + if (payload.images && payload.images.length) { + validImages = payload.images.filter(isValidImage); + } + + if (validImages.length === 0) { return ''; } @@ -56,7 +69,7 @@ module.exports = { return rows; }; - let rows = buildStructure(payload.images); + let rows = buildStructure(validImages); rows.forEach((row) => { let rowDiv = dom.createElement('div'); diff --git a/core/test/unit/lib/mobiledoc/cards/gallery_spec.js b/core/test/unit/lib/mobiledoc/cards/gallery_spec.js index 7dd929fb46..4a42ae5659 100644 --- a/core/test/unit/lib/mobiledoc/cards/gallery_spec.js +++ b/core/test/unit/lib/mobiledoc/cards/gallery_spec.js @@ -90,4 +90,52 @@ describe('Gallery card', function () { serializer.serialize(card.render(opts)).should.eql(''); }); + + it('renders nothing with no valid images', function () { + let opts = { + env: { + dom: new SimpleDom.Document() + }, + payload: { + images: [{src: 'undefined'}], + caption: 'Test caption' + } + }; + + serializer.serialize(card.render(opts)).should.eql(''); + }); + + it('skips invalid images', function () { + let opts = { + env: { + dom: new SimpleDom.Document() + }, + payload: { + images: [ + { + row: 0, + fileName: 'NatGeo01.jpg', + src: '/content/images/2018/08/NatGeo01-9.jpg', + width: 3200, + height: 1600 + }, + { + row: 0, + fileName: 'NatGeo02.jpg', + src: '/content/images/2018/08/NatGeo02-10.jpg', + }, + { + row: 0, + fileName: 'NatGeo03.jpg', + src: '/content/images/2018/08/NatGeo03-6.jpg', + width: 3200, + height: 1600 + } + ], + caption: 'Test caption' + } + }; + + serializer.serialize(card.render(opts)).should.eql(''); + }); });