Repository: ambari Updated Branches: refs/heads/trunk 0982aa2e3 -> 4b0cd8fd4
AMBARI-5787. Unit tests for step controllers (7) with refactor. (onechiporenko) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4b0cd8fd Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4b0cd8fd Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4b0cd8fd Branch: refs/heads/trunk Commit: 4b0cd8fd47fa0715ee2fd8bfdb514b44fe423834 Parents: 0982aa2 Author: Oleg Nechiporenko <[email protected]> Authored: Fri May 16 16:39:58 2014 +0300 Committer: Oleg Nechiporenko <[email protected]> Committed: Fri May 16 16:43:37 2014 +0300 ---------------------------------------------------------------------- .../app/controllers/wizard/step7_controller.js | 361 +++++++++++------- .../test/controllers/wizard/step7_test.js | 369 +++++++++++++++++-- 2 files changed, 567 insertions(+), 163 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/4b0cd8fd/ambari-web/app/controllers/wizard/step7_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/wizard/step7_controller.js b/ambari-web/app/controllers/wizard/step7_controller.js index 30b72ac..5de14f5 100644 --- a/ambari-web/app/controllers/wizard/step7_controller.js +++ b/ambari-web/app/controllers/wizard/step7_controller.js @@ -55,7 +55,7 @@ App.WizardStep7Controller = Em.Controller.extend({ /** * @type {string} */ - gangliaMoutDir:'/', + gangliaMoutDir: '/', overrideToAdd: null, @@ -128,7 +128,7 @@ App.WizardStep7Controller = Em.Controller.extend({ */ installedServiceNames: function () { var serviceNames = this.get('content.services').filterProperty('isInstalled').mapProperty('serviceName'); - if(this.get('content.controllerName') !== 'installerController') { + if (this.get('content.controllerName') !== 'installerController') { return serviceNames.without('SQOOP').without('HCATALOG'); } return serviceNames; @@ -197,7 +197,7 @@ App.WizardStep7Controller = Em.Controller.extend({ * @method loadInstalledServicesConfigGroups */ loadInstalledServicesConfigGroups: function (servicesNames) { - servicesNames.forEach(function(serviceName) { + servicesNames.forEach(function (serviceName) { App.ajax.send({ name: 'config.tags_and_groups', sender: this, @@ -210,29 +210,52 @@ App.WizardStep7Controller = Em.Controller.extend({ }, this); }, - /** - * Load config groups success callback - * @param {object} data - * @param {object} opt - * @param {object} params - * @method loadServiceTagsSuccess - */ - loadServiceTagsSuccess: function (data, opt, params) { - var serviceConfigsDef = params.serviceConfigsDef; - var serviceName = params.serviceName; - var service = this.get('stepConfigs').findProperty('serviceName', serviceName); - // Create default configuration group - var defaultConfigGroupHosts = this.get('wizardController.allHosts').mapProperty('hostName'); - var selectedConfigGroup; + /** + * Create site to tag map. Format: + * <code> + * { + * site1: tag1, + * site1: tag2, + * site2: tag3 + * ... + * } + * </code> + * @param {object} desired_configs + * @param {string[]} sites + * @returns {object} + * @private + * @method _createSiteToTagMap + */ + _createSiteToTagMap: function (desired_configs, sites) { var siteToTagMap = {}; - for (var site in data.Clusters.desired_configs) { - if (serviceConfigsDef.sites.indexOf(site) > -1) { - siteToTagMap[site] = data.Clusters.desired_configs[site].tag; + for (var site in desired_configs) { + if (desired_configs.hasOwnProperty(site)) { + if (sites.indexOf(site) > -1) { + siteToTagMap[site] = desired_configs[site].tag; + } } } - this.loadedClusterSiteToTagMap = siteToTagMap; + return siteToTagMap; + }, + + /** + * Load config groups success callback + * @param {object} data + * @param {object} opt + * @param {object} params + * @method loadServiceTagsSuccess + */ + loadServiceTagsSuccess: function (data, opt, params) { + var serviceName = params.serviceName, + service = this.get('stepConfigs').findProperty('serviceName', serviceName), + defaultConfigGroupHosts = this.get('wizardController.allHosts').mapProperty('hostName'), + siteToTagMap = this._createSiteToTagMap(data.Clusters.desired_configs, params.serviceConfigsDef.sites), + selectedConfigGroup; + + this.set('loadedClusterSiteToTagMap', siteToTagMap); + //parse loaded config groups - if (App.supports.hostOverrides) { + if (App.get('supports.hostOverrides')) { var configGroups = []; if (data.config_groups.length) { data.config_groups.forEach(function (item) { @@ -280,10 +303,10 @@ App.WizardStep7Controller = Em.Controller.extend({ } configGroups = configGroups.sortProperty('name'); configGroups.unshift(defaultConfigGroup); - if (App.supports.hostOverrides) { + if (App.get('supports.hostOverrides')) { service.set('configGroups', configGroups); var loadedGroupToOverrideSiteToTagMap = {}; - if (App.supports.hostOverrides) { + if (App.get('supports.hostOverrides')) { var configGroupsWithOverrides = selectedConfigGroup.get('isDefault') ? service.get('configGroups') : [selectedConfigGroup]; configGroupsWithOverrides.forEach(function (item) { var groupName = item.get('name'); @@ -306,103 +329,191 @@ App.WizardStep7Controller = Em.Controller.extend({ }, /** - * - * @param {Ember.Object[]} configs - * @param {Ember.Object} componentConfig - * @param {Ember.Object} component - * @method loadComponentConfigs - */ - loadComponentConfigs: function (configs, componentConfig, component) { - var localDB = App.router.get('mainServiceInfoConfigsController').getInfoForDefaults(); - var recommendedDefaults = {}; - var s = this.get('serviceConfigsData').findProperty('serviceName', component.get('serviceName')); - var defaultGroupSelected = component.get('selectedConfigGroup.isDefault'); - var defaults = []; + * Get object with recommended default values for config properties + * Format: + * <code> + * { + * configName1: configValue1, + * configName2: configValue2 + * ... + * } + * </code> + * @param {string} serviceName + * @returns {object} + * @method _getRecommendedDefaultsForComponent + */ + _getRecommendedDefaultsForComponent: function (serviceName) { + var s = this.get('serviceConfigsData').findProperty('serviceName', serviceName), + recommendedDefaults = {}, + localDB = App.router.get('mainServiceInfoConfigsController').getInfoForDefaults(); if (s.defaultsProviders) { - s.defaultsProviders.forEach(function(defaultsProvider) { + s.defaultsProviders.forEach(function (defaultsProvider) { var d = defaultsProvider.getDefaults(localDB); - defaults.push(d); for (var name in d) { - recommendedDefaults[name] = d[name]; + if (d.hasOwnProperty(name)) { + recommendedDefaults[name] = d[name]; + } } }); } - if (s.configsValidator) { - s.configsValidator.set('recommendedDefaults', recommendedDefaults); + return recommendedDefaults; + }, + + /** + * By default <code>value</code>-property is string "true|false". + * Should update it to boolean type + * Also affects <code>defaultValue</code> + * @param {Ember.Object} serviceConfigProperty + * @returns {Ember.Object} Updated config-object + * @method _updateValueForCheckBoxConfig + */ + _updateValueForCheckBoxConfig: function (serviceConfigProperty) { + var v = serviceConfigProperty.get('value'); + switch (serviceConfigProperty.get('value')) { + case 'true': + v = true; + break; + case 'false': + v = false; + break; } - configs.forEach(function (serviceConfigProperty) { - if (!serviceConfigProperty) return; - var overrides = serviceConfigProperty.get('overrides'); - // we will populate the override properties below - serviceConfigProperty.set('overrides', null); + serviceConfigProperty.setProperties({value: v, defaultValue: v}); + return serviceConfigProperty; + }, - if (serviceConfigProperty.isOverridable === undefined) { - serviceConfigProperty.set('isOverridable', true); + /** + * Set <code>isEditable</code>-property to <code>serviceConfigProperty</code> + * Based on user's permissions and selected config group + * @param {Ember.Object} serviceConfigProperty + * @param {bool} defaultGroupSelected + * @returns {Ember.Object} Updated config-object + * @method _updateIsEditableFlagForConfig + */ + _updateIsEditableFlagForConfig: function (serviceConfigProperty, defaultGroupSelected) { + if (App.get('isAdmin')) { + if (defaultGroupSelected && !this.get('isHostsConfigsPage')) { + serviceConfigProperty.set('isEditable', serviceConfigProperty.get('isReconfigurable')); + } + else { + serviceConfigProperty.set('isEditable', false); } - if (serviceConfigProperty.displayType === 'checkbox') { - switch (serviceConfigProperty.value) { - case 'true': - serviceConfigProperty.set('value', true); - serviceConfigProperty.set('defaultValue', true); - break; - case 'false': - serviceConfigProperty.set('value', false); - serviceConfigProperty.set('defaultValue', false); - break; + } + else { + serviceConfigProperty.set('isEditable', false); + } + return serviceConfigProperty; + }, + + /** + * Set <code>overrides</code>-property to <code>serviceConfigProperty<code> + * @param {Ember.Object} serviceConfigProperty + * @param {Ember.Object} component + * @return {Ember.Object} Updated config-object + * @method _updateOverridesForConfig + */ + _updateOverridesForConfig: function (serviceConfigProperty, component) { + + var overrides = serviceConfigProperty.get('overrides'); + + if (Em.isNone(overrides)) { + serviceConfigProperty.set('overrides', Em.A([])); + return serviceConfigProperty; + } + serviceConfigProperty.set('overrides', null); + var defaultGroupSelected = component.get('selectedConfigGroup.isDefault'); + + // Wrap each override to App.ServiceConfigProperty + overrides.forEach(function (override) { + var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty); + newSCP.set('value', override.value); + newSCP.set('isOriginalSCP', false); // indicated this is overridden value, + newSCP.set('parentSCP', serviceConfigProperty); + if (App.get('supports.hostOverrides') && defaultGroupSelected) { + var group = component.get('configGroups').findProperty('name', override.group.get('name')); + // prevent cycle in proto object, clean link + if (group.get('properties').length == 0) { + group.set('properties', Em.A([])); } + group.get('properties').push(newSCP); + newSCP.set('group', override.group); + newSCP.set('isEditable', false); } - if (serviceConfigProperty.get('serviceName') === component.get('serviceName')) { - if (s.configsValidator) { - var validators = s.configsValidator.get('configValidators'); - for (var validatorName in validators) { - if (serviceConfigProperty.name == validatorName) { - serviceConfigProperty.set('serviceValidator', s.configsValidator); + var parentOverridesArray = serviceConfigProperty.get('overrides'); + if (Em.isNone(parentOverridesArray)) { + parentOverridesArray = Em.A([]); + serviceConfigProperty.set('overrides', parentOverridesArray); + } + serviceConfigProperty.get('overrides').pushObject(newSCP); + }, this); + return serviceConfigProperty; + }, + + /** + * Set <code>serviceValidator</code>-property to <code>serviceConfigProperty</code> if config's serviceName is equal + * to component's serviceName + * othervise set <code>isVisible</code>-property to <code>false</code> + * @param {Ember.Object} serviceConfigProperty + * @param {Ember.Object} component + * @param {object} serviceConfigsData + * @returns {Ember.Object} updated config-object + * @mrthod _updateValidatorsForConfig + */ + _updateValidatorsForConfig: function (serviceConfigProperty, component, serviceConfigsData) { + if (serviceConfigProperty.get('serviceName') === component.get('serviceName')) { + if (serviceConfigsData.configsValidator) { + var validators = serviceConfigsData.configsValidator.get('configValidators'); + for (var validatorName in validators) { + if (validators.hasOwnProperty(validatorName)) { + if (serviceConfigProperty.get('name') == validatorName) { + serviceConfigProperty.set('serviceValidator', serviceConfigsData.configsValidator); } } } - } else { - serviceConfigProperty.set('isVisible', false); } - if (overrides != null) { - overrides.forEach(function (override) { - var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty); - newSCP.set('value', override.value); - newSCP.set('isOriginalSCP', false); // indicated this is overridden value, - newSCP.set('parentSCP', serviceConfigProperty); - if (App.supports.hostOverrides && defaultGroupSelected) { - var group = component.get('configGroups').findProperty('name', override.group.get('name')); - // prevent cycle in proto object, clean link - if (group.get('properties').length == 0) - group.set('properties', Em.A([])); - group.get('properties').push(newSCP); - newSCP.set('group', override.group); - newSCP.set('isEditable', false); - } - var parentOverridesArray = serviceConfigProperty.get('overrides'); - if (parentOverridesArray == null) { - parentOverridesArray = Em.A([]); - serviceConfigProperty.set('overrides', parentOverridesArray); - } - serviceConfigProperty.get('overrides').pushObject(newSCP); - }, this); - } else { - serviceConfigProperty.set('overrides', Em.A([])); + } + else { + serviceConfigProperty.set('isVisible', false); + } + return serviceConfigProperty; + }, + + /** + * Set configs with overrides, recommended defaults to component + * @param {Ember.Object[]} configs + * @param {Ember.Object} componentConfig + * @param {Ember.Object} component + * @method loadComponentConfigs + */ + loadComponentConfigs: function (configs, componentConfig, component) { + var s = this.get('serviceConfigsData').findProperty('serviceName', component.get('serviceName')), + defaultGroupSelected = component.get('selectedConfigGroup.isDefault'); + + if (s.configsValidator) { + var recommendedDefaults = this._getRecommendedDefaultsForComponent(component.get('serviceName')); + s.configsValidator.set('recommendedDefaults', recommendedDefaults); + } + + configs.forEach(function (serviceConfigProperty) { + if (!serviceConfigProperty) return; + + if (Em.isNone(serviceConfigProperty.get('isOverridable'))) { + serviceConfigProperty.set('isOverridable', true); } - if (App.get('isAdmin')) { - if(defaultGroupSelected && !this.get('isHostsConfigsPage')){ - serviceConfigProperty.set('isEditable', serviceConfigProperty.get('isReconfigurable')); - } else { - serviceConfigProperty.set('isEditable', false); - } - } else { - serviceConfigProperty.set('isEditable', false); + if (serviceConfigProperty.get('displayType') === 'checkbox') { + this._updateValueForCheckBoxConfig(serviceConfigProperty); } + this._updateValidatorsForConfig(serviceConfigProperty, component, s); + this._updateOverridesForConfig(serviceConfigProperty, component); + this._updateIsEditableFlagForConfig(serviceConfigProperty, defaultGroupSelected); + componentConfig.get('configs').pushObject(serviceConfigProperty); serviceConfigProperty.validate(); + }, this); + var overrideToAdd = this.get('overrideToAdd'); if (overrideToAdd) { - overrideToAdd = componentConfig.configs.findProperty('name', overrideToAdd.name); + overrideToAdd = componentConfig.get('configs').findProperty('name', overrideToAdd.name); if (overrideToAdd) { this.addOverrideProperty(overrideToAdd); component.set('overrideToAdd', null); @@ -431,17 +542,17 @@ App.WizardStep7Controller = Em.Controller.extend({ * @param {Ember.Enumerable} configs * @method resolveStormConfigs */ - resolveStormConfigs: function(configs) { + resolveStormConfigs: function (configs) { var dependentConfigs, gangliaServerHost; dependentConfigs = ['nimbus.childopts', 'supervisor.childopts', 'worker.childopts']; // if Ganglia selected or installed, set ganglia host to configs if (this.get('installedServiceNames').contains('STORM') && this.get('installedServiceNames').contains('GANGLIA')) return; if (this.get('allSelectedServiceNames').contains('GANGLIA') || this.get('installedServiceNames').contains('GANGLIA')) { gangliaServerHost = this.get('wizardController').getDBProperty('masterComponentHosts').findProperty('component', 'GANGLIA_SERVER').hostName; - dependentConfigs.forEach(function(configName) { + dependentConfigs.forEach(function (configName) { var config = configs.findProperty('name', configName); var replaceStr = '.jar=host='; - config.value = config.defaultValue = config.value.replace(replaceStr, replaceStr+gangliaServerHost); + config.value = config.defaultValue = config.value.replace(replaceStr, replaceStr + gangliaServerHost); config.forceUpdate = true; }, this); } @@ -501,7 +612,7 @@ App.WizardStep7Controller = Em.Controller.extend({ * and (if some services are already installed) load config groups for installed services * @method checkHostOverrideInstaller */ - checkHostOverrideInstaller: function() { + checkHostOverrideInstaller: function () { if (App.get('supports.hostOverridesInstaller')) { this.loadConfigGroups(this.get('content.configGroups')); if (this.get('installedServiceNames').length > 0) { @@ -518,7 +629,7 @@ App.WizardStep7Controller = Em.Controller.extend({ * @param {Ember.Object[]} storedConfigs * @method setStepConfigs */ - setStepConfigs: function(configs, storedConfigs) { + setStepConfigs: function (configs, storedConfigs) { var localDB = { hosts: this.get('wizardController').getDBProperty('hosts'), masterComponentHosts: this.get('wizardController').getDBProperty('masterComponentHosts'), @@ -528,8 +639,8 @@ App.WizardStep7Controller = Em.Controller.extend({ if (this.get('wizardController.name') === 'addServiceController') { serviceConfigs.setEach('showConfig', true); serviceConfigs.setEach('selected', false); - this.get('selectedServiceNames').forEach(function(serviceName) { - if(!serviceConfigs.findProperty('serviceName', serviceName)) return; + this.get('selectedServiceNames').forEach(function (serviceName) { + if (!serviceConfigs.findProperty('serviceName', serviceName)) return; serviceConfigs.findProperty('serviceName', serviceName).set('selected', true); }); @@ -537,7 +648,7 @@ App.WizardStep7Controller = Em.Controller.extend({ if (App.get('isHaEnabled')) { var c = serviceConfigs.findProperty('serviceName', 'HDFS').configs; var removedConfigs = c.filterProperty('category', 'SNameNode'); - removedConfigs.map(function(config) { + removedConfigs.map(function (config) { c = c.without(config); }); serviceConfigs.findProperty('serviceName', 'HDFS').configs = c; @@ -552,7 +663,7 @@ App.WizardStep7Controller = Em.Controller.extend({ * Select first service at all in other cases * @method selectProperService */ - selectProperService: function() { + selectProperService: function () { if (this.get('wizardController.name') === 'addServiceController') { this.set('selectedService', this.get('stepConfigs').filterProperty('selected', true).get('firstObject')); } @@ -566,7 +677,7 @@ App.WizardStep7Controller = Em.Controller.extend({ * @return {$.ajax|null} * @method getConfigTags */ - getConfigTags: function() { + getConfigTags: function () { return App.ajax.send({ name: 'config.tags.sync', sender: this, @@ -583,19 +694,21 @@ App.WizardStep7Controller = Em.Controller.extend({ getConfigTagsSuccess: function (data) { var installedServiceSites = []; this.get('serviceConfigsData').filter(function (service) { - if (this.get('installedServiceNames').contains(service.serviceName)){ + if (this.get('installedServiceNames').contains(service.serviceName)) { installedServiceSites = installedServiceSites.concat(service.sites); } }, this); installedServiceSites = installedServiceSites.uniq(); var serviceConfigTags = []; for (var site in data.Clusters.desired_configs) { - if (installedServiceSites.contains(site)) { - serviceConfigTags.push({ - siteName: site, - tagName: data.Clusters.desired_configs[site].tag, - newTagName: null - }); + if (data.Clusters.desired_configs.hasOwnProperty(site)) { + if (installedServiceSites.contains(site)) { + serviceConfigTags.push({ + siteName: site, + tagName: data.Clusters.desired_configs[site].tag, + newTagName: null + }); + } } } this.set('serviceConfigTags', serviceConfigTags); @@ -609,7 +722,7 @@ App.WizardStep7Controller = Em.Controller.extend({ */ setInstalledServiceConfigs: function (serviceConfigTags, configs) { var configsMap = {}; - App.router.get('configurationController').getConfigsByTags(serviceConfigTags).forEach(function(configSite){ + App.router.get('configurationController').getConfigsByTags(serviceConfigTags).forEach(function (configSite) { $.extend(configsMap, configSite.properties); }); configs.forEach(function (_config) { @@ -629,9 +742,9 @@ App.WizardStep7Controller = Em.Controller.extend({ * @param {Ember.Object[]} groups * @method setGroupsToDelete */ - setGroupsToDelete: function(groups) { + setGroupsToDelete: function (groups) { var groupsToDelete = this.get('groupsToDelete'); - groups.forEach(function(group) { + groups.forEach(function (group) { if (group.get('id')) groupsToDelete.push({ id: group.get('id') @@ -691,7 +804,7 @@ App.WizardStep7Controller = Em.Controller.extend({ serviceRawGroups.filterProperty('isDefault', false).forEach(function (configGroup) { var readyGroup = App.ConfigGroup.create(configGroup); var wrappedProperties = []; - readyGroup.get('properties').forEach(function(property){ + readyGroup.get('properties').forEach(function (property) { wrappedProperties.pushObject(App.ServiceConfigProperty.create(property)); }); wrappedProperties.setEach('group', readyGroup); @@ -725,7 +838,7 @@ App.WizardStep7Controller = Em.Controller.extend({ selectedGroup = this.get('selectedConfigGroup'), overrideToAdd = this.get('overrideToAdd'), overrides = []; - if(!selectedGroup) return; + if (!selectedGroup) return; var displayedConfigGroups = this._getDisplayedConfigGroups(); displayedConfigGroups.forEach(function (group) { @@ -743,7 +856,7 @@ App.WizardStep7Controller = Em.Controller.extend({ * @return {Array} * @method _getDisplayedConfigGroups */ - _getDisplayedConfigGroups: function() { + _getDisplayedConfigGroups: function () { var selectedGroup = this.get('selectedConfigGroup'); if (!selectedGroup) return []; return (selectedGroup.get('isDefault')) ? @@ -757,7 +870,7 @@ App.WizardStep7Controller = Em.Controller.extend({ * @return {Ember.Object} updated config-object * @method _setEditableValue */ - _setEditableValue: function(config) { + _setEditableValue: function (config) { var selectedGroup = this.get('selectedConfigGroup'); if (!selectedGroup) return config; var isEditable = config.get('isEditable'), @@ -779,7 +892,7 @@ App.WizardStep7Controller = Em.Controller.extend({ * @returns {Ember.Object} * @method _setOverrides */ - _setOverrides: function(config, overrides) { + _setOverrides: function (config, overrides) { var selectedGroup = this.get('selectedConfigGroup'), overrideToAdd = this.get('overrideToAdd'), configOverrides = overrides.filterProperty('name', config.get('name')); http://git-wip-us.apache.org/repos/asf/ambari/blob/4b0cd8fd/ambari-web/test/controllers/wizard/step7_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/controllers/wizard/step7_test.js b/ambari-web/test/controllers/wizard/step7_test.js index 52e00dd..b49c29c 100644 --- a/ambari-web/test/controllers/wizard/step7_test.js +++ b/ambari-web/test/controllers/wizard/step7_test.js @@ -870,7 +870,7 @@ describe('App.InstallerStep7Controller', function () { }) }); }); - afterEach(function() { + afterEach(function () { App.config.renderConfigs.restore(); }); it('if wizard isn\'t addService, should set output of App.config.renderConfigs', function () { @@ -897,8 +897,8 @@ describe('App.InstallerStep7Controller', function () { expect(installerStep7Controller.get('stepConfigs').findProperty('serviceName', 's2').get('selected')).to.equal(true); }); it('addServiceWizard used, HA enabled', function () { - sinon.stub(App, 'get', function(k) { - if(k === 'isHaEnabled') { + sinon.stub(App, 'get', function (k) { + if (k === 'isHaEnabled') { return true; } return Em.get(App, k); @@ -929,12 +929,12 @@ describe('App.InstallerStep7Controller', function () { }); }); - describe('#checkHostOverrideInstaller', function() { - beforeEach(function() { + describe('#checkHostOverrideInstaller', function () { + beforeEach(function () { sinon.stub(installerStep7Controller, 'loadConfigGroups', Em.K); sinon.stub(installerStep7Controller, 'loadInstalledServicesConfigGroups', Em.K); }); - afterEach(function() { + afterEach(function () { installerStep7Controller.loadConfigGroups.restore(); installerStep7Controller.loadInstalledServicesConfigGroups.restore(); App.get.restore(); @@ -976,9 +976,9 @@ describe('App.InstallerStep7Controller', function () { loadInstalledServicesConfigGroups: true } } - ]).forEach(function(test) { - it(test.m, function() { - sinon.stub(App, 'get', function(k) { + ]).forEach(function (test) { + it(test.m, function () { + sinon.stub(App, 'get', function (k) { if (k === 'supports.hostOverridesInstaller') return test.hostOverridesInstaller; return Em.get(App, k); }); @@ -1000,12 +1000,14 @@ describe('App.InstallerStep7Controller', function () { }); }); - describe('#loadStep', function() { - beforeEach(function() { + describe('#loadStep', function () { + beforeEach(function () { installerStep7Controller.reopen({ content: {services: []}, wizardController: Em.Object.create({ - getDBProperty: function(k) {return this.get(k);} + getDBProperty: function (k) { + return this.get(k); + } }) }); sinon.stub(App.config, 'mergePreDefinedWithStored', Em.K); @@ -1022,7 +1024,7 @@ describe('App.InstallerStep7Controller', function () { sinon.stub(installerStep7Controller, 'selectProperService', Em.K); sinon.stub(App.router, 'send', Em.K); }); - afterEach(function() { + afterEach(function () { App.config.mergePreDefinedWithStored.restore(); App.config.addAdvancedConfigs.restore(); App.config.addCustomConfigs.restore(); @@ -1037,16 +1039,16 @@ describe('App.InstallerStep7Controller', function () { installerStep7Controller.selectProperService.restore(); App.router.send.restore(); }); - it('should call clearStep', function() { + it('should call clearStep', function () { installerStep7Controller.loadStep(); expect(installerStep7Controller.clearStep.calledOnce).to.equal(true); }); - it('shouldn\'t do nothing if isAdvancedConfigLoaded is false', function() { + it('shouldn\'t do nothing if isAdvancedConfigLoaded is false', function () { installerStep7Controller.set('isAdvancedConfigLoaded', false); installerStep7Controller.loadStep(); expect(installerStep7Controller.clearStep.called).to.equal(false); }); - it('should use App.config to map configs', function() { + it('should use App.config to map configs', function () { installerStep7Controller.loadStep(); expect(App.config.mergePreDefinedWithStored.calledOnce).to.equal(true); expect(App.config.addAdvancedConfigs.calledOnce).to.equal(true); @@ -1075,14 +1077,14 @@ describe('App.InstallerStep7Controller', function () { } ]).forEach(function (test) { it('allSelectedServiceNames = ' + JSON.stringify(test.allSelectedServiceNames) + ', capacitySchedulerUi = ' + test.capacitySchedulerUi.toString(), function () { - sinon.stub(App, 'get', function(k) { + sinon.stub(App, 'get', function (k) { if (k === 'supports.capacitySchedulerUi') return test.capacitySchedulerUi; return Em.get(App, k); }); installerStep7Controller.reopen({allSelectedServiceNames: test.allSelectedServiceNames}); installerStep7Controller.loadStep(); if (test.e) { - expect(App.config.fileConfigsIntoTextarea.calledOnce).to.equal(true); + expect(App.config.fileConfigsIntoTextarea.calledOnce).to.equal(true); } else { expect(App.config.fileConfigsIntoTextarea.called).to.equal(false); @@ -1090,19 +1092,19 @@ describe('App.InstallerStep7Controller', function () { App.get.restore(); }); }); - it('should call getConfigTags, setInstalledServiceConfigs for addServiceController', function() { + it('should call getConfigTags, setInstalledServiceConfigs for addServiceController', function () { installerStep7Controller.set('wizardController.name', 'addServiceController'); installerStep7Controller.loadStep(); expect(installerStep7Controller.getConfigTags.calledOnce).to.equal(true); expect(installerStep7Controller.setInstalledServiceConfigs.calledOnce).to.equal(true); }); Em.A([ - { - allSelectedServiceNames: ['STORM'], - installedServiceNames: ['STORM'], - m: 'allSelectedServiceNames contains STORM, installedServiceNames contains STORM', - e: true - }, + { + allSelectedServiceNames: ['STORM'], + installedServiceNames: ['STORM'], + m: 'allSelectedServiceNames contains STORM, installedServiceNames contains STORM', + e: true + }, { allSelectedServiceNames: [], installedServiceNames: ['STORM'], @@ -1121,8 +1123,8 @@ describe('App.InstallerStep7Controller', function () { m: 'allSelectedServiceNames doesn\'t contain STORM, installedServiceNames doesn\'t contain STORM', e: false } - ]).forEach(function(test) { - it(test.m, function() { + ]).forEach(function (test) { + it(test.m, function () { installerStep7Controller.reopen({ allSelectedServiceNames: test.allSelectedServiceNames, installedServiceNames: test.installedServiceNames @@ -1136,19 +1138,19 @@ describe('App.InstallerStep7Controller', function () { } }); }); - it('should call setStepConfigs', function() { + it('should call setStepConfigs', function () { installerStep7Controller.loadStep(); expect(installerStep7Controller.setStepConfigs.calledOnce).to.equal(true); }); - it('should call checkHostOverrideInstaller', function() { + it('should call checkHostOverrideInstaller', function () { installerStep7Controller.loadStep(); expect(installerStep7Controller.checkHostOverrideInstaller.calledOnce).to.equal(true); }); - it('should call activateSpecialConfigs', function() { + it('should call activateSpecialConfigs', function () { installerStep7Controller.loadStep(); expect(installerStep7Controller.activateSpecialConfigs.calledOnce).to.equal(true); }); - it('should call selectProperService', function() { + it('should call selectProperService', function () { installerStep7Controller.loadStep(); expect(installerStep7Controller.selectProperService.calledOnce).to.equal(true); }); @@ -1163,17 +1165,306 @@ describe('App.InstallerStep7Controller', function () { skipConfigStep: false, e: false } - ]).forEach(function(test) { - it(test.m, function() { - installerStep7Controller.set('content.skipConfigStep', test.skipConfigStep); - installerStep7Controller.loadStep(); - if (test.e) { - expect(App.router.send.calledWith('next')).to.equal(true); + ]).forEach(function (test) { + it(test.m, function () { + installerStep7Controller.set('content.skipConfigStep', test.skipConfigStep); + installerStep7Controller.loadStep(); + if (test.e) { + expect(App.router.send.calledWith('next')).to.equal(true); + } + else { + expect(App.router.send.called).to.equal(false); + } + }); + }); + }); + + describe('#_updateValueForCheckBoxConfig', function () { + Em.A([ + { + v: 'true', + e: true + }, + { + v: 'false', + e: false } - else { - expect(App.router.send.called).to.equal(false); + ]).forEach(function (test) { + it(test.v, function () { + var serviceConfigProperty = Em.Object.create({value: test.v}); + installerStep7Controller._updateValueForCheckBoxConfig(serviceConfigProperty); + expect(serviceConfigProperty.get('value')).to.equal(test.e); + expect(serviceConfigProperty.get('defaultValue')).to.equal(test.e); + }); + }); + }); + + describe('#_updateIsEditableFlagForConfig', function () { + Em.A([ + { + isAdmin: false, + isReconfigurable: false, + isHostsConfigsPage: true, + defaultGroupSelected: false, + m: 'false for non-admin users', + e: false + }, + { + isAdmin: true, + isReconfigurable: false, + isHostsConfigsPage: true, + defaultGroupSelected: false, + m: 'false if defaultGroupSelected is false and isHostsConfigsPage is true', + e: false + }, + { + isAdmin: true, + isReconfigurable: false, + isHostsConfigsPage: true, + defaultGroupSelected: true, + m: 'false if defaultGroupSelected is true and isHostsConfigsPage is true', + e: false + }, + { + isAdmin: true, + isReconfigurable: false, + isHostsConfigsPage: false, + defaultGroupSelected: false, + m: 'false if defaultGroupSelected is false and isHostsConfigsPage is false', + e: false + }, + { + isAdmin: true, + isReconfigurable: true, + isHostsConfigsPage: false, + defaultGroupSelected: true, + m: 'equal to isReconfigurable if defaultGroupSelected is true and isHostsConfigsPage is false', + e: true } + ]).forEach(function (test) { + it(test.m, function () { + sinon.stub(App, 'get', function (k) { + if (k === 'isAdmin') return test.isAdmin; + return Em.get(App, k); + }); + installerStep7Controller.reopen({isHostsConfigsPage: test.isHostsConfigsPage}); + var serviceConfigProperty = Em.Object.create({ + isReconfigurable: test.isReconfigurable + }); + installerStep7Controller._updateIsEditableFlagForConfig(serviceConfigProperty, test.defaultGroupSelected); + App.get.restore(); + expect(serviceConfigProperty.get('isEditable')).to.equal(test.e); + }); }); + }); + + describe('#_updateOverridesForConfig', function () { + + it('should set empty array', function () { + var serviceConfigProperty = Em.Object.create({ + overrides: null + }), component = Em.Object.create(); + installerStep7Controller._updateOverridesForConfig(serviceConfigProperty, component); + expect(serviceConfigProperty.get('overrides')).to.eql(Em.A([])); + }); + + it('host overrides not supported', function () { + var serviceConfigProperty = Em.Object.create({ + overrides: [ + {value: 'new value'} + ] + }), component = Em.Object.create({selectedConfigGroup: {isDefault: false}}); + installerStep7Controller._updateOverridesForConfig(serviceConfigProperty, component); + expect(serviceConfigProperty.get('overrides').length).to.equal(1); + expect(serviceConfigProperty.get('overrides.firstObject.value')).to.equal('new value'); + expect(serviceConfigProperty.get('overrides.firstObject.isOriginalSCP')).to.equal(false); + expect(serviceConfigProperty.get('overrides.firstObject.parentSCP')).to.eql(serviceConfigProperty); + }); + + it('host overrides supported', function () { + sinon.stub(App, 'get', function (k) { + if (k === 'supports.hostOverrides') return true; + return Em.get(App, k); + }); + var serviceConfigProperty = Em.Object.create({ + overrides: [ + {value: 'new value', group: Em.Object.create({name: 'n1'})} + ] + }), + component = Em.Object.create({ + selectedConfigGroup: {isDefault: true}, + configGroups: Em.A([ + Em.Object.create({name: 'n1', properties: []}) + ]) + }); + installerStep7Controller._updateOverridesForConfig(serviceConfigProperty, component); + App.get.restore(); + expect(serviceConfigProperty.get('overrides').length).to.equal(1); + expect(serviceConfigProperty.get('overrides.firstObject.value')).to.equal('new value'); + expect(serviceConfigProperty.get('overrides.firstObject.isOriginalSCP')).to.equal(false); + expect(serviceConfigProperty.get('overrides.firstObject.parentSCP')).to.eql(serviceConfigProperty); + expect(component.get('configGroups.firstObject.properties').length).to.equal(1); + expect(component.get('configGroups.firstObject.properties.firstObject.isEditable')).to.equal(false); + expect(component.get('configGroups.firstObject.properties.firstObject.group')).to.be.object; + }); + + }); + + describe('#_updateValidatorsForConfig', function () { + + it('should set isVisible to false', function () { + var serviceConfigProperty = Em.Object.create({serviceName: 's1', isVisible: true}), + component = Em.Object.create({serviceName: 's2'}), + serviceConfigsData = {}; + installerStep7Controller._updateValidatorsForConfig(serviceConfigProperty, component, serviceConfigsData); + expect(serviceConfigProperty.get('isVisible')).to.equal(false); + }); + + it('should set serviceValidator', function () { + var serviceConfigProperty = Em.Object.create({serviceName: 's1', name: 'n1', serviceValidator: null}), + component = Em.Object.create({serviceName: 's1'}), + serviceConfigsData = { + configsValidator: Em.Object.create({ + configValidators: { + n1: {}, + n2: {} + } + }) + }; + installerStep7Controller._updateValidatorsForConfig(serviceConfigProperty, component, serviceConfigsData); + expect(serviceConfigProperty.get('serviceValidator')).to.be.object; + expect(Em.keys(serviceConfigProperty.get('serviceValidator.configValidators'))).to.eql(['n1', 'n2']); + }); + + }); + + describe('#getRecommendedDefaultsForComponent', function () { + beforeEach(function () { + sinon.stub(App.router, 'get', function (k) { + if (k === 'mainServiceInfoConfigsController') return Em.Object.create({ + getInfoForDefaults: Em.K + }); + return Em.get(App.router, k); + }); + }); + afterEach(function () { + App.router.get.restore(); + }); + it('should return empty object', function () { + var serviceConfigsData = [ + {serviceName: 's1'} + ], + serviceName = 's1'; + installerStep7Controller.reopen({serviceConfigsData: serviceConfigsData}); + var r = installerStep7Controller._getRecommendedDefaultsForComponent(serviceName); + expect(r).to.eql({}); + }); + + it('should return recommendedDefaults', function () { + var serviceConfigsData = [ + {serviceName: 's1', defaultsProviders: [ + {getDefaults: function () { + return {c1: 'v1', c2: 'v2'}; + }}, + {getDefaults: function () { + return {c3: 'v3', c4: 'v4'}; + }} + ]} + ], + serviceName = 's1'; + installerStep7Controller.reopen({serviceConfigsData: serviceConfigsData}); + var r = installerStep7Controller._getRecommendedDefaultsForComponent(serviceName); + expect(r).to.eql({c1: 'v1', c2: 'v2', c3: 'v3', c4: 'v4'}); + }); + + }); + + describe('#loadComponentConfigs', function () { + + beforeEach(function () { + sinon.stub(installerStep7Controller, '_updateValidatorsForConfig', Em.K); + sinon.stub(installerStep7Controller, '_updateOverridesForConfig', Em.K); + sinon.stub(installerStep7Controller, '_updateIsEditableFlagForConfig', Em.K); + }); + + afterEach(function () { + installerStep7Controller._updateIsEditableFlagForConfig.restore(); + installerStep7Controller._updateOverridesForConfig.restore(); + installerStep7Controller._updateValidatorsForConfig.restore(); + }); + + it('should set recommended defaults', function () { + var configs = [], + serviceConfigsData = [ + {serviceName: 's1', configsValidator: Em.Object.create({recommendedDefaults: {}})} + ], + component = Em.Object.create({serviceName: 's1'}), + componentConfig = {}, + recommendedDefaults = {c1: 'v1', c2: 'v2'}; + installerStep7Controller.reopen({serviceConfigsData: serviceConfigsData}); + sinon.stub(installerStep7Controller, '_getRecommendedDefaultsForComponent', function () { + return recommendedDefaults; + }); + installerStep7Controller.loadComponentConfigs(configs, componentConfig, component); + installerStep7Controller._getRecommendedDefaultsForComponent.restore(); + expect(installerStep7Controller.get('serviceConfigsData.firstObject.configsValidator.recommendedDefaults')).to.eql(recommendedDefaults); + }); + + it('should skip null configs', function () { + var configs = [null, null, null], + serviceConfigsData = [ + {serviceName: 's1'} + ], + component = Em.Object.create({serviceName: 's1'}), + componentConfig = Em.Object.create({configs: []}); + installerStep7Controller.reopen({serviceConfigsData: serviceConfigsData}); + installerStep7Controller.loadComponentConfigs(configs, componentConfig, component); + expect(componentConfig.get('configs.length')).to.equal(0); + }); + + it('should update isOverridable flag', function () { + var configs = [Em.Object.create({validate: Em.K}), Em.Object.create({validate: Em.K})], + componentConfig = Em.Object.create({configs: []}), + serviceConfigsData = [ + {serviceName: 's1'} + ], + component = Em.Object.create({serviceName: 's1'}); + installerStep7Controller.reopen({serviceConfigsData: serviceConfigsData}); + installerStep7Controller.loadComponentConfigs(configs, componentConfig, component); + expect(componentConfig.get('configs').getEach('isOverridable')).to.eql([true, true]); + }); + + it('should update value for checkboxes', function () { + var configs = [ + Em.Object.create({displayType: 'checkbox', value: 'true', validate: Em.K}), + Em.Object.create({displayType: 'checkbox', value: 'false', validate: Em.K}) + ], + componentConfig = Em.Object.create({configs: []}), + serviceConfigsData = [ + {serviceName: 's1'} + ], + component = Em.Object.create({serviceName: 's1'}); + installerStep7Controller.reopen({serviceConfigsData: serviceConfigsData}); + installerStep7Controller.loadComponentConfigs(configs, componentConfig, component); + expect(componentConfig.get('configs').getEach('value')).to.eql([true, false]); + expect(componentConfig.get('configs').getEach('defaultValue')).to.eql([true, false]); + }); + + }); + + describe('#_createSiteToTagMap', function () { + it('should map sites', function () { + var desired_configs = { + s1: {tag: 't1'}, + s2: {tag: 't1'}, + s3: {tag: 't3'}, + s4: {tag: 't1'}, + s5: {tag: 't2'} + }, + sites = ['s1', 's2', 's3'], + expected = {s1: 't1', s2: 't1', s3: 't3'}; + var r = installerStep7Controller._createSiteToTagMap(desired_configs, sites); + expect(r).to.eql(expected); }); });
