| /** |
| * 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/host'); |
| require('models/service'); |
| require('models/host_component'); |
| require('mappers/server_data_mapper'); |
| require('views/main/host/summary'); |
| |
| var mainHostSummaryView; |
| var modelSetup = require('test/init_model_test'); |
| |
| describe('App.MainHostSummaryView', function() { |
| |
| beforeEach(function() { |
| modelSetup.setupStackServiceComponent(); |
| mainHostSummaryView = App.MainHostSummaryView.create({content: Em.Object.create()}); |
| }); |
| |
| afterEach(function(){ |
| modelSetup.cleanStackServiceComponent(); |
| }); |
| |
| describe("#installedServices", function() { |
| |
| beforeEach(function() { |
| sinon.stub(App.Service, 'find').returns([Em.Object.create({serviceName: 'S1'})]); |
| }); |
| afterEach(function() { |
| App.Service.find.restore(); |
| }); |
| |
| it("should return installed services", function() { |
| expect(mainHostSummaryView.get('installedServices')).to.eql(['S1']); |
| }); |
| }); |
| |
| describe('#sortedComponentsFormatter()', function() { |
| |
| var tests = Em.A([ |
| { |
| content: Em.Object.create({ |
| hostComponents: Em.A([ |
| Em.Object.create({isMaster: false, isSlave: true, componentName: 'B'}), |
| Em.Object.create({isMaster: true, isSlave: false, componentName: 'A'}), |
| Em.Object.create({isMaster: true, isSlave: false, componentName: 'C'}), |
| Em.Object.create({isMaster: false, isSlave: false, componentName: 'D'}) |
| ]) |
| }), |
| m: 'List of masters, slaves and clients', |
| e: ['A', 'C', 'B'] |
| }, |
| { |
| content: Em.Object.create({ |
| hostComponents: Em.A([ |
| Em.Object.create({isMaster: false, isSlave: true, componentName: 'B'}), |
| Em.Object.create({isMaster: true, isSlave: false, componentName: 'A'}), |
| Em.Object.create({isMaster: true, isSlave: false, componentName: 'C'}), |
| Em.Object.create({isMaster: true, isSlave: false, componentName: 'D'}) |
| ]) |
| }), |
| m: 'List of masters and slaves', |
| e: ['A', 'C', 'D', 'B'] |
| }, |
| { |
| content: Em.Object.create({ |
| hostComponents: Em.A([ |
| Em.Object.create({isMaster: true, isSlave: false, componentName: 'B'}), |
| Em.Object.create({isMaster: true, isSlave: false, componentName: 'A'}), |
| Em.Object.create({isMaster: true, isSlave: false, componentName: 'C'}), |
| Em.Object.create({isMaster: true, isSlave: false, componentName: 'D'}) |
| ]) |
| }), |
| m: 'List of masters', |
| e: ['B', 'A', 'C', 'D'] |
| }, |
| { |
| content: Em.Object.create({ |
| hostComponents: Em.A([ |
| Em.Object.create({isMaster: false, isSlave: true, componentName: 'B'}), |
| Em.Object.create({isMaster: false, isSlave: true, componentName: 'A'}), |
| Em.Object.create({isMaster: false, isSlave: true, componentName: 'C'}), |
| Em.Object.create({isMaster: false, isSlave: true, componentName: 'D'}) |
| ]) |
| }), |
| m: 'List of slaves', |
| e: ['B', 'A', 'C', 'D'] |
| }, |
| { |
| content: Em.Object.create({ |
| hostComponents: Em.A([]) |
| }), |
| m: 'Empty list', |
| e: [] |
| }, |
| { |
| content: Em.Object.create({ |
| hostComponents: Em.A([ |
| Em.Object.create({isClient: true, componentName: 'B'}), |
| Em.Object.create({isMaster: true, componentName: 'A'}), |
| Em.Object.create({isSlave: true, componentName: 'C'}), |
| Em.Object.create({isClient: true, componentName: 'D'}) |
| ]) |
| }), |
| m: 'List of clients', |
| e: ['A', 'C', 'B', 'D'] |
| } |
| ]); |
| |
| tests.forEach(function(test) { |
| it(test.m, function() { |
| test.content.get('hostComponents').forEach(function(component) { |
| component.set('id', component.get('componentName')); |
| }); |
| mainHostSummaryView.set('sortedComponents', []); |
| mainHostSummaryView.set('content', test.content); |
| mainHostSummaryView.sortedComponentsFormatter(); |
| expect(mainHostSummaryView.get('sortedComponents').mapProperty('componentName')).to.eql(test.e); |
| }); |
| }); |
| |
| }); |
| |
| describe('#isAddComponent', function() { |
| |
| var tests = Em.A([ |
| {content: {healthClass: 'health-status-DEAD-YELLOW', hostComponents: Em.A([])}, e: false}, |
| {content: {healthClass: 'OTHER_VALUE', hostComponents: Em.A([])}, e: true} |
| ]); |
| |
| tests.forEach(function(test) { |
| it(test.content.healthClass, function() { |
| mainHostSummaryView.set('content', test.content); |
| expect(mainHostSummaryView.get('isAddComponent')).to.equal(test.e); |
| }); |
| }); |
| |
| }); |
| |
| describe('#addableComponents', function() { |
| |
| beforeEach(function() { |
| this.mock = sinon.stub(App.StackServiceComponent, 'find'); |
| sinon.stub(mainHostSummaryView, 'hasCardinalityConflict').returns(false); |
| }); |
| afterEach(function() { |
| App.StackServiceComponent.find.restore(); |
| mainHostSummaryView.hasCardinalityConflict.restore(); |
| }); |
| |
| var tests = Em.A([ |
| { |
| addableToHostComponents: [ |
| Em.Object.create({ |
| serviceName: 'HDFS', |
| componentName: 'DATANODE', |
| isAddableToHost: true |
| }), |
| Em.Object.create({ |
| serviceName: 'HDFS', |
| componentName: 'HDFS_CLIENT', |
| isAddableToHost: true |
| }) |
| ], |
| content: Em.Object.create({ |
| hostComponents: Em.A([ |
| Em.Object.create({ |
| componentName: 'HDFS_CLIENT' |
| }) |
| ]) |
| }), |
| services: ['HDFS'], |
| e: ['DATANODE'], |
| m: 'some components are already installed' |
| }, |
| { |
| addableToHostComponents: [ |
| Em.Object.create({ |
| serviceName: 'HDFS', |
| componentName: 'HDFS_CLIENT', |
| isAddableToHost: true |
| }) |
| ], |
| content: Em.Object.create({ |
| hostComponents: Em.A([ |
| Em.Object.create({ |
| componentName: 'HDFS_CLIENT' |
| }) |
| ]) |
| }), |
| services: ['HDFS'], |
| e: [], |
| m: 'all components are already installed' |
| } |
| ]); |
| |
| tests.forEach(function(test) { |
| it(test.m, function() { |
| this.mock.returns(test.addableToHostComponents); |
| mainHostSummaryView.set('content', test.content); |
| mainHostSummaryView.reopen({ |
| installedServices: test.services |
| }); |
| mainHostSummaryView.propertyDidChange('addableComponents'); |
| expect(mainHostSummaryView.get('addableComponents').mapProperty('componentName')).to.eql(test.e); |
| }); |
| }); |
| }); |
| |
| describe("#needToRestartMessage", function() { |
| |
| it("one component", function() { |
| var expected = Em.I18n.t('hosts.host.details.needToRestart').format(1, Em.I18n.t('common.component').toLowerCase()); |
| mainHostSummaryView.set('content', Em.Object.create({ |
| componentsWithStaleConfigsCount: 1 |
| })); |
| expect(mainHostSummaryView.get('needToRestartMessage')).to.equal(expected); |
| }); |
| |
| it("multiple components", function() { |
| var expected = Em.I18n.t('hosts.host.details.needToRestart').format(2, Em.I18n.t('common.components').toLowerCase()); |
| mainHostSummaryView.set('content', Em.Object.create({ |
| componentsWithStaleConfigsCount: 2 |
| })); |
| expect(mainHostSummaryView.get('needToRestartMessage')).to.equal(expected); |
| }); |
| |
| }); |
| |
| describe("#willInsertElement()", function() { |
| |
| beforeEach(function() { |
| sinon.stub(mainHostSummaryView, 'sortedComponentsFormatter'); |
| sinon.stub(mainHostSummaryView, 'addObserver'); |
| }); |
| afterEach(function() { |
| mainHostSummaryView.sortedComponentsFormatter.restore(); |
| mainHostSummaryView.addObserver.restore(); |
| }); |
| |
| it("sortedComponentsFormatter should be called ", function() { |
| mainHostSummaryView.willInsertElement(); |
| expect(mainHostSummaryView.sortedComponentsFormatter.calledOnce).to.be.true; |
| expect(mainHostSummaryView.addObserver.calledWith('content.hostComponents.length', mainHostSummaryView, 'sortedComponentsFormatter')).to.be.true; |
| expect(mainHostSummaryView.get('sortedComponents')).to.be.empty; |
| }); |
| }); |
| |
| describe("#didInsertElement()", function() { |
| |
| beforeEach(function() { |
| sinon.stub(mainHostSummaryView, 'addToolTip'); |
| }); |
| afterEach(function() { |
| mainHostSummaryView.addToolTip.restore(); |
| }); |
| |
| it("addToolTip should be called", function() { |
| mainHostSummaryView.didInsertElement(); |
| expect(mainHostSummaryView.addToolTip.calledOnce).to.be.true; |
| }); |
| }); |
| |
| describe("#addToolTip()", function() { |
| |
| beforeEach(function() { |
| sinon.stub(App, 'tooltip'); |
| mainHostSummaryView.removeObserver('addComponentDisabled', mainHostSummaryView, 'addToolTip'); |
| }); |
| afterEach(function() { |
| App.tooltip.restore(); |
| }); |
| |
| it("addComponentDisabled is false ", function() { |
| mainHostSummaryView.reopen({ |
| addComponentDisabled: false |
| }); |
| mainHostSummaryView.addToolTip(); |
| expect(App.tooltip.called).to.be.false; |
| }); |
| |
| it("addComponentDisabled is true ", function() { |
| mainHostSummaryView.reopen({ |
| addComponentDisabled: true |
| }); |
| mainHostSummaryView.addToolTip(); |
| expect(App.tooltip.called).to.be.true; |
| }); |
| |
| }); |
| |
| describe("#hasCardinalityConflict()", function () { |
| |
| beforeEach(function() { |
| this.mockComponent = sinon.stub(App.HostComponent, 'getCount'); |
| this.mockStack = sinon.stub(App.StackServiceComponent, 'find'); |
| }); |
| |
| afterEach(function() { |
| this.mockComponent.restore(); |
| this.mockStack.restore(); |
| }); |
| |
| it("totalCount equal to maxToInstall", function() { |
| this.mockComponent.returns(1); |
| this.mockStack.returns(Em.Object.create({ |
| maxToInstall: 1 |
| })); |
| expect(mainHostSummaryView.hasCardinalityConflict('C1')).to.be.true; |
| }); |
| |
| it("totalCount more than maxToInstall", function() { |
| this.mockComponent.returns(2); |
| this.mockStack.returns(Em.Object.create({ |
| maxToInstall: 1 |
| })); |
| expect(mainHostSummaryView.hasCardinalityConflict('C1')).to.be.true; |
| }); |
| |
| it("totalCount less than maxToInstall", function() { |
| this.mockComponent.returns(0); |
| this.mockStack.returns(Em.Object.create({ |
| maxToInstall: 1 |
| })); |
| expect(mainHostSummaryView.hasCardinalityConflict('C1')).to.be.false; |
| }); |
| }); |
| |
| describe("#timeSinceHeartBeat", function () { |
| |
| beforeEach(function() { |
| sinon.stub($, 'timeago').returns('1'); |
| }); |
| |
| afterEach(function() { |
| $.timeago.restore(); |
| }); |
| |
| it("lastHeartBeatTime = null", function() { |
| mainHostSummaryView.set('content.isNotHeartBeating', true); |
| mainHostSummaryView.set('content.lastHeartBeatTime', null); |
| mainHostSummaryView.propertyDidChange('timeSinceHeartBeat'); |
| expect(mainHostSummaryView.get('timeSinceHeartBeat')).to.be.empty; |
| }); |
| |
| it("lastHeartBeatTime = 1", function() { |
| mainHostSummaryView.set('content.isNotHeartBeating', true); |
| mainHostSummaryView.set('content.lastHeartBeatTime', '1'); |
| mainHostSummaryView.propertyDidChange('timeSinceHeartBeat'); |
| expect(mainHostSummaryView.get('timeSinceHeartBeat')).to.be.equal('1'); |
| }); |
| |
| it("host has heartbeat", function() { |
| mainHostSummaryView.set('content.isNotHeartBeating', false); |
| mainHostSummaryView.set('content.lastHeartBeatTime', '1'); |
| mainHostSummaryView.propertyDidChange('timeSinceHeartBeat'); |
| expect(mainHostSummaryView.get('timeSinceHeartBeat')).to.be.equal(Em.I18n.t('common.minute.ago')); |
| }); |
| }); |
| }); |