From 634fdbfa963a4a96b9c54d5ebcca3a5698f87b11 Mon Sep 17 00:00:00 2001 From: kirrg001 Date: Thu, 14 Dec 2017 16:41:30 +0100 Subject: [PATCH] Tests: Do not re-register model events in settings cache no issue > (node:63849) Warning: Possible EventEmitter memory leak detected. 101 settings.edited listeners added. Use emitter.setMaxListeners() to increase limit - the settings cache was initialised per test - it registered the model events over and over again - add a simple shutdown function, which can be called from the test env --- core/server/services/settings/cache.js | 33 +++++++++++++++----------- core/test/utils/index.js | 3 +++ 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/core/server/services/settings/cache.js b/core/server/services/settings/cache.js index 5b3f4ef5bf..8e12a53be7 100644 --- a/core/server/services/settings/cache.js +++ b/core/server/services/settings/cache.js @@ -11,7 +11,15 @@ var debug = require('ghost-ignition').debug('settings:cache'), * Contains the JSON version of the model * @type {{}} - object of objects */ - settingsCache = {}; + settingsCache = {}, + _private = {}; + +// Local function, only ever used for initialising +// We deliberately call "set" on each model so that set is a consistent interface +_private.updateSettingFromModel = function updateSettingFromModel(settingModel) { + debug('Auto updating', settingModel.get('key')); + module.exports.set(settingModel.get('key'), settingModel.toJSON()); +}; /** * @@ -86,28 +94,25 @@ module.exports = { * @return {{}} */ init: function init(settingsCollection) { - var self = this; - - // Local function, only ever used for initialising - // We deliberately call "set" on each model so that set is a consistent interface - function updateSettingFromModel(settingModel) { - debug('Auto updating', settingModel.get('key')); - self.set(settingModel.get('key'), settingModel.toJSON()); - } - // First, reset the cache settingsCache = {}; // // if we have been passed a collection of settings, use this to populate the cache if (settingsCollection && settingsCollection.models) { - _.each(settingsCollection.models, updateSettingFromModel); + _.each(settingsCollection.models, _private.updateSettingFromModel); } // Bind to events to automatically keep up-to-date - common.events.on('settings.edited', updateSettingFromModel); - common.events.on('settings.added', updateSettingFromModel); - common.events.on('settings.deleted', updateSettingFromModel); + common.events.on('settings.edited', _private.updateSettingFromModel); + common.events.on('settings.added', _private.updateSettingFromModel); + common.events.on('settings.deleted', _private.updateSettingFromModel); return settingsCache; + }, + + shutdown: function () { + common.events.removeListener('settings.edited', _private.updateSettingFromModel); + common.events.removeListener('settings.added', _private.updateSettingFromModel); + common.events.removeListener('settings.deleted', _private.updateSettingFromModel); } }; diff --git a/core/test/utils/index.js b/core/test/utils/index.js index f177e7aa62..3cbc21da02 100644 --- a/core/test/utils/index.js +++ b/core/test/utils/index.js @@ -19,6 +19,7 @@ var Promise = require('bluebird'), models = require('../../server/models'), urlService = require('../../server/services/url'), SettingsLib = require('../../server/services/settings'), + SettingsCache = require('../../server/services/settings/cache'), customRedirectsMiddleware = require('../../server/web/middleware/custom-redirects'), permissions = require('../../server/services/permissions'), sequence = require('../../server/lib/promise/sequence'), @@ -502,6 +503,7 @@ toDoList = { return fixtures.insertApps(); }, settings: function populateSettings() { + SettingsCache.shutdown(); return SettingsLib.init(); }, 'users:roles': function createUsersWithRoles() { @@ -872,6 +874,7 @@ startGhost = function startGhost(options) { return knexMigrator.init({only: 2}); }) .then(function () { + SettingsCache.shutdown(); return SettingsLib.init(); }) .then(function () {