Repository: ambari
Updated Branches:
  refs/heads/trunk b698c294b -> 5c49faf56


http://git-wip-us.apache.org/repos/asf/ambari/blob/5c49faf5/ambari-web/test/controllers/main/host/details_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/host/details_test.js 
b/ambari-web/test/controllers/main/host/details_test.js
new file mode 100644
index 0000000..3d6bb2a
--- /dev/null
+++ b/ambari-web/test/controllers/main/host/details_test.js
@@ -0,0 +1,1516 @@
+/**
+ * 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('controllers/main/host/details');
+require('models/service');
+require('models/host_component');
+var batchUtils = require('utils/batch_scheduled_requests');
+
+
+describe('App.MainHostDetailsController', function () {
+
+  var controller = App.MainHostDetailsController.create({
+    getSecurityStatus: function () {
+      return this.get('mockSecurityStatus');
+    },
+    mockSecurityStatus: false
+  });
+
+  describe('#serviceActiveComponents', function () {
+
+    it('No host-components', function () {
+      controller.set('content.hostComponents', []);
+      expect(controller.get('serviceActiveComponents')).to.be.empty;
+    });
+
+    it('No host-components in active state', function () {
+      controller.set('content.hostComponents', [Em.Object.create({
+        service: {
+          isInPassive: true
+        }
+      })]);
+      expect(controller.get('serviceActiveComponents')).to.be.empty;
+    });
+    it('Host-components in active state', function () {
+      controller.set('content.hostComponents', [Em.Object.create({
+        service: {
+          isInPassive: false
+        }
+      })]);
+      
expect(controller.get('serviceActiveComponents')).to.eql([Em.Object.create({
+        service: {
+          isInPassive: false
+        }
+      })]);
+    });
+  });
+
+  describe('#serviceNonClientActiveComponents', function () {
+
+    it('No active host-components', function () {
+      controller.reopen({
+        serviceActiveComponents: []
+      });
+      controller.set('serviceActiveComponents', []);
+      expect(controller.get('serviceNonClientActiveComponents')).to.be.empty;
+    });
+
+    it('Active host-component is client', function () {
+      controller.set('serviceActiveComponents', [Em.Object.create({
+        isClient: true
+      })]);
+      expect(controller.get('serviceNonClientActiveComponents')).to.be.empty;
+    });
+    it('Active host-component is not client', function () {
+      controller.set('serviceActiveComponents', [Em.Object.create({
+        isClient: false
+      })]);
+      expect(controller.get('serviceNonClientActiveComponents')).to.eql( 
[Em.Object.create({
+        isClient: false
+      })]);
+    });
+  });
+
+  describe('#startComponent()', function () {
+
+    beforeEach(function () {
+      sinon.spy(App, "showConfirmationPopup");
+      sinon.stub(controller, "sendStartComponentCommand", Em.K);
+    });
+    afterEach(function () {
+      App.showConfirmationPopup.restore();
+      controller.sendStartComponentCommand.restore();
+    });
+
+    it('popup should be displayed', function () {
+      var popup = controller.startComponent({context: 
Em.Object.create({'displayName': 'Comp1'})});
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+      popup.onPrimary();
+      expect(controller.sendStartComponentCommand.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#sendStartComponentCommand()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ajax, "send", Em.K);
+    });
+    afterEach(function () {
+      App.ajax.send.restore();
+    });
+
+    it('Query should be sent', function () {
+      var component = Em.Object.create({
+        componentName: 'comp1'
+      });
+      controller.sendStartComponentCommand(component, '');
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#getDataToSend()', function () {
+    it('should return correct query info', function () {
+      expect(controller.getDataToSend('STATE1', 'context')).to.eql({
+        RequestInfo: {
+          "context": 'context'
+        },
+        Body: {
+          HostRoles: {
+            state: 'STATE1'
+          }
+        }
+      });
+    });
+  });
+
+  describe('#setComponentToData()', function () {
+    var testCases = [
+      {
+        title: 'dataToSend is null',
+        content: {
+          data: {},
+          dataToSend: null,
+          component: {}
+        },
+        result: {
+          output: false,
+          data: {}
+        }
+      },
+      {
+        title: 'component is null',
+        content: {
+          data: {},
+          dataToSend: {},
+          component: null
+        },
+        result: {
+          output: false,
+          data: {}
+        }
+      },
+      {
+        title: 'data is null',
+        content: {
+          data: null,
+          dataToSend: {},
+          component: {}
+        },
+        result: {
+          output: false,
+          data: null
+        }
+      },
+      {
+        title: 'component is object',
+        content: {
+          data: {},
+          dataToSend: {},
+          component: Em.Object.create({componentName: 'comp1'})
+        },
+        result: {
+          output: true,
+          data: {
+            componentName: 'comp1',
+            data: '{}'
+          }
+        }
+      },
+      {
+        title: 'component is array',
+        content: {
+          data: {},
+          dataToSend: {RequestInfo: {}},
+          component: [Em.Object.create({componentName: 'comp1'})]
+        },
+        result: {
+          output: true,
+          data: {
+            data: 
'{\"RequestInfo\":{\"query\":\"HostRoles/component_name.in(comp1)\"}}'
+          }
+        }
+      }
+    ];
+    testCases.forEach(function (test) {
+      it(test.title, function () {
+        expect(controller.setComponentToData(test.content.data, 
test.content.dataToSend, test.content.component)).to.equal(test.result.output);
+        expect(test.content.data).to.eql(test.result.data);
+      });
+    });
+  });
+
+  describe('#deleteComponent()', function () {
+
+    beforeEach(function () {
+      sinon.spy(App.ModalPopup, "show");
+    });
+    afterEach(function () {
+      App.ModalPopup.show.restore();
+    });
+
+    it('confirm popup should be displayed', function () {
+      var event = {
+        context: Em.Object.create({})
+      };
+      controller.deleteComponent(event);
+      expect(App.ModalPopup.show.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#_doDeleteHostComponent()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ajax, "send", Em.K);
+    });
+    afterEach(function () {
+      App.ajax.send.restore();
+    });
+
+    it('delete request should be sent, component is null', function () {
+      controller.set('_deletedHostComponentResult', null);
+      expect(controller._doDeleteHostComponent()).to.equal(null);
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+    it('delete request should be sent, component is correct', function () {
+      controller.set('_deletedHostComponentResult', {});
+      
expect(controller._doDeleteHostComponent(Em.Object.create({componentName: 
'COMP1'}))).to.eql({});
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#mimicWorkStatusChange()', function () {
+
+    var clock;
+    beforeEach(function () {
+      clock = sinon.useFakeTimers();
+    });
+    afterEach(function () {
+      clock.restore()
+    });
+
+    it('change status of object', function () {
+      var entity = Em.Object.create({
+        workStatus: ''
+      });
+      controller.mimicWorkStatusChange(entity, 'STATE1', 'STATE2');
+      expect(entity.get('workStatus')).to.equal('STATE1');
+      clock.tick(App.testModeDelayForActions);
+      expect(entity.get('workStatus')).to.equal('STATE2');
+    });
+    it('change status of objects in array', function () {
+      var entity = [Em.Object.create({
+        workStatus: ''
+      })];
+      controller.mimicWorkStatusChange(entity, 'STATE1', 'STATE2');
+      expect(entity[0].get('workStatus')).to.equal('STATE1');
+      clock.tick(App.testModeDelayForActions);
+      expect(entity[0].get('workStatus')).to.equal('STATE2');
+    });
+  });
+
+  describe('#upgradeComponent()', function () {
+
+    beforeEach(function () {
+      sinon.spy(App, "showConfirmationPopup");
+      sinon.stub(App.ajax, "send", Em.K);
+    });
+    afterEach(function () {
+      App.showConfirmationPopup.restore();
+      App.ajax.send.restore();
+    });
+
+    it('confirm popup should be displayed', function () {
+      var popup = controller.upgradeComponent({context: Em.Object.create()});
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+      popup.onPrimary();
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#stopComponent()', function () {
+
+    beforeEach(function () {
+      sinon.spy(App, "showConfirmationPopup");
+      sinon.stub(controller, "sendStopComponentCommand", Em.K);
+    });
+    afterEach(function () {
+      App.showConfirmationPopup.restore();
+      controller.sendStopComponentCommand.restore();
+    });
+
+    it('popup should be displayed', function () {
+      var popup = controller.stopComponent({context: 
Em.Object.create({'displayName': 'Comp1'})});
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+      popup.onPrimary();
+      expect(controller.sendStopComponentCommand.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#sendStopComponentCommand()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ajax, "send", Em.K);
+    });
+    afterEach(function () {
+      App.ajax.send.restore();
+    });
+
+    it('Query should be sent', function () {
+      var component = Em.Object.create({
+        componentName: 'comp1'
+      });
+      controller.sendStopComponentCommand(component, '');
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#restartComponent()', function () {
+
+    beforeEach(function () {
+      sinon.spy(App, "showConfirmationPopup");
+      sinon.stub(batchUtils, "restartHostComponents", Em.K);
+    });
+
+    afterEach(function () {
+      App.showConfirmationPopup.restore();
+      batchUtils.restartHostComponents.restore();
+    });
+
+    it('popup should be displayed', function () {
+      var popup = controller.restartComponent({context: 
Em.Object.create({'displayName': 'Comp1'})});
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+      popup.onPrimary();
+      expect(batchUtils.restartHostComponents.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#addComponent()', function () {
+
+    beforeEach(function () {
+      sinon.spy(App, "showConfirmationPopup");
+      sinon.stub(controller, "addClientComponent", Em.K);
+      sinon.stub(controller, "primary", Em.K);
+    });
+
+    afterEach(function () {
+      App.showConfirmationPopup.restore();
+      controller.addClientComponent.restore();
+      controller.primary.restore();
+    });
+
+    it('add ZOOKEEPER_SERVER', function () {
+      var event = {context: Em.Object.create({
+        componentName: 'ZOOKEEPER_SERVER'
+      })};
+      var popup = controller.addComponent(event);
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+      popup.onPrimary();
+      expect(controller.primary.calledWith(Em.Object.create({
+        componentName: 'ZOOKEEPER_SERVER'
+      }))).to.be.true;
+    });
+    it('add slave component, securityEnabled = true', function () {
+      var event = {context: Em.Object.create({
+        componentName: 'COMP1'
+      })};
+      controller.set('mockSecurityStatus', true);
+      var popup = controller.addComponent(event);
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+      popup.onPrimary();
+      expect(controller.primary.calledWith(Em.Object.create({
+        componentName: 'COMP1'
+      }))).to.be.true;
+    });
+    it('add slave component, securityEnabled = false', function () {
+      var event = {context: Em.Object.create({
+        componentName: 'COMP1'
+      })};
+      controller.set('mockSecurityStatus', false);
+      controller.addComponent(event);
+      expect(controller.addClientComponent.calledWith(Em.Object.create({
+        componentName: 'COMP1'
+      }))).to.be.true;
+    });
+    it('add CLIENTS', function () {
+      var event = {context: Em.Object.create({
+        componentName: 'CLIENTS'
+      })};
+      controller.set('mockSecurityStatus', true);
+      controller.addComponent(event);
+      expect(controller.addClientComponent.calledWith(Em.Object.create({
+        componentName: 'CLIENTS'
+      }))).to.be.true;
+    });
+  });
+
+  describe('#formatClientsMessage()', function () {
+    var testCases = [
+      {
+        title: 'subComponentNames is null',
+        client: Em.Object.create({
+          subComponentNames: null,
+          displayName: 'CLIENTS'
+        }),
+        result: 'CLIENTS'
+      },
+      {
+        title: 'subComponentNames is empty',
+        client: Em.Object.create({
+          subComponentNames: [],
+          displayName: 'CLIENTS'
+        }),
+        result: 'CLIENTS'
+      },
+      {
+        title: 'displayName is null',
+        client: Em.Object.create({
+          subComponentNames: ['DATANODE'],
+          displayName: null
+        }),
+        result: ' (DataNode)'
+      },
+      {
+        title: 'displayName is CLIENTS',
+        client: Em.Object.create({
+          subComponentNames: ['DATANODE'],
+          displayName: 'CLIENTS'
+        }),
+        result: 'CLIENTS (DataNode)'
+      }
+    ];
+    testCases.forEach(function (test) {
+      it(test.title, function () {
+        
expect(controller.formatClientsMessage(test.client)).to.equal(test.result);
+      });
+    });
+  });
+
+  describe('#addClientComponent()', function () {
+
+    beforeEach(function () {
+      sinon.spy(App.ModalPopup, "show");
+      sinon.stub(controller, "primary", Em.K);
+    });
+
+    afterEach(function () {
+      App.ModalPopup.show.restore();
+      controller.primary.restore();
+    });
+
+    it('not CLIENT component', function () {
+      var component = Em.Object.create({'componentName': 'Comp1'});
+      var popup = controller.addClientComponent(component);
+      expect(App.ModalPopup.show.calledOnce).to.be.true;
+      popup.onPrimary();
+      expect(controller.primary.calledWith(Em.Object.create({'componentName': 
'Comp1'}))).to.be.true;
+    });
+    it('CLIENT components, with empty subComponentNames', function () {
+      var component = Em.Object.create({
+        componentName: 'CLIENTS',
+        subComponentNames: []
+      });
+      var popup = controller.addClientComponent(component);
+      expect(App.ModalPopup.show.calledOnce).to.be.true;
+      popup.onPrimary();
+      expect(controller.primary.calledOnce).to.be.false;
+    });
+    it('CLIENT components, with two sub-component', function () {
+      var component = Em.Object.create({
+        componentName: 'CLIENTS',
+        subComponentNames: ['DATANODE', 'TASKTRACKER']
+      });
+      var popup = controller.addClientComponent(component);
+      expect(App.ModalPopup.show.calledOnce).to.be.true;
+      popup.onPrimary();
+      expect(controller.primary.calledTwice).to.be.true;
+    });
+  });
+
+  describe('#primary()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ajax, "send", Em.K);
+    });
+    afterEach(function () {
+      App.ajax.send.restore();
+    });
+
+    it('Query should be sent', function () {
+      var component = Em.Object.create({
+        componentName: 'COMP1',
+        displayName: 'comp1'
+      });
+      controller.primary(component);
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#addNewComponentSuccessCallback()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ajax, "send", Em.K);
+    });
+    afterEach(function () {
+      App.ajax.send.restore();
+    });
+
+    it('Query should be sent', function () {
+      controller.addNewComponentSuccessCallback({}, {}, {component: 
Em.Object.create()});
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#installNewComponentSuccessCallback()', function () {
+
+    beforeEach(function () {
+      sinon.stub(controller, "showBackgroundOperationsPopup", Em.K);
+    });
+    afterEach(function () {
+      controller.showBackgroundOperationsPopup.restore();
+    });
+
+    it('data.Requests is null', function () {
+      var data = {Requests: null};
+      expect(controller.installNewComponentSuccessCallback(data, {}, 
{})).to.be.false;
+      expect(controller.showBackgroundOperationsPopup.called).to.be.false;
+    });
+    it('data.Requests.id is null', function () {
+      var data = {Requests: {id: null}};
+      expect(controller.installNewComponentSuccessCallback(data, {}, 
{})).to.be.false;
+      expect(controller.showBackgroundOperationsPopup.called).to.be.false;
+    });
+    it('data.Requests.id is correct', function () {
+      var data = {Requests: {id: 1}};
+      expect(controller.installNewComponentSuccessCallback(data, {}, 
{component: []})).to.be.true;
+      expect(controller.showBackgroundOperationsPopup.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#refreshComponentConfigs()', function () {
+
+    beforeEach(function () {
+      sinon.spy(App, "showConfirmationPopup");
+      sinon.stub(controller, "sendRefreshComponentConfigsCommand", Em.K);
+    });
+
+    afterEach(function () {
+      App.showConfirmationPopup.restore();
+      controller.sendRefreshComponentConfigsCommand.restore();
+    });
+
+    it('popup should be displayed', function () {
+      var popup = controller.refreshComponentConfigs({context: 
Em.Object.create({'displayName': 'Comp1'})});
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+      popup.onPrimary();
+      
expect(controller.sendRefreshComponentConfigsCommand.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#sendRefreshComponentConfigsCommand()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ajax, "send", Em.K);
+    });
+    afterEach(function () {
+      App.ajax.send.restore();
+    });
+
+    it('Query should be sent', function () {
+      var component = Em.Object.create({
+        service: {},
+        componentName: 'COMP1',
+        host: {}
+      });
+      controller.sendRefreshComponentConfigsCommand(component, {});
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#loadConfigs()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ajax, "send", Em.K);
+    });
+    afterEach(function () {
+      App.ajax.send.restore();
+    });
+
+    it('Query should be sent', function () {
+      controller.loadConfigs();
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#constructConfigUrlParams()', function () {
+
+    it('URL params should be empty', function () {
+      var data = {};
+      App.Service.find().clear();
+      expect(controller.constructConfigUrlParams(data)).to.eql([]);
+    });
+    it('isHaEnabled = true', function () {
+      var data = {Clusters: {desired_configs: {'core-site': {tag: 1}}}};
+      App.HostComponent.find().clear();
+      App.set('currentStackVersion', 'HDP-2.0.2');
+      
expect(controller.constructConfigUrlParams(data)).to.eql(['(type=core-site&tag=1)']);
+      App.store.load(App.HostComponent, {
+        id: 'SECONDARY_NAMENODE_host1',
+        component_name: 'SECONDARY_NAMENODE'
+      });
+      App.set('currentStackVersion', 'HDP-2.0.1');
+    });
+    it('HBASE is installed', function () {
+      App.store.load(App.Service, {
+        id: 'HBASE',
+        service_name: 'HBASE'
+      });
+      var data = {Clusters: {desired_configs: {'hbase-site': {tag: 1}}}};
+      
expect(controller.constructConfigUrlParams(data)).to.eql(['(type=hbase-site&tag=1)']);
+      App.Service.find().clear();
+    });
+    it('HIVE is installed', function () {
+      App.store.load(App.Service, {
+        id: 'HIVE',
+        service_name: 'HIVE'
+      });
+      var data = {Clusters: {desired_configs: {'webhcat-site': {tag: 1}}}};
+      
expect(controller.constructConfigUrlParams(data)).to.eql(['(type=webhcat-site&tag=1)']);
+      App.Service.find().clear();
+    });
+    it('STORM is installed', function () {
+      App.store.load(App.Service, {
+        id: 'STORM',
+        service_name: 'STORM'
+      });
+      var data = {Clusters: {desired_configs: {'storm-site': {tag: 1}}}};
+      
expect(controller.constructConfigUrlParams(data)).to.eql(['(type=storm-site&tag=1)']);
+      App.Service.find().clear();
+    });
+  });
+
+  describe('#loadConfigsSuccessCallback()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ajax, "send", Em.K);
+      sinon.stub(controller, "constructConfigUrlParams", function () {
+        return this.get('mockUrlParams');
+      });
+    });
+    afterEach(function () {
+      App.ajax.send.restore();
+      controller.constructConfigUrlParams.restore();
+    });
+
+    it('url params is empty', function () {
+      controller.set('mockUrlParams', []);
+      expect(controller.loadConfigsSuccessCallback()).to.be.false;
+      expect(App.ajax.send.called).to.be.false;
+    });
+    it('url params are correct', function () {
+      controller.set('mockUrlParams', ['param1']);
+      expect(controller.loadConfigsSuccessCallback()).to.be.true;
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#saveZkConfigs()', function () {
+
+    beforeEach(function () {
+      sinon.stub(controller, "getZkServerHosts", Em.K);
+      sinon.stub(controller, "concatZkNames", Em.K);
+      sinon.stub(controller, "setZKConfigs", Em.K);
+      sinon.spy(App.ajax, "send");
+    });
+    afterEach(function () {
+      controller.getZkServerHosts.restore();
+      controller.concatZkNames.restore();
+      controller.setZKConfigs.restore();
+      App.ajax.send.restore();
+    });
+
+    it('data.items is empty', function () {
+      var data = {items: []};
+      controller.saveZkConfigs(data);
+      expect(App.ajax.send.called).to.be.false;
+    });
+    it('data.items has one item', function () {
+      var data = {items: [
+        {
+          type: 'type1',
+          properties: {}
+        }
+      ]};
+      controller.saveZkConfigs(data);
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+    it('data.items has two items', function () {
+      var data = {items: [
+        {
+          type: 'type1',
+          properties: {}
+        },
+        {
+          type: 'type2',
+          properties: {}
+        }
+      ]};
+      controller.saveZkConfigs(data);
+      expect(App.ajax.send.calledTwice).to.be.true;
+    });
+  });
+
+  describe('#setZKConfigs()', function () {
+
+    it('configs is null', function () {
+      expect(controller.setZKConfigs(null)).to.be.false;
+    });
+    it('zks is null', function () {
+      expect(controller.setZKConfigs({}, '', null)).to.be.false;
+    });
+    it('isHaEnabled = true', function () {
+      var configs = {'core-site': {}};
+      App.HostComponent.find().clear();
+      App.set('currentStackVersion', 'HDP-2.0.2');
+      expect(controller.setZKConfigs(configs, 'host1:2181', [])).to.be.true;
+      expect(configs).to.eql({"core-site": {
+        "ha.zookeeper.quorum": "host1:2181"
+      }});
+      App.store.load(App.HostComponent, {
+        id: 'SECONDARY_NAMENODE_host1',
+        component_name: 'SECONDARY_NAMENODE'
+      });
+      App.set('currentStackVersion', 'HDP-2.0.1');
+    });
+    it('hbase-site is present', function () {
+      var configs = {'hbase-site': {}};
+      expect(controller.setZKConfigs(configs, '', ['host1', 
'host2'])).to.be.true;
+      expect(configs).to.eql({"hbase-site": {
+        "hbase.zookeeper.quorum": "host1,host2"
+      }});
+    });
+    it('webhcat-site is present', function () {
+      var configs = {'webhcat-site': {}};
+      expect(controller.setZKConfigs(configs, 'host1:2181', [])).to.be.true;
+      expect(configs).to.eql({"webhcat-site": {
+        "templeton.zookeeper.hosts": "host1:2181"
+      }});
+    });
+    it('storm-site is present', function () {
+      var configs = {'storm-site': {}};
+      expect(controller.setZKConfigs(configs, '', ["host1", 
'host2'])).to.be.true;
+      expect(configs).to.eql({"storm-site": {
+        "storm.zookeeper.servers": "['host1','host2']"
+      }});
+    });
+  });
+
+  describe('#concatZkNames()', function () {
+    it('No ZooKeeper hosts', function () {
+      expect(controller.concatZkNames([])).to.equal('');
+    });
+    it('One ZooKeeper host', function () {
+      expect(controller.concatZkNames(['host1'])).to.equal('host1:2181');
+    });
+    it('Two ZooKeeper hosts', function () {
+      expect(controller.concatZkNames(['host1', 
'host2'])).to.equal('host1:2181,host2:2181');
+    });
+  });
+
+  describe('#getZkServerHosts()', function () {
+    controller.set('content', {});
+
+    it('No ZooKeeper hosts, fromDeleteHost = false', function () {
+      App.HostComponent.find().clear();
+      controller.set('fromDeleteHost', false);
+      expect(controller.getZkServerHosts()).to.be.empty;
+    });
+    it('No ZooKeeper hosts, fromDeleteHost = true', function () {
+      controller.set('fromDeleteHost', true);
+      expect(controller.getZkServerHosts()).to.be.empty;
+      expect(controller.get('fromDeleteHost')).to.be.false;
+    });
+    it('One ZooKeeper host, fromDeleteHost = false', function () {
+      controller.set('fromDeleteHost', false);
+      App.store.load(App.HostComponent, {
+        id: 'ZOOKEEPER_SERVER_host1',
+        component_name: 'ZOOKEEPER_SERVER',
+        host_id: 'host1'
+      });
+      expect(controller.getZkServerHosts()).to.eql(['host1']);
+    });
+    it('One ZooKeeper host match current host name, fromDeleteHost = true', 
function () {
+      controller.set('fromDeleteHost', true);
+      controller.set('content.hostName', 'host1');
+      expect(controller.getZkServerHosts()).to.be.empty;
+      expect(controller.get('fromDeleteHost')).to.be.false;
+    });
+    it('One ZooKeeper host does not match current host name, fromDeleteHost = 
true', function () {
+      controller.set('fromDeleteHost', true);
+      controller.set('content.hostName', 'host2');
+      expect(controller.getZkServerHosts()[0]).to.equal("host1");
+      expect(controller.get('fromDeleteHost')).to.be.false;
+    });
+  });
+
+  describe('#installComponent()', function () {
+
+    beforeEach(function () {
+      sinon.spy(App.ModalPopup, "show");
+      sinon.stub(App.ajax, "send", Em.K);
+    });
+
+    afterEach(function () {
+      App.ModalPopup.show.restore();
+      App.ajax.send.restore();
+    });
+
+    it('popup should be displayed', function () {
+      var event = {context: Em.Object.create()};
+      var popup = controller.installComponent(event);
+      expect(App.ModalPopup.show.calledOnce).to.be.true;
+      popup.onPrimary();
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#decommission()', function () {
+
+    beforeEach(function () {
+      sinon.spy(App, "showConfirmationPopup");
+      sinon.stub(controller, "runDecommission", Em.K);
+    });
+    afterEach(function () {
+      App.showConfirmationPopup.restore();
+      controller.runDecommission.restore();
+    });
+
+    it('popup should be displayed', function () {
+      var popup = controller.decommission(Em.Object.create({service: {}}));
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+      popup.onPrimary();
+      expect(controller.runDecommission.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#runDecommission()', function () {
+
+    beforeEach(function () {
+      sinon.stub(controller, "doDecommission", Em.K);
+      sinon.stub(controller, "warnBeforeDecommission", Em.K);
+      sinon.stub(controller, "showBackgroundOperationsPopup", Em.K);
+    });
+
+    afterEach(function () {
+      controller.doDecommission.restore();
+      controller.warnBeforeDecommission.restore();
+      controller.showBackgroundOperationsPopup.restore();
+    });
+
+    it('HDFS service', function () {
+      controller.runDecommission('host1', 'HDFS');
+      expect(controller.doDecommission.calledWith('host1', 'HDFS', "NAMENODE", 
"DATANODE")).to.be.true;
+      expect(controller.showBackgroundOperationsPopup.calledOnce).to.be.true;
+    });
+    it('YARN service', function () {
+      controller.runDecommission('host1', 'YARN');
+      expect(controller.doDecommission.calledWith('host1', 'YARN', 
"RESOURCEMANAGER", "NODEMANAGER")).to.be.true;
+      expect(controller.showBackgroundOperationsPopup.calledOnce).to.be.true;
+    });
+    it('MAPREDUCE service', function () {
+      controller.runDecommission('host1', 'MAPREDUCE');
+      expect(controller.doDecommission.calledWith('host1', 'MAPREDUCE', 
"JOBTRACKER", "TASKTRACKER")).to.be.true;
+      expect(controller.showBackgroundOperationsPopup.calledOnce).to.be.true;
+    });
+    it('HBASE service', function () {
+      controller.runDecommission('host1', 'HBASE');
+      expect(controller.warnBeforeDecommission.calledWith('host1', 'HBASE', 
"HBASE_MASTER", "HBASE_REGIONSERVER")).to.be.true;
+      expect(controller.showBackgroundOperationsPopup.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#runRecommission()', function () {
+
+    beforeEach(function () {
+      sinon.stub(controller, "doRecommissionAndStart", Em.K);
+      sinon.stub(controller, "doRecommissionAndRestart", Em.K);
+      sinon.stub(controller, "showBackgroundOperationsPopup", Em.K);
+    });
+
+    afterEach(function () {
+      controller.doRecommissionAndStart.restore();
+      controller.doRecommissionAndRestart.restore();
+      controller.showBackgroundOperationsPopup.restore();
+    });
+
+    it('HDFS service', function () {
+      controller.runRecommission('host1', 'HDFS');
+      expect(controller.doRecommissionAndStart.calledWith('host1', 'HDFS', 
"NAMENODE", "DATANODE")).to.be.true;
+      expect(controller.showBackgroundOperationsPopup.calledOnce).to.be.true;
+    });
+    it('YARN service', function () {
+      controller.runRecommission('host1', 'YARN');
+      expect(controller.doRecommissionAndStart.calledWith('host1', 'YARN', 
"RESOURCEMANAGER", "NODEMANAGER")).to.be.true;
+      expect(controller.showBackgroundOperationsPopup.calledOnce).to.be.true;
+    });
+    it('MAPREDUCE service', function () {
+      controller.runRecommission('host1', 'MAPREDUCE');
+      expect(controller.doRecommissionAndRestart.calledWith('host1', 
'MAPREDUCE', "JOBTRACKER", "TASKTRACKER")).to.be.true;
+      expect(controller.showBackgroundOperationsPopup.calledOnce).to.be.true;
+    });
+    it('HBASE service', function () {
+      controller.runRecommission('host1', 'HBASE');
+      expect(controller.doRecommissionAndStart.calledWith('host1', 'HBASE', 
"HBASE_MASTER", "HBASE_REGIONSERVER")).to.be.true;
+      expect(controller.showBackgroundOperationsPopup.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#doDecommission()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ajax, "send", Em.K);
+    });
+    afterEach(function () {
+      App.ajax.send.restore();
+    });
+
+    it('Query should be sent', function () {
+      controller.doDecommission('', '', '', '');
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#doDecommissionRegionServer()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ajax, "send", Em.K);
+    });
+    afterEach(function () {
+      App.ajax.send.restore();
+    });
+
+    it('Query should be sent', function () {
+      controller.doDecommissionRegionServer('', '', '', '');
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+  /**
+   * TODO uncomment test when final rules will be implemented into 
warnBeforeDecommission function
+   */
+ /* describe('#warnBeforeDecommission()', function () {
+
+    beforeEach(function () {
+      sinon.stub(controller, "doDecommissionRegionServer", Em.K);
+      sinon.stub(App.ModalPopup, "show", Em.K);
+    });
+    afterEach(function () {
+      App.ModalPopup.show.restore();
+      controller.doDecommissionRegionServer.restore();
+    });
+
+    it('Component in passive state', function () {
+      controller.set('content.hostComponents', [Em.Object.create({
+        componentName: 'HBASE_REGIONSERVER',
+        passiveState: 'ON'
+      })]);
+      controller.warnBeforeDecommission('host1', 'HBASE', 
'HBASE_REGIONSERVER', 'SLAVE');
+      expect(App.ModalPopup.show.called).to.be.false;
+      expect(controller.doDecommissionRegionServer.calledWith('host1', 
'HBASE', 'HBASE_REGIONSERVER', 'SLAVE')).to.be.true;
+    });
+    it('Component is not in passive state', function () {
+      controller.set('content.hostComponents', [Em.Object.create({
+        componentName: 'HBASE_REGIONSERVER',
+        passiveState: 'OFF'
+      })]);
+      controller.warnBeforeDecommission('host1', 'HBASE', 
'HBASE_REGIONSERVER', 'SLAVE');
+      expect(App.ModalPopup.show.calledOnce).to.be.true;
+      expect(controller.doDecommissionRegionServer.called).to.be.false;
+    });
+  });*/
+
+  describe('#doRecommissionAndStart()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ajax, "send", Em.K);
+    });
+    afterEach(function () {
+      App.ajax.send.restore();
+    });
+
+    it('Query should be sent', function () {
+      controller.doRecommissionAndStart('', '', '', '');
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#decommissionSuccessCallback()', function () {
+
+    beforeEach(function () {
+      sinon.stub(controller, "showBackgroundOperationsPopup", Em.K);
+    });
+    afterEach(function () {
+      controller.showBackgroundOperationsPopup.restore();
+    });
+
+    it('data is null', function () {
+      expect(controller.decommissionSuccessCallback(null)).to.be.false;
+      expect(controller.showBackgroundOperationsPopup.called).to.be.false;
+    });
+    it('data has Requests', function () {
+      var data = {Requests: []};
+      expect(controller.decommissionSuccessCallback(data)).to.be.true;
+      expect(controller.showBackgroundOperationsPopup.calledOnce).to.be.true;
+    });
+    it('data has resources', function () {
+      var data = {resources: [{RequestSchedule: {}}]};
+      expect(controller.decommissionSuccessCallback(data)).to.be.true;
+      expect(controller.showBackgroundOperationsPopup.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#doRecommissionAndRestart()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ajax, "send", Em.K);
+    });
+    afterEach(function () {
+      App.ajax.send.restore();
+    });
+
+    it('Query should be sent', function () {
+      controller.doRecommissionAndRestart('', '', '', '');
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#doAction()', function () {
+
+    beforeEach(function () {
+      sinon.stub(controller, "validateAndDeleteHost", Em.K);
+      sinon.stub(controller, "doStartAllComponents", Em.K);
+      sinon.stub(controller, "doStopAllComponents", Em.K);
+      sinon.stub(controller, "doRestartAllComponents", Em.K);
+      sinon.stub(controller, "onOffPassiveModeForHost", Em.K);
+    });
+
+    afterEach(function () {
+      controller.validateAndDeleteHost.restore();
+      controller.doStartAllComponents.restore();
+      controller.doStopAllComponents.restore();
+      controller.doRestartAllComponents.restore();
+      controller.onOffPassiveModeForHost.restore();
+    });
+
+    it('"deleteHost" action', function () {
+      var option = {context: {action: "deleteHost"}};
+      controller.doAction(option);
+      expect(controller.validateAndDeleteHost.calledOnce).to.be.true;
+    });
+    it('"startAllComponents" action, isNotHeartBeating = false', function () {
+      var option = {context: {action: "startAllComponents"}};
+      controller.set('content.isNotHeartBeating', false);
+      controller.doAction(option);
+      expect(controller.doStartAllComponents.calledOnce).to.be.true;
+    });
+    it('"startAllComponents" action, isNotHeartBeating = true', function () {
+      var option = {context: {action: "startAllComponents"}};
+      controller.set('content.isNotHeartBeating', true);
+      controller.doAction(option);
+      expect(controller.doStartAllComponents.called).to.be.false;
+    });
+    it('"stopAllComponents" action, isNotHeartBeating = false', function () {
+      var option = {context: {action: "stopAllComponents"}};
+      controller.set('content.isNotHeartBeating', false);
+      controller.doAction(option);
+      expect(controller.doStopAllComponents.calledOnce).to.be.true;
+    });
+    it('"stopAllComponents" action, isNotHeartBeating = true', function () {
+      var option = {context: {action: "stopAllComponents"}};
+      controller.set('content.isNotHeartBeating', true);
+      controller.doAction(option);
+      expect(controller.doStopAllComponents.called).to.be.false;
+    });
+    it('"restartAllComponents" action, isNotHeartBeating = false', function () 
{
+      var option = {context: {action: "restartAllComponents"}};
+      controller.set('content.isNotHeartBeating', false);
+      controller.doAction(option);
+      expect(controller.doRestartAllComponents.calledOnce).to.be.true;
+    });
+    it('"restartAllComponents" action, isNotHeartBeating = true', function () {
+      var option = {context: {action: "restartAllComponents"}};
+      controller.set('content.isNotHeartBeating', true);
+      controller.doAction(option);
+      expect(controller.doRestartAllComponents.called).to.be.false;
+    });
+    it('"onOffPassiveModeForHost" action', function () {
+      var option = {context: {action: "onOffPassiveModeForHost"}};
+      controller.doAction(option);
+      expect(controller.onOffPassiveModeForHost.calledWith({action: 
"onOffPassiveModeForHost"})).to.be.true;
+    });
+  });
+
+  describe('#onOffPassiveModeForHost()', function () {
+
+    beforeEach(function () {
+      sinon.spy(App, "showConfirmationPopup");
+      sinon.stub(controller, "hostPassiveModeRequest", Em.K);
+    });
+    afterEach(function () {
+      App.showConfirmationPopup.restore();
+      controller.hostPassiveModeRequest.restore();
+    });
+
+    it('popup should be displayed, active = true', function () {
+      var popup = controller.onOffPassiveModeForHost({active: true});
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+      popup.onPrimary();
+      expect(controller.hostPassiveModeRequest.calledWith('ON')).to.be.true;
+    });
+    it('popup should be displayed, active = false', function () {
+      var popup = controller.onOffPassiveModeForHost({active: false});
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+      popup.onPrimary();
+      expect(controller.hostPassiveModeRequest.calledWith('OFF')).to.be.true;
+    });
+  });
+
+  describe('#hostPassiveModeRequest()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ajax, "send", Em.K);
+    });
+    afterEach(function () {
+      App.ajax.send.restore();
+    });
+
+    it('Query should be sent', function () {
+      controller.hostPassiveModeRequest('', '');
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#doStartAllComponents()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App, "showConfirmationPopup", Em.K);
+      sinon.stub(controller, "sendStartComponentCommand", Em.K);
+    });
+    afterEach(function () {
+      App.showConfirmationPopup.restore();
+      controller.sendStartComponentCommand.restore();
+    });
+
+    it('serviceNonClientActiveComponents is null', function () {
+      controller.reopen({
+        serviceNonClientActiveComponents: []
+      });
+      controller.set('serviceNonClientActiveComponents', null);
+      controller.doStartAllComponents();
+      expect(App.showConfirmationPopup.called).to.be.false;
+    });
+    it('serviceNonClientActiveComponents is empty', function () {
+      controller.set('serviceNonClientActiveComponents', []);
+      controller.doStartAllComponents();
+      expect(App.showConfirmationPopup.called).to.be.false;
+    });
+    it('serviceNonClientActiveComponents is correct', function () {
+      controller.set('serviceNonClientActiveComponents', [{}]);
+      var popup = controller.doStartAllComponents();
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+      /*popup.onPrimary();
+      
expect(controller.sendStartComponentCommand.calledWith([{}])).to.be.true;*/
+    });
+  });
+
+  describe('#doStopAllComponents()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App, "showConfirmationPopup", Em.K);
+      sinon.stub(controller, "sendStartComponentCommand", Em.K);
+    });
+    afterEach(function () {
+      App.showConfirmationPopup.restore();
+      controller.sendStartComponentCommand.restore();
+    });
+
+    it('serviceNonClientActiveComponents is null', function () {
+      controller.set('serviceNonClientActiveComponents', null);
+      controller.doStopAllComponents();
+      expect(App.showConfirmationPopup.called).to.be.false;
+    });
+    it('serviceNonClientActiveComponents is empty', function () {
+      controller.set('serviceNonClientActiveComponents', []);
+      controller.doStopAllComponents();
+      expect(App.showConfirmationPopup.called).to.be.false;
+    });
+    it('serviceNonClientActiveComponents is correct', function () {
+      controller.set('serviceNonClientActiveComponents', [{}]);
+      var popup = controller.doStopAllComponents();
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+      /*popup.onPrimary();
+      
expect(controller.sendStopComponentCommand.calledWith([{}])).to.be.true;*/
+    });
+  });
+
+  describe('#doRestartAllComponents()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App, "showConfirmationPopup", Em.K);
+      sinon.stub(controller, "sendStartComponentCommand", Em.K);
+    });
+    afterEach(function () {
+      App.showConfirmationPopup.restore();
+      controller.sendStartComponentCommand.restore();
+    });
+
+    it('serviceActiveComponents is null', function () {
+      controller.set('serviceActiveComponents', null);
+      controller.doRestartAllComponents();
+      expect(App.showConfirmationPopup.called).to.be.false;
+    });
+    it('serviceActiveComponents is empty', function () {
+      controller.set('serviceActiveComponents', []);
+      controller.doRestartAllComponents();
+      expect(App.showConfirmationPopup.called).to.be.false;
+    });
+    it('serviceActiveComponents is correct', function () {
+      controller.set('serviceActiveComponents', [{}]);
+      var popup = controller.doRestartAllComponents();
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+      /*popup.onPrimary();
+       expect(controller.restartHostComponents.calledWith([{}])).to.be.true;*/
+    });
+  });
+
+  describe('#getHostComponentsInfo()', function () {
+
+    var result = {
+      zkServerInstalled: false,
+      lastComponents: [],
+      masterComponents: [],
+      runningComponents: [],
+      nonDeletableComponents: [],
+      unknownComponents: []
+    };
+
+    it('content.hostComponents is null', function () {
+      controller.set('content.hostComponents', null);
+      expect(controller.getHostComponentsInfo()).to.eql(result);
+    });
+    it('content.hostComponents is empty', function () {
+      controller.set('content.hostComponents', []);
+      expect(controller.getHostComponentsInfo()).to.eql(result);
+    });
+    it('content.hostComponents has ZOOKEEPER_SERVER', function () {
+      App.HostComponent.find().clear();
+      controller.set('content.hostComponents', [Em.Object.create({
+        componentName: 'ZOOKEEPER_SERVER',
+        workStatus: 'INIT',
+        isDeletable: true
+      })]);
+      expect(controller.getHostComponentsInfo().zkServerInstalled).to.be.true;
+    });
+    it('content.hostComponents has last component', function () {
+      App.store.load(App.HostComponent, {
+        id: 'TASKTRACKER_host1',
+        component_name: 'TASKTRACKER'
+      });
+      controller.set('content.hostComponents', [Em.Object.create({
+        componentName: 'TASKTRACKER',
+        displayName: 'TaskTracker',
+        workStatus: 'INIT',
+        isDeletable: true
+      })]);
+      
expect(controller.getHostComponentsInfo().lastComponents).to.eql(['TaskTracker']);
+      App.HostComponent.find().clear();
+    });
+    it('content.hostComponents has master non-deletable component', function 
() {
+      controller.set('content.hostComponents', [Em.Object.create({
+        componentName: 'TASKTRACKER',
+        workStatus: 'INIT',
+        isDeletable: false,
+        isMaster: true,
+        displayName: 'ZK1'
+      })]);
+      
expect(controller.getHostComponentsInfo().masterComponents).to.eql(['ZK1']);
+      
expect(controller.getHostComponentsInfo().nonDeletableComponents).to.eql(['ZK1']);
+    });
+    it('content.hostComponents has running component', function () {
+      controller.set('content.hostComponents', [Em.Object.create({
+        componentName: 'TASKTRACKER',
+        workStatus: 'STARTED',
+        isDeletable: true,
+        displayName: 'ZK1'
+      })]);
+      
expect(controller.getHostComponentsInfo().runningComponents).to.eql(['ZK1']);
+    });
+    it('content.hostComponents has non-deletable component', function () {
+      controller.set('content.hostComponents', [Em.Object.create({
+        componentName: 'TASKTRACKER',
+        workStatus: 'INIT',
+        isDeletable: false,
+        displayName: 'ZK1'
+      })]);
+      
expect(controller.getHostComponentsInfo().nonDeletableComponents).to.eql(['ZK1']);
+    });
+    it('content.hostComponents has component with UNKNOWN state', function () {
+      controller.set('content.hostComponents', [Em.Object.create({
+        componentName: 'TASKTRACKER',
+        workStatus: 'UNKNOWN',
+        isDeletable: false,
+        displayName: 'ZK1'
+      })]);
+      
expect(controller.getHostComponentsInfo().unknownComponents).to.eql(['ZK1']);
+    });
+  });
+
+  describe('#validateAndDeleteHost()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App, "showConfirmationPopup", Em.K);
+      sinon.stub(controller, "getHostComponentsInfo", function(){
+        return this.get('mockHostComponentsInfo');
+      });
+      sinon.stub(controller, "raiseDeleteComponentsError", Em.K);
+      sinon.stub(controller, "_doDeleteHost", Em.K);
+    });
+    afterEach(function () {
+      App.showConfirmationPopup.restore();
+      controller.getHostComponentsInfo.restore();
+      controller.raiseDeleteComponentsError.restore();
+      controller._doDeleteHost.restore();
+    });
+
+    it('App.supports.deleteHost = false', function () {
+      App.supports.deleteHost = false;
+      expect(controller.validateAndDeleteHost()).to.be.false;
+      App.supports.deleteHost = true;
+    });
+    it('masterComponents exist', function () {
+      controller.set('mockHostComponentsInfo', {masterComponents: [{}]});
+      controller.validateAndDeleteHost();
+      expect(controller.raiseDeleteComponentsError.calledWith([{}], 
'masterList')).to.be.true;
+    });
+    it('nonDeletableComponents exist', function () {
+      controller.set('mockHostComponentsInfo', {
+        masterComponents: [],
+        nonDeletableComponents: [{}]
+      });
+      controller.validateAndDeleteHost();
+      expect(controller.raiseDeleteComponentsError.calledWith([{}], 
'nonDeletableList')).to.be.true;
+    });
+    it('runningComponents exist', function () {
+      controller.set('mockHostComponentsInfo', {
+        masterComponents: [],
+        nonDeletableComponents: [],
+        runningComponents: [{}]
+      });
+      controller.validateAndDeleteHost();
+      expect(controller.raiseDeleteComponentsError.calledWith([{}], 
'runningList')).to.be.true;
+    });
+    it('zkServerInstalled = true', function () {
+      controller.set('mockHostComponentsInfo', {
+        masterComponents: [],
+        nonDeletableComponents: [],
+        runningComponents: [],
+        unknownComponents: [],
+        lastComponents: [],
+        zkServerInstalled: true
+      });
+      var popup = controller.validateAndDeleteHost();
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+     /* popup.onPrimary();
+      expect(controller._doDeleteHost.calledWith([], [])).to.be.true;*/
+    });
+    it('zkServerInstalled = false', function () {
+      controller.set('mockHostComponentsInfo', {
+        masterComponents: [],
+        nonDeletableComponents: [],
+        runningComponents: [],
+        unknownComponents: [],
+        lastComponents: [],
+        zkServerInstalled: false
+      });
+      controller.validateAndDeleteHost();
+      expect(controller._doDeleteHost.calledWith([], [])).to.be.true;
+    });
+  });
+
+  describe('#raiseDeleteComponentsError()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ModalPopup, "show", Em.K);
+    });
+    afterEach(function () {
+      App.ModalPopup.show.restore();
+    });
+
+    it('Popup should be displayed', function () {
+      controller.raiseDeleteComponentsError([], '');
+      expect(App.ModalPopup.show.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#_doDeleteHost()', function () {
+
+    beforeEach(function () {
+      sinon.stub(App.ModalPopup, "show", Em.K);
+    });
+    afterEach(function () {
+      App.ModalPopup.show.restore();
+    });
+
+    it('Popup should be displayed', function () {
+      controller._doDeleteHost([], []);
+      expect(App.ModalPopup.show.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#restartAllStaleConfigComponents()', function () {
+
+    beforeEach(function () {
+      sinon.spy(App, "showConfirmationPopup");
+      sinon.stub(batchUtils, "restartHostComponents", Em.K);
+    });
+    afterEach(function () {
+      App.showConfirmationPopup.restore();
+      batchUtils.restartHostComponents.restore();
+    });
+
+    it('popup should be displayed', function () {
+      controller.set('content.componentsWithStaleConfigs', [{}]);
+      var popup = controller.restartAllStaleConfigComponents();
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+      popup.onPrimary();
+      expect(batchUtils.restartHostComponents.calledWith([{}])).to.be.true;
+    });
+  });
+
+  describe('#moveComponent()', function () {
+
+    beforeEach(function () {
+      sinon.spy(App, "showConfirmationPopup");
+    });
+    afterEach(function () {
+      App.showConfirmationPopup.restore();
+    });
+
+    it('popup should be displayed', function () {
+      var popup = controller.moveComponent();
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#refreshConfigs()', function () {
+
+    beforeEach(function () {
+      sinon.spy(App, "showConfirmationPopup");
+      sinon.stub(batchUtils, "restartHostComponents", Em.K);
+    });
+    afterEach(function () {
+      App.showConfirmationPopup.restore();
+      batchUtils.restartHostComponents.restore();
+    });
+
+    it('No components', function () {
+      var event = {context: []};
+      controller.refreshConfigs(event);
+      expect(App.showConfirmationPopup.called).to.be.false;
+    });
+    it('No components with stale configs', function () {
+      var event = {context: [Em.Object.create({
+        staleConfigs: false
+      })]};
+      controller.refreshConfigs(event);
+      expect(App.showConfirmationPopup.called).to.be.false;
+    });
+    it('Components with stale configs', function () {
+      var event = {context: [Em.Object.create({
+        staleConfigs: true
+      })]};
+      var popup = controller.refreshConfigs(event);
+      expect(App.showConfirmationPopup.calledOnce).to.be.true;
+      popup.onPrimary();
+      expect(batchUtils.restartHostComponents.calledWith([Em.Object.create({
+        staleConfigs: true
+      })])).to.be.true;
+    });
+  });
+});
\ No newline at end of file

Reply via email to