Repository: ambari Updated Branches: refs/heads/trunk 1f48b24fe -> a82633457
AMBARI-7034 Update UI unit tests for models. (atkach) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/a8263345 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/a8263345 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/a8263345 Branch: refs/heads/trunk Commit: a82633457b56667238d1824b6d901b1a85b530ca Parents: 1f48b24 Author: atkach <atk...@hortonworks.com> Authored: Wed Aug 27 15:01:58 2014 +0300 Committer: atkach <atk...@hortonworks.com> Committed: Wed Aug 27 15:01:58 2014 +0300 ---------------------------------------------------------------------- ambari-web/app/assets/test/tests.js | 2 + ambari-web/app/models/host_component.js | 28 +- ambari-web/app/models/stack_service.js | 3 +- ambari-web/test/models/host_component_test.js | 212 ++++++++++- ambari-web/test/models/host_test.js | 357 ++++++++++++++++++- ambari-web/test/models/service_test.js | 59 +-- ambari-web/test/models/stack_service_test.js | 343 ++++++++++++++++++ .../common/configs/config_history_flow_test.js | 22 +- 8 files changed, 969 insertions(+), 57 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/a8263345/ambari-web/app/assets/test/tests.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/assets/test/tests.js b/ambari-web/app/assets/test/tests.js index 985da16..8634d34 100644 --- a/ambari-web/app/assets/test/tests.js +++ b/ambari-web/app/assets/test/tests.js @@ -193,6 +193,8 @@ var files = ['test/init_model_test', 'test/models/run_test', 'test/models/service_config_test', 'test/models/stack_service_component_test', + 'test/models/service_test', + 'test/models/stack_service_test', 'test/models/user_test' ]; App.initialize(); http://git-wip-us.apache.org/repos/asf/ambari/blob/a8263345/ambari-web/app/models/host_component.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/models/host_component.js b/ambari-web/app/models/host_component.js index b437d26..73fc852 100644 --- a/ambari-web/app/models/host_component.js +++ b/ambari-web/app/models/host_component.js @@ -32,7 +32,7 @@ App.HostComponent = DS.Model.extend({ * Determine if component is client * @returns {bool} */ - isClient:function () { + isClient: function () { return App.get('components.clients').contains(this.get('componentName')); }.property('componentName'), /** @@ -40,7 +40,7 @@ App.HostComponent = DS.Model.extend({ * Based on <code>workStatus</code> * @returns {bool} */ - isRunning: function(){ + isRunning: function () { return (this.get('workStatus') == 'STARTED' || this.get('workStatus') == 'STARTING'); }.property('workStatus'), @@ -64,17 +64,17 @@ App.HostComponent = DS.Model.extend({ * Determine if component is slave * @returns {bool} */ - isSlave: function(){ + isSlave: function () { return App.get('components.slaves').contains(this.get('componentName')); }.property('componentName'), /** * Only certain components can be deleted. - * They include some from master components, - * some from slave components, and rest from + * They include some from master components, + * some from slave components, and rest from * client components. * @returns {bool} */ - isDeletable: function() { + isDeletable: function () { return App.get('components.deletable').contains(this.get('componentName')); }.property('componentName'), /** @@ -98,19 +98,19 @@ App.HostComponent = DS.Model.extend({ * User friendly host component status * @returns {String} */ - isActive: function() { + isActive: function () { return (this.get('passiveState') == 'OFF'); }.property('passiveState'), - passiveTooltip: function() { + passiveTooltip: function () { if (!this.get('isActive')) { return Em.I18n.t('hosts.component.passive.mode'); } }.property('isActive'), - statusClass: function() { + statusClass: function () { return this.get('isActive') ? this.get('workStatus') : 'icon-medkit'; - }.property('workStatus','isActive'), + }.property('workStatus', 'isActive'), statusIconClass: function () { switch (this.get('statusClass')) { @@ -133,7 +133,7 @@ App.HostComponent = DS.Model.extend({ componentTextStatus: function () { return App.HostComponentStatus.getTextStatus(this.get("workStatus")); - }.property('workStatus','isDecommissioning') + }.property('workStatus', 'isDecommissioning') }); App.HostComponent.FIXTURES = []; @@ -155,8 +155,8 @@ App.HostComponentStatus = { * @param {String} value * @returns {String} */ - getKeyName:function(value){ - switch(value){ + getKeyName: function (value) { + switch (value) { case this.started: return 'started'; case this.starting: @@ -213,7 +213,7 @@ App.HostComponentStatus = { * Get list of possible <code>App.HostComponent</code> statuses * @returns {String[]} */ - getStatusesList: function() { + getStatusesList: function () { var ret = []; for (var st in this) { if (this.hasOwnProperty(st) && Em.typeOf(this[st]) == 'string') { http://git-wip-us.apache.org/repos/asf/ambari/blob/a8263345/ambari-web/app/models/stack_service.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/models/stack_service.js b/ambari-web/app/models/stack_service.js index 2baf65a..7c69804 100644 --- a/ambari-web/app/models/stack_service.js +++ b/ambari-web/app/models/stack_service.js @@ -113,7 +113,7 @@ App.StackService = DS.Model.extend({ serviceDependencyMap = App.StackService.dependency['HDP-1']; } for (key in serviceDependencyMap) { - if (serviceDependencyMap[key].contains(serviceName)) serviceDependencies.pushObject(key); + if (serviceDependencyMap[key].contains(serviceName)) serviceDependencies.push(key); } return serviceDependencies; }.property('serviceName'), @@ -178,7 +178,6 @@ App.StackService = DS.Model.extend({ */ configCategories: function () { var configCategories = []; - var serviceName = this.get('serviceName'); var configTypes = this.get('configTypes'); var serviceComponents = this.get('serviceComponents'); if (configTypes && Object.keys(configTypes).length) { http://git-wip-us.apache.org/repos/asf/ambari/blob/a8263345/ambari-web/test/models/host_component_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/models/host_component_test.js b/ambari-web/test/models/host_component_test.js index f9f14a0..8e7cedf 100644 --- a/ambari-web/test/models/host_component_test.js +++ b/ambari-web/test/models/host_component_test.js @@ -19,10 +19,24 @@ var App = require('app'); require('models/host_component'); -describe('App.HostComponentStatus', function() { +describe('App.HostComponent', function() { + + App.store.load(App.HostComponent, { + id: 'COMP_host', + component_name: 'COMP1' + }); + var hc = App.HostComponent.find('COMP_host'); + describe('#getStatusesList', function() { + it('allowed statuses', function() { + var statuses = ["STARTED","STARTING","INSTALLED","STOPPING","INSTALL_FAILED","INSTALLING","UPGRADE_FAILED","UNKNOWN","DISABLED","INIT"]; + expect(App.HostComponentStatus.getStatusesList()).to.include.members(statuses); + expect(statuses).to.include.members(App.HostComponentStatus.getStatusesList()); + }); + }); + describe('#getStatusesList', function() { it('allowed statuses', function() { var statuses = ["STARTED","STARTING","INSTALLED","STOPPING","INSTALL_FAILED","INSTALLING","UPGRADE_FAILED","UNKNOWN","DISABLED","INIT"]; expect(App.HostComponentStatus.getStatusesList()).to.include.members(statuses); @@ -30,4 +44,200 @@ describe('App.HostComponentStatus', function() { }); }); + describe('#isClient', function() { + it('', function() { + sinon.stub(App.get('components.clients'), 'contains', Em.K); + hc.propertyDidChange('isClient'); + hc.get('isClient'); + expect(App.get('components.clients').contains.calledWith('COMP1')).to.be.true; + App.get('components.clients').contains.restore(); + }); + }); + + describe('#displayName', function() { + it('', function() { + sinon.stub(App.format, 'role', Em.K); + hc.propertyDidChange('displayName'); + hc.get('displayName'); + expect(App.format.role.calledWith('COMP1')).to.be.true; + App.format.role.restore(); + }); + }); + + describe('#isMaster', function() { + it('', function() { + sinon.stub(App.get('components.masters'), 'contains', Em.K); + hc.propertyDidChange('isMaster'); + hc.get('isMaster'); + expect(App.get('components.masters').contains.calledWith('COMP1')).to.be.true; + App.get('components.masters').contains.restore(); + }); + }); + + describe('#isSlave', function() { + it('', function() { + sinon.stub(App.get('components.slaves'), 'contains', Em.K); + hc.propertyDidChange('isSlave'); + hc.get('isSlave'); + expect(App.get('components.slaves').contains.calledWith('COMP1')).to.be.true; + App.get('components.slaves').contains.restore(); + }); + }); + + describe('#isDeletable', function() { + it('', function() { + sinon.stub(App.get('components.deletable'), 'contains', Em.K); + hc.propertyDidChange('isDeletable'); + hc.get('isDeletable'); + expect(App.get('components.deletable').contains.calledWith('COMP1')).to.be.true; + App.get('components.deletable').contains.restore(); + }); + }); + + describe('#isRunning', function() { + var testCases = [ + { + workStatus: 'INSTALLED', + result: false + }, + { + workStatus: 'STARTING', + result: true + }, + { + workStatus: 'STARTED', + result: true + } + ]; + testCases.forEach(function(test){ + it('workStatus - ' + test.workStatus, function() { + hc.set('workStatus', test.workStatus); + hc.propertyDidChange('isRunning'); + expect(hc.get('isRunning')).to.equal(test.result); + }); + }); + }); + + describe('#isDecommissioning', function() { + var mock = []; + beforeEach(function () { + sinon.stub(App.HDFSService, 'find', function () { + return mock; + }) + }); + afterEach(function () { + App.HDFSService.find.restore(); + }); + it('component name is not DATANODE', function() { + hc.propertyDidChange('isDecommissioning'); + expect(hc.get('isDecommissioning')).to.be.false; + }); + it('component name is DATANODE but no HDFS service', function() { + hc.set('componentName', 'DATANODE'); + hc.propertyDidChange('isDecommissioning'); + expect(hc.get('isDecommissioning')).to.be.false; + }); + it('HDFS has no decommission DataNodes', function() { + hc.set('componentName', 'DATANODE'); + mock.push(Em.Object.create({ + decommissionDataNodes: [] + })); + hc.propertyDidChange('isDecommissioning'); + expect(hc.get('isDecommissioning')).to.be.false; + }); + it('HDFS has decommission DataNodes', function() { + hc.set('componentName', 'DATANODE'); + hc.set('hostName', 'host1'); + mock.clear(); + mock.push(Em.Object.create({ + decommissionDataNodes: [{hostName: 'host1'}] + })); + hc.propertyDidChange('isDecommissioning'); + expect(hc.get('isDecommissioning')).to.be.true; + }); + }); + + describe('#isActive', function() { + it('passiveState is ON', function() { + hc.set('passiveState', "ON"); + hc.propertyDidChange('isActive'); + expect(hc.get('isActive')).to.be.false; + }); + it('passiveState is OFF', function() { + hc.set('passiveState', "OFF"); + hc.propertyDidChange('isActive'); + expect(hc.get('isActive')).to.be.true; + }); + }); + + describe('#statusClass', function() { + it('isActive is false', function() { + hc.reopen({ + isActive: false + }); + hc.propertyDidChange('statusClass'); + expect(hc.get('statusClass')).to.equal('icon-medkit'); + }); + it('isActive is true', function() { + var status = 'INSTALLED'; + hc.set('isActive', true); + hc.set('workStatus', status); + hc.propertyDidChange('statusClass'); + expect(hc.get('statusClass')).to.equal(status); + }); + }); + + describe('#statusIconClass', function () { + var testCases = [ + { + statusClass: 'STARTED', + result: 'icon-ok-sign' + }, + { + statusClass: 'STARTING', + result: 'icon-ok-sign' + }, + { + statusClass: 'INSTALLED', + result: 'icon-warning-sign' + }, + { + statusClass: 'STOPPING', + result: 'icon-warning-sign' + }, + { + statusClass: 'UNKNOWN', + result: 'icon-question-sign' + }, + { + statusClass: '', + result: '' + } + ]; + + it('reset statusClass to plain property', function () { + hc.reopen({ + statusClass: '' + }) + }); + testCases.forEach(function (test) { + it('statusClass - ' + test.statusClass, function () { + hc.set('statusClass', test.statusClass); + hc.propertyDidChange('statusIconClass'); + expect(hc.get('statusIconClass')).to.equal(test.result); + }); + }); + }); + + describe('#componentTextStatus', function() { + it('', function() { + var status = 'INSTALLED'; + sinon.stub(App.HostComponentStatus, 'getTextStatus', Em.K); + hc.set('workStatus', status); + hc.propertyDidChange('componentTextStatus'); + hc.get('componentTextStatus'); + expect(App.HostComponentStatus.getTextStatus.calledWith(status)).to.be.true; + App.HostComponentStatus.getTextStatus.restore(); + }); + }); }); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/a8263345/ambari-web/test/models/host_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/models/host_test.js b/ambari-web/test/models/host_test.js index 26144d7..674496d 100644 --- a/ambari-web/test/models/host_test.js +++ b/ambari-web/test/models/host_test.js @@ -17,6 +17,7 @@ */ var App = require('app'); +var misc = require('utils/misc'); require('models/host'); @@ -54,13 +55,17 @@ describe('App.Host', function () { before(function() { App.set('testMode', false); }); + App.Host.reopen({ + hostComponents: [] + }); App.store.loadMany(App.Host, data); + var host1 = App.Host.find('host1'); + describe('#diskUsedFormatted', function () { it('host1 - 10GB ', function () { - var host = App.Host.find().findProperty('hostName', 'host1'); - expect(host.get('diskUsedFormatted')).to.equal('10GB'); + expect(host1.get('diskUsedFormatted')).to.equal('10GB'); }); it('host2 - 0GB', function () { var host = App.Host.find().findProperty('hostName', 'host2'); @@ -75,8 +80,7 @@ describe('App.Host', function () { describe('#diskTotalFormatted', function () { it('host1 - 100.56GB ', function () { - var host = App.Host.find().findProperty('hostName', 'host1'); - expect(host.get('diskTotalFormatted')).to.equal('100.56GB'); + expect(host1.get('diskTotalFormatted')).to.equal('100.56GB'); }); it('host2 - 90GB', function () { var host = App.Host.find().findProperty('hostName', 'host2'); @@ -91,8 +95,7 @@ describe('App.Host', function () { describe('#diskUsageFormatted', function () { it('host1 - 9.94% ', function () { - var host = App.Host.find().findProperty('hostName', 'host1'); - expect(host.get('diskUsageFormatted')).to.equal('9.94%'); + expect(host1.get('diskUsageFormatted')).to.equal('9.94%'); }); it('host2 - 0%', function () { var host = App.Host.find().findProperty('hostName', 'host2'); @@ -115,4 +118,346 @@ describe('App.Host', function () { }); }); + describe('#cpuUsage', function () { + var testCases = [ + { + params: { + cpuSystem: undefined, + cpuUser: undefined + }, + result: 0 + }, + { + params: { + cpuSystem: 0, + cpuUser: 0 + }, + result: 0 + }, + { + params: { + cpuSystem: 1, + cpuUser: 0 + }, + result: 0 + }, + { + params: { + cpuSystem: 0, + cpuUser: 1 + }, + result: 0 + }, + { + params: { + cpuSystem: 1, + cpuUser: 1 + }, + result: 2 + } + ]; + testCases.forEach(function (test) { + it('cpuSystem - ' + test.params.cpuSystem + ', cpuUser - ' + test.params.cpuUser, function () { + host1.set('cpuSystem', test.params.cpuSystem); + host1.set('cpuUser', test.params.cpuUser); + host1.propertyDidChange('cpuUsage'); + + expect(host1.get('cpuUsage')).to.equal(test.result); + }); + }); + }); + + describe('#memoryUsage', function () { + var testCases = [ + { + params: { + memFree: undefined, + memTotal: undefined + }, + result: 0 + }, + { + params: { + memFree: 0, + memTotal: 0 + }, + result: 0 + }, + { + params: { + memFree: 1, + memTotal: 0 + }, + result: 0 + }, + { + params: { + memFree: 0, + memTotal: 1 + }, + result: 0 + }, + { + params: { + memFree: 1, + memTotal: 2 + }, + result: 50 + } + ]; + testCases.forEach(function (test) { + it('memFree - ' + test.params.memFree + ', memTotal - ' + test.params.memTotal, function () { + host1.set('memFree', test.params.memFree); + host1.set('memTotal', test.params.memTotal); + host1.propertyDidChange('memoryUsage'); + + expect(host1.get('memoryUsage')).to.equal(test.result); + }); + }); + }); + + describe('#componentsWithStaleConfigs', function () { + it('One component with stale configs', function () { + host1.set('hostComponents', [Em.Object.create({ + staleConfigs: true + })]); + host1.propertyDidChange('componentsWithStaleConfigs'); + expect(host1.get('componentsWithStaleConfigs')).to.eql([Em.Object.create({ + staleConfigs: true + })]); + }); + it('No components with stale configs', function () { + host1.set('hostComponents', [Em.Object.create({ + staleConfigs: false + })]); + host1.propertyDidChange('componentsWithStaleConfigs'); + expect(host1.get('componentsWithStaleConfigs')).to.be.empty; + }); + }); + + describe('#componentsInPassiveStateCount', function () { + it('No component in passive state', function () { + host1.set('hostComponents', [Em.Object.create({ + passiveState: 'OFF' + })]); + host1.propertyDidChange('componentsInPassiveStateCount'); + + expect(host1.get('componentsInPassiveStateCount')).to.equal(0); + }); + it('One component in passive state', function () { + host1.set('hostComponents', [Em.Object.create({ + passiveState: 'ON' + })]); + host1.propertyDidChange('componentsInPassiveStateCount'); + + expect(host1.get('componentsInPassiveStateCount')).to.equal(1); + }); + }); + + describe('#disksMounted', function () { + it('', function () { + host1.set('diskInfo', [ + {} + ]); + host1.propertyDidChange('disksMounted'); + expect(host1.get('disksMounted')).to.equal(1); + }); + }); + + describe('#coresFormatted', function () { + it('', function () { + host1.set('cpu', 1); + host1.set('cpuPhysical', 2); + host1.propertyDidChange('coresFormatted'); + expect(host1.get('coresFormatted')).to.equal('1 (2)'); + }); + }); + + describe('#diskUsed', function () { + it('diskFree and diskTotal are 0', function () { + host1.set('diskFree', 0); + host1.set('diskTotal', 0); + host1.propertyDidChange('diskUsed'); + expect(host1.get('diskUsed')).to.equal(0); + }); + it('diskFree is 0 and diskTotal is 10', function () { + host1.set('diskFree', 0); + host1.set('diskTotal', 10); + host1.propertyDidChange('diskUsed'); + expect(host1.get('diskUsed')).to.equal(10); + }); + }); + + describe('#diskUsage', function () { + it('', function () { + host1.reopen({ + diskUsed: 10 + }); + host1.set('diskTotal', 100); + host1.propertyDidChange('diskUsage'); + expect(host1.get('diskUsage')).to.equal(10); + }); + }); + + describe('#memoryFormatted', function () { + it('', function () { + host1.set('memory', 1024); + sinon.stub(misc, 'formatBandwidth', Em.K); + host1.propertyDidChange('memoryFormatted'); + host1.get('memoryFormatted'); + expect(misc.formatBandwidth.calledWith(1048576)).to.be.true; + misc.formatBandwidth.restore() + }); + }); + + describe('#loadAvg', function () { + var testCases = [ + { + params: { + loadOne: null, + loadFive: null, + loadFifteen: null + }, + result: null + }, + { + params: { + loadOne: 1.111, + loadFive: 5.555, + loadFifteen: 15.555 + }, + result: '1.11' + }, + { + params: { + loadOne: null, + loadFive: 5.555, + loadFifteen: 15.555 + }, + result: '5.55' + }, + { + params: { + loadOne: null, + loadFive: null, + loadFifteen: 15.555 + }, + result: '15.55' + } + ]; + + testCases.forEach(function (test) { + it('loadOne - ' + test.params.loadOne + ', loadFive - ' + test.params.loadFive + ', loadFifteen - ' + test.params.loadFifteen, function () { + host1.set('loadOne', test.params.loadOne); + host1.set('loadFive', test.params.loadFive); + host1.set('loadFifteen', test.params.loadFifteen); + host1.propertyDidChange('loadAvg'); + expect(host1.get('loadAvg')).to.equal(test.result); + }); + }); + }); + + describe('#healthClass', function () { + var testCases = [ + { + params: { + passiveState: 'ON', + healthStatus: null + }, + result: 'icon-medkit' + }, + { + params: { + passiveState: 'OFF', + healthStatus: 'UNKNOWN' + }, + result: 'health-status-DEAD-YELLOW' + }, + { + params: { + passiveState: 'OFF', + healthStatus: 'HEALTHY' + }, + result: 'health-status-LIVE' + }, + { + params: { + passiveState: 'OFF', + healthStatus: 'UNHEALTHY' + }, + result: 'health-status-DEAD-RED' + }, + { + params: { + passiveState: 'OFF', + healthStatus: 'ALERT' + }, + result: 'health-status-DEAD-ORANGE' + }, + { + params: { + passiveState: 'OFF', + healthStatus: null + }, + result: 'health-status-DEAD-YELLOW' + } + ]; + + testCases.forEach(function (test) { + it('passiveState - ' + test.params.passiveState + ', healthStatus - ' + test.params.healthStatus, function () { + host1.set('passiveState', test.params.passiveState); + host1.set('healthStatus', test.params.healthStatus); + host1.propertyDidChange('healthClass'); + expect(host1.get('healthClass')).to.equal(test.result); + }); + }); + }); + + describe('#healthIconClass', function () { + var testCases = [ + { + params: { + healthClass: 'health-status-LIVE' + }, + result: 'icon-ok-sign' + }, + { + params: { + healthClass: 'health-status-DEAD-RED' + }, + result: 'icon-warning-sign' + }, + { + params: { + healthClass: 'health-status-DEAD-YELLOW' + }, + result: 'icon-question-sign' + }, + { + params: { + healthClass: 'health-status-DEAD-ORANGE' + }, + result: 'icon-minus-sign' + }, + { + params: { + healthClass: '' + }, + result: '' + } + ]; + + it('reset healthClass to plain property', function(){ + host1.reopen({ + healthClass: '' + }); + }); + testCases.forEach(function (test) { + it('healthClass - ' + test.params.healthClass, function () { + host1.set('healthClass', test.params.healthClass); + host1.propertyDidChange('healthIconClass'); + expect(host1.get('healthIconClass')).to.equal(test.result); + }); + }); + }); }); http://git-wip-us.apache.org/repos/asf/ambari/blob/a8263345/ambari-web/test/models/service_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/models/service_test.js b/ambari-web/test/models/service_test.js index 204badc..2467932 100644 --- a/ambari-web/test/models/service_test.js +++ b/ambari-web/test/models/service_test.js @@ -225,32 +225,6 @@ describe('App.Service', function () { }); }); - describe('#isClientsOnly', function () { - clientsOnly.forEach(function (item) { - it('should be true', function () { - service.set('serviceName', item); - expect(service.get('isClientsOnly')).to.be.true; - }); - }); - it('should be false', function () { - service.set('serviceName', 'HDFS'); - expect(service.get('isClientsOnly')).to.be.false; - }); - }); - - describe('#isConfigurable', function () { - configurable.forEach(function (item) { - it('should be true', function () { - service.set('serviceName', item); - expect(service.get('isConfigurable')).to.be.true; - }); - }); - it('should be false', function () { - service.set('serviceName', 'SQOOP'); - expect(service.get('isConfigurable')).to.be.false; - }); - }); - describe('#isRestartRequired', function () { hostComponentsDataFalse.forEach(function (item) { it('should be false', function () { @@ -279,4 +253,37 @@ describe('App.Service', function () { }); }); + describe('#serviceTypes', function () { + var testCases = [ + { + serviceName: 'PIG', + result: [] + }, + { + serviceName: 'GANGLIA', + result: ['MONITORING'] + }, + { + serviceName: 'NAGIOS', + result: ['MONITORING'] + }, + { + serviceName: 'HDFS', + result: ['HA_MODE'] + }, + { + serviceName: 'YARN', + result: ['HA_MODE'] + } + ]; + testCases.forEach(function (test) { + it('service name - ' + test.serviceName, function () { + service.set('serviceName', test.serviceName); + service.propertyDidChange('serviceTypes'); + expect(service.get('serviceTypes')).to.eql(test.result); + }); + }); + }); + + }); http://git-wip-us.apache.org/repos/asf/ambari/blob/a8263345/ambari-web/test/models/stack_service_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/models/stack_service_test.js b/ambari-web/test/models/stack_service_test.js new file mode 100644 index 0000000..07b4d66 --- /dev/null +++ b/ambari-web/test/models/stack_service_test.js @@ -0,0 +1,343 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var App = require('app'); + +require('models/stack_service'); + +describe('App.StackService', function () { + + App.store.load(App.StackService, { + id: 'S1' + }); + + var ss = App.StackService.find('S1'); + ss.reopen({ + serviceComponents: [] + }); + + describe('#isDFS', function () { + it('service name is "SERVICE"', function () { + ss.set('serviceName', 'SERVICE'); + ss.propertyDidChange('isDFS'); + expect(ss.get('isDFS')).to.be.false; + }); + it('service name is "HDFS"', function () { + ss.set('serviceName', 'HDFS'); + ss.propertyDidChange('isDFS'); + expect(ss.get('isDFS')).to.be.true; + }); + it('service name is "GLUSTERFS"', function () { + ss.set('serviceName', 'GLUSTERFS'); + ss.propertyDidChange('isDFS'); + expect(ss.get('isDFS')).to.be.true; + }); + }); + + describe('#isPrimaryDFS', function () { + it('service name is "SERVICE"', function () { + ss.set('serviceName', 'SERVICE'); + ss.propertyDidChange('isPrimaryDFS'); + expect(ss.get('isPrimaryDFS')).to.be.false; + }); + it('service name is "HDFS"', function () { + ss.set('serviceName', 'HDFS'); + ss.propertyDidChange('isPrimaryDFS'); + expect(ss.get('isPrimaryDFS')).to.be.true; + }); + }); + + describe('#configTypesRendered', function () { + ss.set('configTypes', { + 'core-site': {}, + 'hdfs-site': {} + }); + it('service name is "SERVICE"', function () { + ss.set('serviceName', 'SERVICE'); + ss.propertyDidChange('configTypesRendered'); + expect(ss.get('configTypesRendered')).to.eql({'hdfs-site': {}}); + }); + it('service name is "GLUSTERFS"', function () { + ss.set('serviceName', 'GLUSTERFS'); + ss.propertyDidChange('configTypesRendered'); + expect(ss.get('configTypesRendered')).to.eql({'core-site': {}, 'hdfs-site': {}}); + }); + it('service name is "HDFS"', function () { + ss.set('serviceName', 'HDFS'); + ss.propertyDidChange('configTypesRendered'); + expect(ss.get('configTypesRendered')).to.eql({'core-site': {}, 'hdfs-site': {}}); + }); + }); + + describe('#displayNameOnSelectServicePage', function () { + it('No coSelectedServices', function () { + ss.set('serviceName', 'HDFS'); + ss.set('displayName', 'HDFS'); + ss.propertyDidChange('displayNameOnSelectServicePage'); + expect(ss.get('displayNameOnSelectServicePage')).to.equal('HDFS'); + }); + it('Present coSelectedServices', function () { + ss.set('serviceName', 'YARN'); + ss.set('displayName', 'YARN'); + ss.propertyDidChange('displayNameOnSelectServicePage'); + expect(ss.get('displayNameOnSelectServicePage')).to.equal('YARN + MapReduce2'); + }); + }); + + describe('#isHiddenOnSelectServicePage', function () { + var testCases = [ + { + serviceName: 'HDFS', + result: false + }, + { + serviceName: 'MAPREDUCE2', + result: true + }, + { + serviceName: 'HCATALOG', + result: true + }, + { + serviceName: 'WEBHCAT', + result: true + } + ]; + + testCases.forEach(function (test) { + it('service name - ' + test.serviceName, function () { + ss.set('serviceName', test.serviceName); + ss.propertyDidChange('isHiddenOnSelectServicePage'); + expect(ss.get('isHiddenOnSelectServicePage')).to.equal(test.result); + }); + }); + }); + + describe('#dependentServices', function () { + var mock = { + isHadoop2Stack: false + }; + beforeEach(function () { + sinon.stub(App, 'get', function () { + return mock.isHadoop2Stack; + }) + }); + afterEach(function () { + App.get.restore(); + }); + it('isHadoop2Stack is false', function () { + ss.set('serviceName', 'HDFS'); + ss.propertyDidChange('dependentServices'); + expect(ss.get('dependentServices')).to.eql(['MAPREDUCE', 'HBASE', 'SQOOP']); + }); + it('isHadoop2Stack is true', function () { + mock.isHadoop2Stack = true; + ss.set('serviceName', 'HDFS'); + ss.propertyDidChange('dependentServices'); + expect(ss.get('dependentServices')).to.eql(['YARN', 'HBASE', 'FLUME', 'SQOOP']); + }); + }); + + describe('#serviceDependency', function () { + var mock = { + isHadoop2Stack: false + }; + beforeEach(function () { + sinon.stub(App, 'get', function () { + return mock.isHadoop2Stack; + }) + }); + afterEach(function () { + App.get.restore(); + }); + it('isHadoop2Stack is false', function () { + ss.set('serviceName', 'HDFS'); + ss.propertyDidChange('serviceDependency'); + expect(ss.get('serviceDependency')).to.eql([]); + }); + it('isHadoop2Stack is true', function () { + mock.isHadoop2Stack = true; + ss.set('serviceName', 'HDFS'); + ss.propertyDidChange('serviceDependency'); + expect(ss.get('serviceDependency')).to.eql(["ZOOKEEPER"]); + }); + }); + + describe('#isMonitoringService', function () { + var testCases = [ + { + serviceName: 'HDFS', + result: false + }, + { + serviceName: 'NAGIOS', + result: true + }, + { + serviceName: 'GANGLIA', + result: true + } + ]; + + testCases.forEach(function (test) { + it('service name - ' + test.serviceName, function () { + ss.set('serviceName', test.serviceName); + ss.propertyDidChange('isMonitoringService'); + expect(ss.get('isMonitoringService')).to.equal(test.result); + }); + }); + }); + + describe('#hasClient', function () { + it('No client serviceComponents', function () { + ss.set('serviceComponents', []); + ss.propertyDidChange('hasClient'); + expect(ss.get('hasClient')).to.be.false; + }); + it('Has client serviceComponents', function () { + ss.set('serviceComponents', [Em.Object.create({isClient: true})]); + ss.propertyDidChange('hasClient'); + expect(ss.get('hasClient')).to.be.true; + }); + }); + + describe('#hasMaster', function () { + it('No master serviceComponents', function () { + ss.set('serviceComponents', []); + ss.propertyDidChange('hasMaster'); + expect(ss.get('hasMaster')).to.be.false; + }); + it('Has master serviceComponents', function () { + ss.set('serviceComponents', [Em.Object.create({isMaster: true})]); + ss.propertyDidChange('hasMaster'); + expect(ss.get('hasMaster')).to.be.true; + }); + }); + + describe('#hasSlave', function () { + it('No slave serviceComponents', function () { + ss.set('serviceComponents', []); + ss.propertyDidChange('hasSlave'); + expect(ss.get('hasSlave')).to.be.false; + }); + it('Has slave serviceComponents', function () { + ss.set('serviceComponents', [Em.Object.create({isSlave: true})]); + ss.propertyDidChange('hasSlave'); + expect(ss.get('hasSlave')).to.be.true; + }); + }); + + describe('#isClientOnlyService', function () { + it('Has not only client serviceComponents', function () { + ss.set('serviceComponents', [Em.Object.create({isSlave: true}), Em.Object.create({isClient: true})]); + ss.propertyDidChange('isClientOnlyService'); + expect(ss.get('isClientOnlyService')).to.be.false; + }); + it('Has only client serviceComponents', function () { + ss.set('serviceComponents', [Em.Object.create({isClient: true})]); + ss.propertyDidChange('isClientOnlyService'); + expect(ss.get('isClientOnlyService')).to.be.true; + }); + }); + + describe('#isNoConfigTypes', function () { + it('configTypes is null', function () { + ss.set('configTypes', null); + ss.propertyDidChange('isNoConfigTypes'); + expect(ss.get('isNoConfigTypes')).to.be.true; + }); + it('configTypes is empty', function () { + ss.set('configTypes', {}); + ss.propertyDidChange('isNoConfigTypes'); + expect(ss.get('isNoConfigTypes')).to.be.true; + }); + it('configTypes is correct', function () { + ss.set('configTypes', {'key': {}}); + ss.propertyDidChange('isNoConfigTypes'); + expect(ss.get('isNoConfigTypes')).to.be.false; + }); + }); + + describe('#customReviewHandler', function () { + it('service name is HDFS', function () { + ss.set('serviceName', 'HDFS'); + ss.propertyDidChange('customReviewHandler'); + expect(ss.get('customReviewHandler')).to.be.undefined; + }); + it('service name is HIVE', function () { + ss.set('serviceName', 'HIVE'); + ss.propertyDidChange('customReviewHandler'); + expect(ss.get('customReviewHandler')).to.eql({ + "Database": "loadHiveDbValue" + }); + }); + }); + + describe('#defaultsProviders', function () { + it('service name is HDFS', function () { + ss.set('serviceName', 'HDFS'); + ss.propertyDidChange('defaultsProviders'); + expect(ss.get('defaultsProviders')).to.be.undefined; + }); + it('service name is HIVE', function () { + ss.set('serviceName', 'HIVE'); + ss.propertyDidChange('defaultsProviders'); + expect(ss.get('defaultsProviders')).to.not.be.empty; + }); + }); + + describe('#configsValidator', function () { + it('service name is HDFS', function () { + ss.set('serviceName', 'HDFS'); + ss.propertyDidChange('configsValidator'); + expect(ss.get('configsValidator')).to.be.undefined; + }); + it('service name is HIVE', function () { + ss.set('serviceName', 'HIVE'); + ss.propertyDidChange('configsValidator'); + expect(ss.get('configsValidator')).to.not.be.empty; + }); + }); + + describe('#configCategories', function () { + it('HDFS service with no serviceComponents', function () { + ss.set('serviceComponents', []); + ss.set('serviceName', 'HDFS'); + ss.propertyDidChange('configCategories'); + expect(ss.get('configCategories').mapProperty('name')).to.eql([ + "General", + "Advanced", + "Advanced key", + "Custom key" + ]); + }); + it('HDFS service with DATANODE serviceComponents', function () { + ss.set('serviceComponents', [Em.Object.create({componentName: 'DATANODE'})]); + ss.set('serviceName', 'HDFS'); + ss.propertyDidChange('configCategories'); + expect(ss.get('configCategories').mapProperty('name')).to.eql([ + "DATANODE", + "General", + "Advanced", + "Advanced key", + "Custom key"]); + }); + }); + + +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/a8263345/ambari-web/test/views/common/configs/config_history_flow_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/views/common/configs/config_history_flow_test.js b/ambari-web/test/views/common/configs/config_history_flow_test.js index 3317550..59d38e2 100644 --- a/ambari-web/test/views/common/configs/config_history_flow_test.js +++ b/ambari-web/test/views/common/configs/config_history_flow_test.js @@ -512,7 +512,7 @@ describe('App.ConfigHistoryFlowView', function () { sinon.spy(view.get('controller'), 'onConfigGroupChange'); view.compare({context: Em.Object.create({version: 1})}); - expect(view.get('controller.compareServiceVersion.version')).to.equal(1); + expect(view.get('controller.compareServiceVersion')).to.eql(Em.Object.create({version: 1})); expect(view.get('controller').onConfigGroupChange.calledOnce).to.be.true; view.get('controller').onConfigGroupChange.restore(); }); @@ -520,13 +520,16 @@ describe('App.ConfigHistoryFlowView', function () { describe('#revert()', function () { beforeEach(function () { - sinon.stub(App, 'showConfirmationPopup', function (callback) { - callback(); + sinon.stub(App.ModalPopup, 'show', function (options) { + options.onPrimary.call(Em.Object.create({ + serviceConfigNote: 'note', + hide: Em.K + })); }); sinon.stub(view, 'sendRevertCall', Em.K); }); afterEach(function () { - App.showConfirmationPopup.restore(); + App.ModalPopup.show.restore(); view.sendRevertCall.restore(); }); it('context passed', function () { @@ -535,10 +538,11 @@ describe('App.ConfigHistoryFlowView', function () { serviceName: 'S1' })}); - expect(App.showConfirmationPopup.calledOnce).to.be.true; + expect(App.ModalPopup.show.calledOnce).to.be.true; expect(view.sendRevertCall.calledWith(Em.Object.create({ version: 1, - serviceName: 'S1' + serviceName: 'S1', + serviceConfigNote: 'note' }))).to.be.true; }); it('context is not passed', function () { @@ -548,10 +552,12 @@ describe('App.ConfigHistoryFlowView', function () { })); view.revert({}); - expect(App.showConfirmationPopup.calledOnce).to.be.true; + expect(App.ModalPopup.show.calledOnce).to.be.true; expect(view.sendRevertCall.calledWith(Em.Object.create({ version: 1, - serviceName: 'S1' + serviceName: 'S1', + serviceConfigNote: 'note', + notes: '' }))).to.be.true; }); });