diff --git a/core/frontend/services/themes/middleware.js b/core/frontend/services/themes/middleware.js index 1ffca7f8f8..a88c154dbf 100644 --- a/core/frontend/services/themes/middleware.js +++ b/core/frontend/services/themes/middleware.js @@ -4,6 +4,7 @@ const urlUtils = require('../../../server/lib/url-utils'); const config = require('../../../server/config'); const common = require('../../../server/lib/common'); const settingsCache = require('../../../server/services/settings/cache'); +const labs = require('../../../server/services/labs'); const activeTheme = require('./active'); // ### Ensure Active Theme @@ -75,7 +76,8 @@ function updateGlobalTemplateOptions(req, res, next) { // @TODO: bind this once and then update based on events? // @TODO: decouple theme layer from settings cache using the Content API const siteData = settingsCache.getPublic(); - const labsData = _.cloneDeep(settingsCache.get('labs')); + const labsData = labs.getAll(); + const themeData = { posts_per_page: activeTheme.get().config('posts_per_page'), image_sizes: activeTheme.get().config('image_sizes') diff --git a/core/server/services/labs.js b/core/server/services/labs.js index 2ec3a6de85..bb35ae66c2 100644 --- a/core/server/services/labs.js +++ b/core/server/services/labs.js @@ -3,15 +3,24 @@ const _ = require('lodash'); const Promise = require('bluebird'); const SafeString = require('../../frontend/services/themes/engine').SafeString; const common = require('../lib/common'); +const deprecatedFeatures = ['subscribers', 'publicAPI']; + let labs = module.exports = {}; -labs.isSet = function isSet(flag) { - var labsConfig = settingsCache.get('labs'); - return labsConfig && labsConfig[flag] && labsConfig[flag] === true; +labs.getAll = () => { + let labs = _.cloneDeep(settingsCache.get('labs')) || {}; + // Remove old labs flags that should always be false now + deprecatedFeatures.forEach((feature) => { + delete labs[feature]; + }); + + return labs; }; -labs.getAll = () => { - return settingsCache.get('labs'); +labs.isSet = function isSet(flag) { + var labsConfig = labs.getAll(); + + return !!(labsConfig && labsConfig[flag] && labsConfig[flag] === true); }; labs.enabledHelper = function enabledHelper(options, callback) { diff --git a/core/test/unit/services/labs_spec.js b/core/test/unit/services/labs_spec.js new file mode 100644 index 0000000000..5b91e593d1 --- /dev/null +++ b/core/test/unit/services/labs_spec.js @@ -0,0 +1,52 @@ +const should = require('should'); +const sinon = require('sinon'); +const settingsCache = require('../../../server/services/settings/cache'); + +const labs = require('../../../server/services/labs'); + +describe('Labs Service', function () { + let labsCacheStub; + + beforeEach(function () { + labsCacheStub = sinon.stub(settingsCache, 'get').withArgs('labs'); + }); + + afterEach(function () { + sinon.restore(); + }); + + it('can getAll, even if empty', function () { + labs.getAll().should.eql({}); + }); + + it('can getAll from cache', function () { + labsCacheStub.returns({members: true, foo: 'bar'}); + + labs.getAll().should.eql({members: true, foo: 'bar'}); + }); + + it('can getAll from cache, ignoring deprecated', function () { + labsCacheStub.returns({members: true, foo: 'bar', subscribers: false, publicAPI: true}); + + labs.getAll().should.eql({members: true, foo: 'bar'}); + }); + + it('isSet returns true string flag', function () { + labsCacheStub.returns({foo: 'bar'}); + + labs.isSet('foo').should.be.true; + }); + + it('isSet returns false for undefined', function () { + labsCacheStub.returns({foo: 'bar'}); + + labs.isSet('bar').should.be.false; + }); + + it('isSet always returns false for deprecated', function () { + labsCacheStub.returns({subscribers: true, publicAPI: true}); + + labs.isSet('subscribers').should.be.false; + labs.isSet('publicAPI').should.be.false; + }); +});