0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-04-08 02:52:39 -05:00

🎨 Move settings cache & cleanup settings API (#8057)

closes #8037

🔥 Remove API-level default settings population
- This is a relic!
- We ALWAYS populate defaults on server start therefore this code could never run.
- This was a lot of complicated code that wasn't even needed!!

🎨 Move settings cache
- Move settings cache to be its own thing
- Update all references
- Adds TODOs for further cleanup

🎨 Create settings initialisation step
- Create new settings library, which will eventually house more code
- Unify the interface for initialising settings (will be more useful later)
- Reduce number of calls to updateSettingsCache
This commit is contained in:
Hannah Wolfe 2017-02-27 15:53:04 +00:00 committed by Katharina Irrgang
parent 56eb89659e
commit 63723aa36a
41 changed files with 189 additions and 224 deletions

View file

@ -2,7 +2,7 @@
// RESTful API for browsing the configuration
var _ = require('lodash'),
config = require('../config'),
settingsCache = require('../api/settings').cache,
settingsCache = require('../settings/cache'),
ghostVersion = require('../utils/ghost-version'),
models = require('../models'),
Promise = require('bluebird'),

View file

@ -12,47 +12,36 @@ var _ = require('lodash'),
docName = 'settings',
settings,
settingsCache = require('../settings/cache'),
updateSettingsCache,
settingsFilter,
filterPaths,
readSettingsResult,
settingsResult,
canEditAllSettings,
populateDefaultSetting,
hasPopulatedDefaults = false,
/**
* ## Cache
* Holds cached settings
* @type {{}}
*/
settingsCache = {};
/**
* ### Update Settings Cache
* Maintain the internal cache of the settings object
* @public
* @param {Object} settings
* @returns {Settings}
*/
updateSettingsCache = function (settings, options) {
// @TODO simplify this!
updateSettingsCache = function updateSettingsCache(settings, options) {
options = options || {};
settings = settings || {};
if (!_.isEmpty(settings)) {
_.map(settings, function (setting, key) {
settingsCache[key] = setting;
settingsCache.set(key, setting);
});
return Promise.resolve(settingsCache);
return Promise.resolve(settingsCache.getAll());
}
return dataProvider.Settings.findAll(options)
.then(function (result) {
// keep reference and update all keys
_.extend(settingsCache, readSettingsResult(result.models));
_.each(readSettingsResult(result.models), function (setting, key) {
settingsCache.set(key, setting);
});
return settingsCache;
return settingsCache.getAll();
});
};
@ -175,33 +164,6 @@ settingsResult = function (settings, type) {
return result;
};
/**
* ### Populate Default Setting
* @private
* @param {String} key
* @returns Promise(Setting)
*/
populateDefaultSetting = function (key) {
// Call populateDefault and update the settings cache
return dataProvider.Settings.populateDefault(key).then(function (defaultSetting) {
// Process the default result and add to settings cache
var readResult = readSettingsResult([defaultSetting]);
// Add to the settings cache
return updateSettingsCache(readResult).then(function () {
// Get the result from the cache with permission checks
});
}).catch(function (err) {
// Pass along NotFoundError
if (typeof err === errors.NotFoundError) {
return Promise.reject(err);
}
// TODO: different kind of error?
return Promise.reject(new errors.NotFoundError({message: i18n.t('errors.api.settings.problemFindingSetting', {key: key})}));
});
};
/**
* ### Can Edit All Settings
* Check that this edit request is allowed for all settings requested to be updated
@ -210,7 +172,7 @@ populateDefaultSetting = function (key) {
* @returns {*}
*/
canEditAllSettings = function (settingsInfo, options) {
var checkSettingPermissions = function (setting) {
var checkSettingPermissions = function checkSettingPermissions(setting) {
if (setting.type === 'core' && !(options.context && options.context.internal)) {
return Promise.reject(
new errors.NoPermissionError({message: i18n.t('errors.api.settings.accessCoreSettingFromExtReq')})
@ -222,14 +184,12 @@ canEditAllSettings = function (settingsInfo, options) {
});
},
checks = _.map(settingsInfo, function (settingInfo) {
var setting = settingsCache[settingInfo.key];
var setting = settingsCache.get(settingInfo.key, {resolve: false});
if (!setting) {
// Try to populate a default setting if not in the cache
return populateDefaultSetting(settingInfo.key).then(function (defaultSetting) {
// Get the result from the cache with permission checks
return checkSettingPermissions(defaultSetting);
});
return Promise.reject(new errors.NotFoundError(
{message: i18n.t('errors.api.settings.problemFindingSetting', {key: settingInfo.key})}
));
}
return checkSettingPermissions(setting);
@ -251,17 +211,9 @@ settings = {
* @returns {*}
*/
browse: function browse(options) {
// First, check if we have populated the settings from default-settings yet
if (!hasPopulatedDefaults) {
return dataProvider.Settings.populateDefaults().then(function () {
hasPopulatedDefaults = true;
return settings.browse(options);
});
}
options = options || {};
var result = settingsResult(settingsCache, options.type);
var result = settingsResult(settingsCache.getAll(), options.type);
// If there is no context, return only blog settings
if (!options.context) {
@ -289,40 +241,32 @@ settings = {
options = {key: options};
}
var getSettingsResult = function () {
var setting = settingsCache[options.key],
result = {};
var setting = settingsCache.get(options.key, {resolve: false}),
result = {};
result[options.key] = setting;
if (setting.type === 'core' && !(options.context && options.context.internal)) {
return Promise.reject(
new errors.NoPermissionError({message: i18n.t('errors.api.settings.accessCoreSettingFromExtReq')})
);
}
if (setting.type === 'blog') {
return Promise.resolve(settingsResult(result));
}
return canThis(options.context).read.setting(options.key).then(function () {
return settingsResult(result);
}, function () {
return Promise.reject(new errors.NoPermissionError({message: i18n.t('errors.api.settings.noPermissionToReadSettings')}));
});
};
// If the setting is not already in the cache
if (!settingsCache[options.key]) {
// Try to populate the setting from default-settings file
return populateDefaultSetting(options.key).then(function () {
// Get the result from the cache with permission checks
return getSettingsResult();
});
if (!setting) {
return Promise.reject(new errors.NotFoundError(
{message: i18n.t('errors.api.settings.problemFindingSetting', {key: options.key})}
));
}
// Get the result from the cache with permission checks
return getSettingsResult();
result[options.key] = setting;
if (setting.type === 'core' && !(options.context && options.context.internal)) {
return Promise.reject(
new errors.NoPermissionError({message: i18n.t('errors.api.settings.accessCoreSettingFromExtReq')})
);
}
if (setting.type === 'blog') {
return Promise.resolve(settingsResult(result));
}
return canThis(options.context).read.setting(options.key).then(function () {
return settingsResult(result);
}, function () {
return Promise.reject(new errors.NoPermissionError({message: i18n.t('errors.api.settings.noPermissionToReadSettings')}));
});
},
/**
@ -375,37 +319,4 @@ settings = {
module.exports = settings;
/**
* @TODO:
* - move settings cache somewhere else e.q. listen on model changes
*
* IMPORTANT:
* We store settings with a type and a key in the database.
*
* {
* type: core
* key: dbHash
* value: ...
* }
*
* But the settings cache does not allow requesting a value by type, only by key.
* e.g. settings.cache.get('dbHash')
*/
module.exports.cache = {
get: function get(key) {
if (!settingsCache[key]) {
return;
}
try {
return JSON.parse(settingsCache[key].value);
} catch (err) {
return settingsCache[key].value;
}
},
getAll: function getAll() {
return settingsCache;
}
};
module.exports.updateSettingsCache = updateSettingsCache;

View file

@ -10,6 +10,7 @@ var Promise = require('bluebird'),
logging = require('../logging'),
storage = require('../storage'),
settings = require('./settings'),
settingsCache = require('../settings/cache'),
apiUtils = require('./utils'),
utils = require('./../utils'),
i18n = require('../i18n'),
@ -30,7 +31,7 @@ themes = {
},
browse: function browse() {
return Promise.resolve({themes: settings.cache.get('availableThemes')});
return Promise.resolve({themes: settingsCache.get('availableThemes')});
},
upload: function upload(options) {

View file

@ -6,7 +6,7 @@ var path = require('path'),
// Dirty requires
errors = require('../../../errors'),
settingsCache = require('../../../api/settings').cache,
settingsCache = require('../../../settings/cache'),
templates = require('../../../controllers/frontend/templates'),
postLookup = require('../../../controllers/frontend/post-lookup'),
setResponseContext = require('../../../controllers/frontend/context');

View file

@ -5,7 +5,7 @@
var api = require('../../api'),
_ = require('lodash'),
Promise = require('bluebird'),
settingsCache = api.settings.cache,
settingsCache = require('../../settings/cache'),
queryDefaults,
defaultPostQuery = {};

View file

@ -3,7 +3,7 @@ var _ = require('lodash'),
url = require('url'),
routeMatch = require('path-match')(),
api = require('../../api'),
settingsCache = api.settings.cache,
settingsCache = require('../../settings/cache'),
optionsFormat = '/:options?';
function getOptionsFormat(linkStructure) {

View file

@ -1,5 +1,5 @@
var config = require('../../config'),
settingsCache = require('../../api/settings').cache,
settingsCache = require('../../settings/cache'),
utils = require('../../utils');
function getAssetUrl(path, isAdmin, minify) {

View file

@ -1,4 +1,4 @@
var settingsCache = require('../../api/settings').cache,
var settingsCache = require('../../settings/cache'),
_ = require('lodash');
function getContextObject(data, context) {

View file

@ -1,5 +1,5 @@
var _ = require('lodash'),
settingsCache = require('../../api/settings').cache;
settingsCache = require('../../settings/cache');
function getDescription(data, root) {
var description = '',

View file

@ -1,5 +1,5 @@
var Promise = require('bluebird'),
settingsCache = require('../../api/settings').cache,
settingsCache = require('../../settings/cache'),
utils = require('../../utils'),
getUrl = require('./url'),
getImageDimensions = require('./image-dimensions'),

View file

@ -1,5 +1,5 @@
var _ = require('lodash'),
settingsCache = require('../../api/settings').cache;
settingsCache = require('../../settings/cache');
function getTitle(data, root) {
var title = '',

View file

@ -7,7 +7,7 @@ var crypto = require('crypto'),
i18n = require('../../../i18n'),
filters = require('../../../filters'),
processUrls = require('../../../utils/make-absolute-urls'),
settingsCache = require('../../../api/settings').cache,
settingsCache = require('../../../settings/cache'),
// Really ugly temporary hack for location of things
fetchData = require('../../../controllers/frontend/fetch-data'),

View file

@ -18,7 +18,7 @@ var getMetaData = require('../data/meta'),
labs = require('../utils/labs'),
utils = require('../utils'),
api = require('../api'),
settingsCache = api.settings.cache;
settingsCache = require('../settings/cache');
function getClient() {
if (labs.isSet('publicAPI') === true) {

View file

@ -19,7 +19,6 @@ var debug = require('debug')('ghost:boot:init'),
Promise = require('bluebird'),
logging = require('./logging'),
i18n = require('./i18n'),
api = require('./api'),
models = require('./models'),
permissions = require('./permissions'),
apps = require('./apps'),
@ -29,6 +28,8 @@ var debug = require('debug')('ghost:boot:init'),
slack = require('./data/slack'),
GhostServer = require('./ghost-server'),
scheduling = require('./scheduling'),
settings = require('./settings'),
settingsCache = require('./settings/cache'),
themes = require('./themes'),
utils = require('./utils');
@ -47,11 +48,8 @@ function init() {
return dbHealth.check().then(function () {
debug('DB health check done');
// Populate any missing default settings
return models.Settings.populateDefaults();
}).then(function () {
debug('Models & database done');
// Refresh the API settings cache
return api.settings.updateSettingsCache();
return settings.init();
}).then(function () {
debug('Update settings cache done');
// Initialize the permissions actions and objects
@ -81,8 +79,8 @@ function init() {
ghostAuthUrl: config.get('auth:url'),
redirectUri: utils.url.urlFor('admin', true),
clientUri: utils.url.urlFor('home', true),
clientName: api.settings.cache.get('title'),
clientDescription: api.settings.cache.get('description')
clientName: settingsCache.get('title'),
clientDescription: settingsCache.get('description')
}).then(function (response) {
parentApp.use(response.auth);
}).catch(function onAuthError(err) {

View file

@ -5,7 +5,7 @@ var _ = require('lodash'),
nodemailer = require('nodemailer'),
validator = require('validator'),
config = require('../config'),
settingsCache = require('../api/settings').cache,
settingsCache = require('../settings/cache'),
i18n = require('../i18n'),
utils = require('../utils');

View file

@ -1,7 +1,7 @@
var fs = require('fs'),
path = require('path'),
storage = require('../storage'),
settingsCache = require('../api/settings').cache,
settingsCache = require('../settings/cache'),
utils = require('../utils'),
crypto = require('crypto'),
buildContentResponse,

View file

@ -3,7 +3,7 @@ var _ = require('lodash'),
path = require('path'),
hbs = require('express-hbs'),
api = require('../api'),
settingsCache = api.settings.cache,
settingsCache = require('../settings/cache'),
config = require('../config'),
utils = require('../utils'),
logging = require('../logging'),

View file

@ -147,23 +147,6 @@ Settings = ghostBookshelf.Model.extend({
});
},
populateDefault: function (key) {
if (!getDefaultSettings()[key]) {
return Promise.reject(new errors.NotFoundError({message: i18n.t('errors.models.settings.unableToFindDefaultSetting', {key: key})}));
}
return this.findOne({key: key}).then(function then(foundSetting) {
if (foundSetting) {
return foundSetting;
}
var defaultSetting = _.clone(getDefaultSettings()[key]);
defaultSetting.value = defaultSetting.defaultValue;
return Settings.forge(defaultSetting).save(null, internalContext);
});
},
populateDefaults: function populateDefaults(options) {
options = options || {};

View file

@ -0,0 +1,67 @@
// It's important to keep the requires absolutely minimal here,
// As this cache is used in SO many other areas, we may open ourselves to
// circular dependency bugs.
var debug = require('debug')('ghost:settings:cache'),
events = require('../events'),
/**
* ## Cache
* Holds cached settings
* @type {{}}
*/
settingsCache = {};
/**
*
* IMPORTANT:
* We store settings with a type and a key in the database.
*
* {
* type: core
* key: dbHash
* value: ...
* }
*
* But the settings cache does not allow requesting a value by type, only by key.
* e.g. settingsCache.get('dbHash')
*/
module.exports = {
get: function get(key, options) {
if (!settingsCache[key]) {
return;
}
// Don't try to resolve to the value of the setting
if (options && options.resolve === false) {
return settingsCache[key];
}
// Default behaviour is to try to resolve the value and return that
try {
return JSON.parse(settingsCache[key].value);
} catch (err) {
return settingsCache[key].value;
}
},
set: function set(key, value) {
settingsCache[key] = value;
},
getAll: function getAll() {
return settingsCache;
},
init: function init() {
var self = this,
updateSettingFromModel = function updateSettingFromModel(settingModel) {
debug('Auto updating', settingModel.get('key'));
self.set(settingModel.get('key'), settingModel.toJSON());
};
// First, reset the cache
settingsCache = {};
// Bind to events to automatically keep up-to-date
events.on('settings.edited', updateSettingFromModel);
events.on('settings.added', updateSettingFromModel);
events.on('settings.deleted', updateSettingFromModel);
return settingsCache;
}
};

View file

@ -0,0 +1,23 @@
/**
* Settings Lib
* A collection of utilities for handling settings including a cache
* @TODO: eventually much of this logic will move into this lib
* For now we are providing a unified interface
*/
var SettingsModel = require('../models/settings').Settings,
SettingsAPI = require('../api').settings,
SettingsCache = require('./cache');
module.exports = {
init: function init() {
// Bind to events
SettingsCache.init();
// Update the defaults
return SettingsModel.populateDefaults()
.then(function () {
// Reset the cache
return SettingsAPI.updateSettingsCache();
});
}
};

View file

@ -3,6 +3,7 @@ var debug = require('debug')('ghost:themes:loader'),
events = require('../events'),
read = require('./read'),
settingsApi = require('../api/settings'),
settingsCache = require('../settings/cache'),
updateConfigAndCache,
loadThemes,
initThemes;
@ -20,7 +21,7 @@ loadThemes = function loadThemes() {
};
initThemes = function initThemes() {
debug('init themes', settingsApi.cache.get('activeTheme'));
debug('init themes', settingsCache.get('activeTheme'));
// Register a listener for server-start to load all themes
events.on('server:start', function readAllThemesOnServerStart() {
@ -29,7 +30,7 @@ initThemes = function initThemes() {
// Just read the active theme for now
return read
.one(config.getContentPath('themes'), settingsApi.cache.get('activeTheme'))
.one(config.getContentPath('themes'), settingsCache.get('activeTheme'))
.then(updateConfigAndCache);
};

View file

@ -1,4 +1,4 @@
var settingsCache = require('../api/settings').cache,
var settingsCache = require('../settings/cache'),
flagIsSet;
flagIsSet = function flagIsSet(flag) {

View file

@ -5,7 +5,7 @@ var moment = require('moment-timezone'),
_ = require('lodash'),
url = require('url'),
config = require('./../config'),
settingsCache = require('./../api/settings').cache,
settingsCache = require('./../settings/cache'),
// @TODO: unify this with the path in server/app.js
API_PATH = '/ghost/api/v0.1/',
STATIC_IMAGE_URL_PREFIX = 'content/images';

View file

@ -8,9 +8,11 @@ var request = require('supertest'),
moment = require('moment'),
sinon = require('sinon'),
cheerio = require('cheerio'),
_ = require('lodash'),
testUtils = require('../../utils'),
config = require('../../../server/config'),
settingsCache = require('../../../server/api/settings').cache,
settingsCache = require('../../../server/settings/cache'),
origCache = _.cloneDeep(settingsCache),
sandbox = sinon.sandbox.create(),
ghost = testUtils.startGhost;
@ -327,14 +329,11 @@ describe('Frontend Routing', function () {
});
it('should not render AMP, when AMP is disabled', function (done) {
var originalFn = settingsCache.get;
sandbox.stub(settingsCache, 'get', function (key) {
if (key !== 'amp') {
return originalFn(key);
sandbox.stub(settingsCache, 'get', function (key, options) {
if (key === 'amp' && !options) {
return false;
}
return false;
return origCache.get(key, options);
});
request.get('/welcome-to-ghost/amp/')
@ -618,15 +617,6 @@ describe('Frontend Routing', function () {
});
it('/blog/welcome-to-ghost/amp/ should 200', function (done) {
var originalFn = settingsCache.get;
sandbox.stub(settingsCache, 'get', function (key) {
if (key !== 'amp') {
return originalFn(key);
}
return true;
});
request.get('/blog/welcome-to-ghost/amp/')
.expect(200)
.end(doEnd(done));
@ -709,16 +699,6 @@ describe('Frontend Routing', function () {
});
it('/blog/welcome-to-ghost/amp/ should 200', function (done) {
var originalFn = settingsCache.get;
sandbox.stub(settingsCache, 'get', function (key) {
if (key !== 'amp') {
return originalFn(key);
}
return true;
});
request.get('/blog/welcome-to-ghost/amp/')
.expect(200)
.end(doEnd(done));

View file

@ -9,7 +9,7 @@ var Promise = require('bluebird'),
db = require('../../../server/data/db'),
models = require('../../../server/models'),
PostAPI = require('../../../server/api/posts'),
settingsCache = require('../../../server/api/settings').cache,
settingsCache = require('../../../server/settings/cache'),
sandbox = sinon.sandbox.create();
describe('Post API', function () {

View file

@ -4,6 +4,7 @@ var testUtils = require('../../utils'),
// Stuff we are testing
SettingsAPI = require('../../../server/api/settings'),
settingsCache = require('../../../server/settings/cache'),
defaultContext = {user: 1},
internalContext = {internal: true},
callApiWithContext,
@ -115,10 +116,10 @@ describe('Settings API', function () {
});
it('can edit', function () {
var testReference = SettingsAPI.cache.getAll();
var testReference = settingsCache.getAll();
// see default-settings.json
SettingsAPI.cache.get('title').should.eql('Ghost');
settingsCache.get('title').should.eql('Ghost');
testReference.title.value.should.eql('Ghost');
return callApiWithContext(defaultContext, 'edit', {settings: [{key: 'title', value: 'UpdatedGhost'}]}, {})
@ -128,7 +129,7 @@ describe('Settings API', function () {
response.settings.length.should.equal(1);
testUtils.API.checkResponse(response.settings[0], 'setting');
SettingsAPI.cache.get('title').should.eql('UpdatedGhost');
settingsCache.get('title').should.eql('UpdatedGhost');
testReference.title.value.should.eql('UpdatedGhost');
});
});

View file

@ -5,7 +5,7 @@ var testUtils = require('../../utils'),
Promise = require('bluebird'),
sinon = require('sinon'),
sequence = require('../../../server/utils/sequence'),
settingsCache = require('../../../server/api/settings').cache,
settingsCache = require('../../../server/settings/cache'),
ghostBookshelf = require('../../../server/models/base'),
PostModel = require('../../../server/models/post').Post,
TagModel = require('../../../server/models/tag').Tag,

View file

@ -3,6 +3,7 @@ var should = require('should'),
Promise = require('bluebird'),
// Stuff we are testing
api = require('../../../../server/api'),
settingsCache = require('../../../../server/settings/cache'),
fetchData = require('../../../../server/controllers/frontend/fetch-data'),
configUtils = require('../../../utils/configUtils'),
sandbox = sinon.sandbox.create();
@ -27,7 +28,7 @@ describe('fetchData', function () {
describe('channel config', function () {
beforeEach(function () {
sandbox.stub(api.settings.cache, 'get').returns(10);
sandbox.stub(settingsCache, 'get').returns(10);
});
it('should handle no post options', function (done) {
@ -154,7 +155,7 @@ describe('fetchData', function () {
describe('valid postsPerPage', function () {
beforeEach(function () {
sandbox.stub(api.settings.cache, 'get').returns(10);
sandbox.stub(settingsCache, 'get').returns(10);
});
it('Adds limit & includes to options by default', function (done) {
@ -170,7 +171,7 @@ describe('fetchData', function () {
describe('invalid postsPerPage', function () {
beforeEach(function () {
sandbox.stub(api.settings.cache, 'get').returns(-1);
sandbox.stub(settingsCache, 'get').returns(-1);
});
it('Will not add limit if postsPerPage is not valid', function (done) {

View file

@ -6,7 +6,7 @@ var moment = require('moment'),
api = require('../../../../server/api'),
frontend = require('../../../../server/controllers/frontend'),
configUtils = require('../../../utils/configUtils'),
settingsCache = api.settings.cache,
settingsCache = require('../../../../server/settings/cache'),
sandbox = sinon.sandbox.create();
describe('Frontend Controller', function () {

View file

@ -4,7 +4,7 @@ var should = require('should'),
configUtils = require('../../../utils/configUtils'),
api = require('../../../../server/api'),
postLookup = require('../../../../server/controllers/frontend/post-lookup'),
settingsCache = api.settings.cache,
settingsCache = require('../../../../server/settings/cache'),
sandbox = sinon.sandbox.create();
describe('postLookup', function () {

View file

@ -2,7 +2,7 @@ var should = require('should'),
Promise = require('bluebird'),
sinon = require('sinon'),
mail = require('../../../server/mail'),
api = require('../../../server/api'),
settingsCache = require('../../../server/settings/cache'),
configUtils = require('../../utils/configUtils'),
i18n = require('../../../server/i18n'),
sandbox = sinon.sandbox.create(),
@ -178,7 +178,7 @@ describe('Mail: Ghostmailer', function () {
});
it('should fall back to [blog.title] <ghost@[blog.url]>', function () {
sandbox.stub(api.settings.cache, 'get').returns('Test');
sandbox.stub(settingsCache, 'get').returns('Test');
// Standard domain
configUtils.set({url: 'http://default.com', mail: {from: null}});
@ -207,7 +207,7 @@ describe('Mail: Ghostmailer', function () {
});
it('should attach blog title if from or fromaddress are only email addresses', function () {
sandbox.stub(api.settings.cache, 'get').returns('Test');
sandbox.stub(settingsCache, 'get').returns('Test');
// from and fromaddress are both set
configUtils.set({mail: {from: 'from@default.com', fromaddress: 'fa@default.com'}});

View file

@ -1,7 +1,7 @@
var should = require('should'),
sinon = require('sinon'),
getContextObject = require('../../../server/data/meta/context_object.js'),
settingsCache = require('../../../server/api/settings').cache,
settingsCache = require('../../../server/settings/cache'),
sandbox = sinon.sandbox.create();
describe('getContextObject', function () {

View file

@ -2,7 +2,7 @@
var sinon = require('sinon'),
should = require('should'),
getTitle = require('../../../server/data/meta/title'),
settingsCache = require('../../../server/api/settings').cache,
settingsCache = require('../../../server/settings/cache'),
sandbox = sinon.sandbox.create();
should.equal(true, true);

View file

@ -2,7 +2,7 @@ var sinon = require('sinon'),
should = require('should'),
express = require('express'),
serveFavicon = require('../../../server/middleware/serve-favicon'),
settingsCache = require('../../../server/api/settings').cache,
settingsCache = require('../../../server/settings/cache'),
configUtils = require('../../utils/configUtils'),
path = require('path'),
sandbox = sinon.sandbox.create();

View file

@ -6,6 +6,7 @@ var should = require('should'),
testUtils = require('../utils'),
channelConfig = require('../../server/controllers/frontend/channel-config'),
api = require('../../server/api'),
settingsCache = require('../../server/settings/cache'),
rss = rewire('../../server/data/xml/rss'),
configUtils = require('../utils/configUtils');
@ -303,7 +304,7 @@ describe('RSS', function () {
set: sinon.stub()
};
sandbox.stub(api.settings.cache, 'get', function (key) {
sandbox.stub(settingsCache, 'get', function (key) {
var obj = {
title: 'Test',
description: 'Some Text',

View file

@ -4,7 +4,7 @@ var should = require('should'),
utils = require('./utils'),
configUtils = require('../../utils/configUtils'),
helpers = require('../../../server/helpers'),
settingsCache = require('../../../server/api/settings').cache,
settingsCache = require('../../../server/settings/cache'),
sandbox = sinon.sandbox.create(),
handlebars = hbs.handlebars;

View file

@ -9,7 +9,7 @@ var should = require('should'),
helpers = require('../../../server/helpers'),
api = require('../../../server/api'),
labs = require('../../../server/utils/labs'),
settingsCache = api.settings.cache,
settingsCache = require('../../../server/settings/cache'),
handlebars = hbs.handlebars,
sandbox = sinon.sandbox.create();

View file

@ -6,7 +6,7 @@ var should = require('should'),
handlebars = hbs.handlebars,
sandbox = sinon.sandbox.create(),
helpers = require('../../../server/helpers'),
settingsCache = require('../../../server/api/settings').cache;
settingsCache = require('../../../server/settings/cache');
describe('{{meta_description}} helper', function () {
before(function () {

View file

@ -6,7 +6,7 @@ var should = require('should'),
handlebars = hbs.handlebars,
sandbox = sinon.sandbox.create(),
helpers = require('../../../server/helpers'),
settingsCache = require('../../../server/api/settings').cache;
settingsCache = require('../../../server/settings/cache');
describe('{{meta_title}} helper', function () {
before(function () {

View file

@ -4,7 +4,7 @@ var should = require('should'),
moment = require('moment'),
sinon = require('sinon'),
utils = require('../../../server/utils'),
settingsCache = require('../../../server/api/settings').cache,
settingsCache = require('../../../server/settings/cache'),
configUtils = require('../../utils/configUtils'),
testUtils = require('../../utils'),
sandbox = sinon.sandbox.create(),

View file

@ -12,7 +12,7 @@ var Promise = require('bluebird'),
db = require('../../server/data/db'),
fixtureUtils = require('../../server/data/schema/fixtures/utils'),
models = require('../../server/models'),
SettingsAPI = require('../../server/api/settings'),
SettingsLib = require('../../server/settings'),
permissions = require('../../server/permissions'),
sequence = require('../../server/utils/sequence'),
themes = require('../../server/themes'),
@ -434,9 +434,7 @@ toDoList = {
'posts:mu': function insertMultiAuthorPosts() { return fixtures.insertMultiAuthorPosts(); },
tags: function insertMoreTags() { return fixtures.insertMoreTags(); },
apps: function insertApps() { return fixtures.insertApps(); },
settings: function populateSettings() {
return models.Settings.populateDefaults().then(function () { return SettingsAPI.updateSettingsCache(); });
},
settings: function populateSettings() { return SettingsLib.init(); },
'users:roles': function createUsersWithRoles() { return fixtures.createUsersWithRoles(); },
'users:no-owner': function createUsersWithoutOwner() { return fixtures.createUsersWithoutOwner(); },
users: function createExtraUsers() { return fixtures.createExtraUsers(); },