diff --git a/ghost/admin/app/models/setting.js b/ghost/admin/app/models/setting.js index 804425a3d0..b4e2230c8b 100644 --- a/ghost/admin/app/models/setting.js +++ b/ghost/admin/app/models/setting.js @@ -25,5 +25,5 @@ export default Model.extend(ValidationEngine, { password: attr('string'), slack: attr('slack-settings'), amp: attr('boolean'), - unsplash: attr('unsplash-settings') + unsplash: attr('unsplash-settings', {defaultValue: {isActive: true}}) }); diff --git a/ghost/admin/app/transforms/unsplash-settings.js b/ghost/admin/app/transforms/unsplash-settings.js index 7bcd9f6306..88ac473a0b 100644 --- a/ghost/admin/app/transforms/unsplash-settings.js +++ b/ghost/admin/app/transforms/unsplash-settings.js @@ -2,23 +2,27 @@ import Transform from 'ember-data/transform'; import UnsplashObject from 'ghost-admin/models/unsplash-integration'; +const DEFAULT_SETTINGS = { + isActive: true +}; + export default Transform.extend({ deserialize(serialized) { if (serialized) { let settingsObject; try { - settingsObject = JSON.parse(serialized) || {}; + settingsObject = JSON.parse(serialized) || DEFAULT_SETTINGS; } catch (e) { - settingsObject = {}; + settingsObject = DEFAULT_SETTINGS; } return UnsplashObject.create(settingsObject); } - return null; + return DEFAULT_SETTINGS; }, serialize(deserialized) { - return deserialized ? JSON.stringify(deserialized) : {}; + return deserialized ? JSON.stringify(deserialized) : JSON.stringify(DEFAULT_SETTINGS); } }); diff --git a/ghost/admin/tests/acceptance/editor-test.js b/ghost/admin/tests/acceptance/editor-test.js index c803f98ffd..53ab5e02d5 100644 --- a/ghost/admin/tests/acceptance/editor-test.js +++ b/ghost/admin/tests/acceptance/editor-test.js @@ -763,5 +763,16 @@ describe('Acceptance: Editor', function() { 'facebook title not present after closing subview' ).to.equal(0); }); + + it('has unsplash icon when server doesn\'t return unsplash settings key', async function () { + server.createList('post', 1); + + await visit('/editor/1'); + + expect( + find('.editor-toolbar .fa-camera'), + 'unsplash toolbar button' + ).to.exist; + }); }); }); diff --git a/ghost/admin/tests/unit/transforms/unsplash-settings-test.js b/ghost/admin/tests/unit/transforms/unsplash-settings-test.js new file mode 100644 index 0000000000..b5fd628d8d --- /dev/null +++ b/ghost/admin/tests/unit/transforms/unsplash-settings-test.js @@ -0,0 +1,46 @@ +import {describe, it} from 'mocha'; +import {expect} from 'chai'; +import {setupTest} from 'ember-mocha'; + +describe('Unit: Transform: unsplash-settings', function () { + setupTest('transform:unsplash-settings', { + // Specify the other units that are required for this test. + // needs: ['transform:foo'] + }); + + it('deserializes to default value when null', function () { + let serialized = null; + let result = this.subject().deserialize(serialized); + expect(result.isActive).to.be.true; + }); + + it('deserializes to default value when blank string', function () { + let serialized = ''; + let result = this.subject().deserialize(serialized); + expect(result.isActive).to.be.true; + }); + + it('deserializes to default value when invalid JSON', function () { + let serialized = 'not JSON'; + let result = this.subject().deserialize(serialized); + expect(result.isActive).to.be.true; + }); + + it('deserializes valid JSON object', function () { + let serialized = '{"isActive":false}'; + let result = this.subject().deserialize(serialized); + expect(result.isActive).to.be.false; + }); + + it('serializes to JSON string', function () { + let deserialized = {isActive: false}; + let result = this.subject().serialize(deserialized); + expect(result).to.equal('{"isActive":false}'); + }); + + it('serializes to default value when blank', function () { + let deserialized = ''; + let result = this.subject().serialize(deserialized); + expect(result).to.equal('{"isActive":true}'); + }); +});