Repository: ambari Updated Branches: refs/heads/trunk 0503753da -> fac2eece9
AMBARI-15440 Cover create widget views with unit tests. (atkach) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/fac2eece Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/fac2eece Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/fac2eece Branch: refs/heads/trunk Commit: fac2eece9fe9b5bf8169f49448417b922bb56b5e Parents: 0503753 Author: Andrii Tkach <atk...@hortonworks.com> Authored: Wed Mar 16 15:46:06 2016 +0200 Committer: Andrii Tkach <atk...@hortonworks.com> Committed: Thu Mar 17 15:20:32 2016 +0200 ---------------------------------------------------------------------- ambari-web/app/assets/test/tests.js | 4 + .../service/widgets/create/expression_view.js | 18 +- .../main/service/widgets/create/step1_view.js | 3 +- .../main/service/widgets/create/step2_view.js | 7 +- .../main/service/widgets/create/step3_view.js | 3 +- .../widgets/create/expression_view_test.js | 382 ++++++++++++++++++- .../service/widgets/create/step1_view_test.js | 63 +++ .../service/widgets/create/step2_view_test.js | 132 +++++++ .../service/widgets/create/step3_view_test.js | 48 +++ .../service/widgets/create/wizard_view_test.js | 109 ++++++ 10 files changed, 745 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/fac2eece/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 1d5f8ad..6e33833 100644 --- a/ambari-web/app/assets/test/tests.js +++ b/ambari-web/app/assets/test/tests.js @@ -285,6 +285,10 @@ var files = [ 'test/views/main/service/services/storm_test', 'test/views/main/service/services/yarn_test', 'test/views/main/service/widgets/create/expression_view_test', + 'test/views/main/service/widgets/create/wizard_view_test', + 'test/views/main/service/widgets/create/step3_view_test', + 'test/views/main/service/widgets/create/step2_view_test', + 'test/views/main/service/widgets/create/step1_view_test', 'test/views/main/admin/highAvailability/nameNode/step1_view_test', 'test/views/main/admin/highAvailability/nameNode/step3_view_test', 'test/views/main/admin/highAvailability/nameNode/step4_view_test', http://git-wip-us.apache.org/repos/asf/ambari/blob/fac2eece/ambari-web/app/views/main/service/widgets/create/expression_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/service/widgets/create/expression_view.js b/ambari-web/app/views/main/service/widgets/create/expression_view.js index 55f4cd0..3688270 100644 --- a/ambari-web/app/views/main/service/widgets/create/expression_view.js +++ b/ambari-web/app/views/main/service/widgets/create/expression_view.js @@ -96,9 +96,8 @@ App.WidgetWizardExpressionView = Em.View.extend({ /** * add operator to expression data - * @param event */ - addNumber: function (event) { + addNumber: function () { var data = this.get('expression.data'); var lastId = (data.length > 0) ? Math.max.apply(this, data.mapProperty('id')) : 0; @@ -424,7 +423,7 @@ App.InputCursorTextfieldView = Ember.TextField.extend({ }); }.observes('parentView.expression.data.length'), - focusOut: function(evt) { + focusOut: function() { this.saveNumber(); }, @@ -444,7 +443,7 @@ App.InputCursorTextfieldView = Ember.TextField.extend({ isOperator: true })); this.set('value', ''); - } else if (value && value == 'm') { + } else if (value && value === 'm') { // open add metric menu var expressionId = "_" + parentView.get('expression.id'); $('#add-metric-menu' + expressionId + '> div > a').click(); @@ -458,22 +457,19 @@ App.InputCursorTextfieldView = Ember.TextField.extend({ }.observes('value'), keyDown: function (event) { - if ((event.keyCode == 8 || event.which == 8) && !this.get('value')) { // backspace + if ((event.keyCode === 8 || event.which === 8) && !this.get('value')) { // backspace var data = this.get('parentView.expression.data'); if (data.length >= 1) { data.removeObject(data[data.length - 1]); } - } else if (event.keyCode == 13) { //Enter + } else if (event.keyCode === 13) { //Enter this.saveNumber(); } }, saveNumber: function() { - var number_utils = require("utils/number_utils"); - var value = this.get('value'); - if (number_utils.isPositiveNumber(value)) { - var parentView = this.get('parentView'); - var data = parentView.get('expression.data'); + if (number_utils.isPositiveNumber(this.get('value'))) { + var data = this.get('parentView.expression.data'); var lastId = (data.length > 0) ? Math.max.apply(this, data.mapProperty('id')) : 0; data.pushObject(Em.Object.create({ id: ++lastId, http://git-wip-us.apache.org/repos/asf/ambari/blob/fac2eece/ambari-web/app/views/main/service/widgets/create/step1_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/service/widgets/create/step1_view.js b/ambari-web/app/views/main/service/widgets/create/step1_view.js index 8334935..46655ad 100644 --- a/ambari-web/app/views/main/service/widgets/create/step1_view.js +++ b/ambari-web/app/views/main/service/widgets/create/step1_view.js @@ -23,8 +23,7 @@ App.WidgetWizardStep1View = Em.View.extend({ templateName: require('templates/main/service/widgets/create/step1'), didInsertElement: function () { - var controller = this.get('controller'); - controller.loadStep(); + this.get('controller').loadStep(); Em.run.later(this, function () { App.tooltip($("[rel='selectable-tooltip']")); }, 300); http://git-wip-us.apache.org/repos/asf/ambari/blob/fac2eece/ambari-web/app/views/main/service/widgets/create/step2_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/service/widgets/create/step2_view.js b/ambari-web/app/views/main/service/widgets/create/step2_view.js index fb359a1..dbc5bc7 100644 --- a/ambari-web/app/views/main/service/widgets/create/step2_view.js +++ b/ambari-web/app/views/main/service/widgets/create/step2_view.js @@ -23,6 +23,7 @@ App.WidgetWizardStep2View = Em.View.extend({ /** * calculate template by widget type + * @type {object} */ templateType: function () { switch (this.get('controller.content.widgetType')) { @@ -38,7 +39,9 @@ App.WidgetWizardStep2View = Em.View.extend({ case 'GRAPH': return { isGraph: true - } + }; + default: + return {}; } }.property('controller.content.widgetType'), @@ -46,7 +49,7 @@ App.WidgetWizardStep2View = Em.View.extend({ Em.run.later(this, function () { App.tooltip($("[rel='threshold-tooltip']")); }, 500); - }.observes(''), + }, didInsertElement: function () { var controller = this.get('controller'); http://git-wip-us.apache.org/repos/asf/ambari/blob/fac2eece/ambari-web/app/views/main/service/widgets/create/step3_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/service/widgets/create/step3_view.js b/ambari-web/app/views/main/service/widgets/create/step3_view.js index cdb975d..799a6f5 100644 --- a/ambari-web/app/views/main/service/widgets/create/step3_view.js +++ b/ambari-web/app/views/main/service/widgets/create/step3_view.js @@ -21,8 +21,7 @@ App.WidgetWizardStep3View = Em.View.extend({ templateName: require('templates/main/service/widgets/create/step3'), didInsertElement: function () { - var controller = this.get('controller'); - controller.initPreviewData(); + this.get('controller').initPreviewData(); } }); http://git-wip-us.apache.org/repos/asf/ambari/blob/fac2eece/ambari-web/test/views/main/service/widgets/create/expression_view_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/views/main/service/widgets/create/expression_view_test.js b/ambari-web/test/views/main/service/widgets/create/expression_view_test.js index 72c2527..6f1d96d 100644 --- a/ambari-web/test/views/main/service/widgets/create/expression_view_test.js +++ b/ambari-web/test/views/main/service/widgets/create/expression_view_test.js @@ -17,16 +17,23 @@ */ var App = require('app'); +var number_utils = require("utils/number_utils"); +var misc = require('utils/misc'); describe('App.WidgetWizardExpressionView', function () { - var view = App.WidgetWizardExpressionView.create({ - expression: { - data: [] - }, - controller: Em.Object.create({ - updateExpressions: Em.K - }) + var view; + + beforeEach(function() { + view = App.WidgetWizardExpressionView.create({ + expression: { + data: [] + }, + controller: Em.Object.create({ + updateExpressions: Em.K + }) + }); + view.removeObserver('expression.data.length', view, 'validate'); }); describe("#validate()", function() { @@ -180,8 +187,369 @@ describe('App.WidgetWizardExpressionView', function () { testCases.forEach(function (test) { it(test.data.mapProperty('name').join("") + " - isInvalid = " + test.result, function () { view.set('expression.data', test.data); + view.validate(); expect(view.get('isInvalid')).to.equal(test.result); }); }, this); }); + + describe("#isNumberValueInvalid", function() { + + beforeEach(function() { + sinon.stub(number_utils, 'isPositiveNumber').returns(true) + }); + afterEach(function() { + number_utils.isPositiveNumber.restore(); + }); + + it("numberValue is empty", function() { + view.set('numberValue', ''); + view.propertyDidChange('isNumberValueInvalid'); + expect(view.get('isNumberValueInvalid')).to.be.true; + }); + + it("numberValue is ' '", function() { + view.set('numberValue', ' '); + view.propertyDidChange('isNumberValueInvalid'); + expect(view.get('isNumberValueInvalid')).to.be.true; + }); + + it("numberValue is '2'", function() { + view.set('numberValue', '2'); + view.propertyDidChange('isNumberValueInvalid'); + expect(view.get('isNumberValueInvalid')).to.be.false; + }); + }); + + describe("#addOperator()", function() { + + it("add first operator", function() { + var event = {context: 'o1'}; + view.set('expression', Em.Object.create({ + data: [] + })); + view.addOperator(event); + expect(view.get('expression.data').mapProperty('id')).to.eql([1]); + expect(view.get('expression.data').mapProperty('name')).to.eql(['o1']); + }); + + it("add second operator", function() { + var event = {context: 'o2'}; + view.set('expression', Em.Object.create({ + data: [{id: 1, name: 'o1'}] + })); + view.addOperator(event); + expect(view.get('expression.data').mapProperty('id')).to.eql([1, 2]); + expect(view.get('expression.data').mapProperty('name')).to.eql(['o1', 'o2']); + }); + }); + + describe("#addNumber()", function() { + + it("add first number", function() { + view.set('expression', Em.Object.create({ + data: [] + })); + view.set('numberValue', '1'); + view.addNumber(); + expect(view.get('expression.data').mapProperty('id')).to.eql([1]); + expect(view.get('expression.data').mapProperty('name')).to.eql(['1']); + expect(view.get('numberValue')).to.be.empty; + }); + + it("add second number", function() { + view.set('expression', Em.Object.create({ + data: [{id: 1, name: '1'}] + })); + view.set('numberValue', '2'); + view.addNumber(); + expect(view.get('expression.data').mapProperty('id')).to.eql([1, 2]); + expect(view.get('expression.data').mapProperty('name')).to.eql(['1', '2']); + expect(view.get('numberValue')).to.be.empty; + }); + }); + + describe("#redrawField()", function() { + + beforeEach(function() { + sinon.stub(misc, 'sortByOrder').returns([{}]); + }); + afterEach(function() { + misc.sortByOrder.restore(); + }); + + it("sortByOrder should be called", function() { + view.redrawField(); + expect(misc.sortByOrder.calledOnce).to.be.true; + expect(view.get('expression.data')).to.be.eql([{}]); + }); + }); + + describe("#didInsertElement()", function() { + + beforeEach(function() { + sinon.stub(view, 'propertyDidChange'); + sinon.stub(Em.run, 'next'); + }); + afterEach(function() { + view.propertyDidChange.restore(); + Em.run.next.restore(); + }); + + it("Em.run.next should be called", function() { + view.didInsertElement(); + expect(view.propertyDidChange.calledOnce).to.be.true; + expect(Em.run.next.calledOnce).to.be.true; + }); + }); + + describe("#removeElement()", function() { + + it("object should be removed", function() { + var event = {context: 'el1'}; + view.set('expression.data', [event.context]); + view.removeElement(event); + expect(view.get('expression.data')).to.be.empty; + }); + }); +}); + +describe("App.AddNumberExpressionView", function() { + + var view; + + beforeEach(function() { + view = App.AddNumberExpressionView.create(); + }); + + describe("#isInvalid", function() { + + beforeEach(function() { + sinon.stub(number_utils, 'isPositiveNumber').returns(true) + }); + afterEach(function() { + number_utils.isPositiveNumber.restore(); + }); + + it("value is empty", function() { + view.set('value', ''); + view.propertyDidChange('isInvalid'); + expect(view.get('isInvalid')).to.be.false; + }); + + it("value is ' '", function() { + view.set('value', ' '); + view.propertyDidChange('isInvalid'); + expect(view.get('isInvalid')).to.be.false; + }); + + it("value is '2'", function() { + view.set('value', '2'); + view.propertyDidChange('isInvalid'); + expect(view.get('isInvalid')).to.be.false; + }); + }); +}); + +describe("App.InputCursorTextfieldView", function() { + + var view; + + beforeEach(function() { + view = App.InputCursorTextfieldView.create({ + parentView: App.WidgetWizardExpressionView.create({ + expression: { + data: [] + }, + controller: Em.Object.create({ + updateExpressions: Em.K + }) + }) + }); + view.removeObserver('value', view, 'validateInput'); + }); + + describe("#didInsertElement()", function() { + + beforeEach(function() { + sinon.stub(view, 'focusCursor'); + }); + afterEach(function() { + view.focusCursor.restore(); + }); + + it("focusCursor should be called", function() { + view.didInsertElement(); + expect(view.focusCursor.calledOnce).to.be.true; + }); + }); + + describe("#focusOut()", function() { + + beforeEach(function() { + sinon.stub(view, 'saveNumber'); + }); + afterEach(function() { + view.saveNumber.restore(); + }); + + it("saveNumber should be called", function() { + view.focusOut(); + expect(view.saveNumber.calledOnce).to.be.true; + }); + }); + + describe("#focusCursor()", function() { + var mock = { + focus: Em.K + }; + + beforeEach(function() { + sinon.stub(Em.run, 'next', Em.clb); + sinon.stub(view, '$').returns(mock); + sinon.stub(mock, 'focus'); + view.focusCursor(); + }); + afterEach(function() { + Em.run.next.restore(); + view.$.restore(); + mock.focus.restore(); + }); + + it("Em.run.next should be called", function() { + expect(Em.run.next.calledOnce).to.be.true; + }); + + it("$ should be called", function() { + expect(view.$.calledTwice).to.be.true; + }); + + it("focus should be called", function() { + expect(mock.focus.calledOnce).to.be.true; + }); + }); + + describe("#validateInput()", function() { + + beforeEach(function() { + this.mock = sinon.stub(number_utils, 'isPositiveNumber'); + }); + afterEach(function() { + this.mock.restore(); + }); + + it("value is positive number", function() { + this.mock.returns(true); + view.validateInput(); + expect(view.get('isInvalid')).to.be.false; + }); + + it("value is null", function() { + this.mock.returns(false); + view.set('value', null); + view.validateInput(); + expect(view.get('isInvalid')).to.be.false; + }); + + it("value is empty", function() { + this.mock.returns(false); + view.set('value', ''); + view.validateInput(); + expect(view.get('isInvalid')).to.be.false; + }); + + it("value is operator", function() { + this.mock.returns(false); + view.set('value', '+'); + view.validateInput(); + expect(view.get('isInvalid')).to.be.false; + expect(view.get('parentView.expression.data')).to.not.be.empty; + expect(view.get('value')).to.be.empty; + }); + + it("value is 'm'", function() { + this.mock.returns(false); + view.set('value', '+'); + view.validateInput(); + expect(view.get('isInvalid')).to.be.false; + expect(view.get('value')).to.be.empty; + }); + + it("value is invalid", function() { + this.mock.returns(false); + view.set('value', '%'); + view.validateInput(); + expect(view.get('isInvalid')).to.be.true; + }); + }); + + describe("#keyDown()", function() { + + beforeEach(function() { + sinon.stub(view, 'saveNumber'); + }); + afterEach(function() { + view.saveNumber.restore(); + }); + + it("unexpected key", function() { + view.set('parentView.expression.data', [{name: '1'}, {name: '2'}]); + view.keyDown({keyCode: 9}); + expect(view.saveNumber.called).to.be.false; + expect(view.get('parentView.expression.data.length')).to.be.equal(2); + }); + + it("backspace key and not empty value", function() { + view.set('value', 'm'); + view.set('parentView.expression.data', [{name: '1'}, {name: '2'}]); + view.keyDown({keyCode: 8}); + expect(view.saveNumber.called).to.be.false; + expect(view.get('parentView.expression.data.length')).to.be.equal(2); + }); + + it("backspace key and empty value", function() { + view.set('value', ''); + view.set('parentView.expression.data', [{name: '1'}, {name: '2'}]); + view.keyDown({keyCode: 8}); + expect(view.saveNumber.called).to.be.false; + expect(view.get('parentView.expression.data.length')).to.be.equal(1); + }); + + it("enter key", function() { + view.set('value', ''); + view.set('parentView.expression.data', [{name: '1'}, {name: '2'}]); + view.keyDown({keyCode: 13}); + expect(view.saveNumber.called).to.be.true; + expect(view.get('parentView.expression.data.length')).to.be.equal(2); + }); + }); + + describe("#saveNumber()", function() { + + beforeEach(function() { + this.mock = sinon.stub(number_utils, 'isPositiveNumber'); + }); + afterEach(function() { + this.mock.restore(); + }); + + it("value is a positive number", function() { + view.set('value', '1'); + this.mock.returns(true); + view.saveNumber(); + expect(view.get('parentView.expression.data').mapProperty('name')).to.be.eql(['1']); + expect(view.get('numberValue')).to.be.empty; + expect(view.get('isInvalid')).to.be.false; + expect(view.get('value')).to.be.empty; + }); + + it("value is not a positive number", function() { + view.set('value', '-1'); + this.mock.returns(false); + view.saveNumber(); + expect(view.get('parentView.expression.data')).to.be.empty; + expect(view.get('value')).to.be.equal('-1'); + }); + }); + }); http://git-wip-us.apache.org/repos/asf/ambari/blob/fac2eece/ambari-web/test/views/main/service/widgets/create/step1_view_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/views/main/service/widgets/create/step1_view_test.js b/ambari-web/test/views/main/service/widgets/create/step1_view_test.js new file mode 100644 index 0000000..b2eb779 --- /dev/null +++ b/ambari-web/test/views/main/service/widgets/create/step1_view_test.js @@ -0,0 +1,63 @@ +/** + * 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('/views/main/service/widgets/create/step1_view'); + + +describe('App.WidgetWizardStep1View', function () { + var view; + + beforeEach(function() { + view = App.WidgetWizardStep1View.create({ + controller: Em.Object.create({ + content: Em.Object.create(), + loadStep: Em.K + }) + }); + }); + + describe("#didInsertElement()", function() { + + beforeEach(function () { + sinon.stub(Em.run, 'later', function (ctx, callback) { + callback(); + }); + sinon.stub(App, 'tooltip'); + sinon.stub(view.get('controller'), 'loadStep'); + view.didInsertElement(); + }); + afterEach(function () { + Em.run.later.restore(); + App.tooltip.restore(); + view.get('controller').loadStep.restore(); + }); + + it("loadStep should be called", function() { + expect(view.get('controller').loadStep.calledOnce).to.be.true; + }); + + it("Em.run.later should be called", function() { + expect(Em.run.later.calledOnce).to.be.true; + }); + + it("App.tooltip should be called", function() { + expect(App.tooltip.calledOnce).to.be.true; + }); + }); +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/fac2eece/ambari-web/test/views/main/service/widgets/create/step2_view_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/views/main/service/widgets/create/step2_view_test.js b/ambari-web/test/views/main/service/widgets/create/step2_view_test.js new file mode 100644 index 0000000..f2baf86 --- /dev/null +++ b/ambari-web/test/views/main/service/widgets/create/step2_view_test.js @@ -0,0 +1,132 @@ +/** + * 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('/views/main/service/widgets/create/step2_view'); + + +describe('App.WidgetWizardStep2View', function () { + var view; + + beforeEach(function() { + view = App.WidgetWizardStep2View.create({ + controller: Em.Object.create({ + content: Em.Object.create(), + convertData: Em.K, + initWidgetData: Em.K, + renderProperties: Em.K, + updateExpressions: Em.K + }) + }); + }); + + describe("#templateType", function () { + + it("widgetType is null", function () { + view.set('controller.content.widgetType', null); + view.propertyDidChange('templateType'); + expect(view.get('templateType')).to.be.empty; + }); + + it("widgetType is GAUGE", function () { + view.set('controller.content.widgetType', 'GAUGE'); + view.propertyDidChange('templateType'); + expect(view.get('templateType')).to.eql({isNumber: true}); + }); + + it("widgetType is NUMBER", function () { + view.set('controller.content.widgetType', 'NUMBER'); + view.propertyDidChange('templateType'); + expect(view.get('templateType')).to.eql({isNumber: true}); + }); + + it("widgetType is TEMPLATE", function () { + view.set('controller.content.widgetType', 'TEMPLATE'); + view.propertyDidChange('templateType'); + expect(view.get('templateType')).to.eql({isTemplate: true}); + }); + + it("widgetType is GRAPH", function () { + view.set('controller.content.widgetType', 'GRAPH'); + view.propertyDidChange('templateType'); + expect(view.get('templateType')).to.eql({isGraph: true}); + }); + }); + + describe("#ensureTooltip()", function() { + + beforeEach(function () { + sinon.stub(Em.run, 'later', function (ctx, callback) { + callback(); + }); + sinon.stub(App, 'tooltip'); + view.ensureTooltip(); + }); + afterEach(function () { + Em.run.later.restore(); + App.tooltip.restore(); + }); + + it("Em.run.later should be called", function() { + expect(Em.run.later.calledOnce).to.be.true; + }); + + it("App.tooltip should be called", function() { + expect(App.tooltip.calledOnce).to.be.true; + }); + }); + + describe("#didInsertElement()", function () { + + beforeEach(function () { + sinon.stub(view, 'ensureTooltip'); + sinon.stub(view.get('controller'), 'convertData'); + sinon.stub(view.get('controller'), 'initWidgetData'); + sinon.stub(view.get('controller'), 'renderProperties'); + sinon.stub(view.get('controller'), 'updateExpressions'); + view.didInsertElement(); + }); + afterEach(function () { + view.ensureTooltip.restore(); + view.get('controller').convertData.restore(); + view.get('controller').initWidgetData.restore(); + view.get('controller').renderProperties.restore(); + view.get('controller').updateExpressions.restore(); + }); + + it("ensureTooltip should be called", function () { + expect(view.ensureTooltip.calledOnce).to.be.true; + }); + + it("convertData should be called", function () { + expect(view.get('controller').convertData.calledOnce).to.be.true; + }); + + it("initWidgetData should be called", function () { + expect(view.get('controller').initWidgetData.calledOnce).to.be.true; + }); + + it("renderProperties should be called", function () { + expect(view.get('controller').renderProperties.calledOnce).to.be.true; + }); + + it("updateExpressions should be called", function () { + expect(view.get('controller').updateExpressions.calledOnce).to.be.true; + }); + }); +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/fac2eece/ambari-web/test/views/main/service/widgets/create/step3_view_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/views/main/service/widgets/create/step3_view_test.js b/ambari-web/test/views/main/service/widgets/create/step3_view_test.js new file mode 100644 index 0000000..f7bb2bf --- /dev/null +++ b/ambari-web/test/views/main/service/widgets/create/step3_view_test.js @@ -0,0 +1,48 @@ +/** + * 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('/views/main/service/widgets/create/step3_view'); + + +describe('App.WidgetWizardStep3View', function () { + var view; + + beforeEach(function() { + view = App.WidgetWizardStep3View.create({ + controller: Em.Object.create({ + initPreviewData: Em.K + }) + }); + }); + + describe("#didInsertElement()", function() { + + beforeEach(function () { + sinon.stub(view.get('controller'), 'initPreviewData'); + }); + afterEach(function () { + view.get('controller').initPreviewData.restore(); + }); + + it("initPreviewData should be called", function() { + view.didInsertElement(); + expect(view.get('controller').initPreviewData.calledOnce).to.be.true; + }); + }); +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/fac2eece/ambari-web/test/views/main/service/widgets/create/wizard_view_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/views/main/service/widgets/create/wizard_view_test.js b/ambari-web/test/views/main/service/widgets/create/wizard_view_test.js new file mode 100644 index 0000000..50eea41 --- /dev/null +++ b/ambari-web/test/views/main/service/widgets/create/wizard_view_test.js @@ -0,0 +1,109 @@ +/** + * 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('/views/main/service/widgets/create/wizard_view'); + + +describe('App.WidgetWizardView', function () { + var view; + + beforeEach(function() { + view = App.WidgetWizardView.create({ + controller: Em.Object.create({ + content: Em.Object.create() + }) + }); + }); + + describe("#previewWidgetClass", function() { + + it("widgetType is null", function() { + view.set('controller.content.widgetType', null); + view.propertyDidChange('previewWidgetClass'); + expect(view.get('previewWidgetClass').create()).to.be.instanceof(Em.View); + }); + + it("widgetType is GRAPH", function() { + view.set('controller.content.widgetType', 'GRAPH'); + view.propertyDidChange('previewWidgetClass'); + expect(view.get('previewWidgetClass').create()).to.be.instanceof(App.GraphWidgetView); + }); + + it("widgetType is TEMPLATE", function() { + view.set('controller.content.widgetType', 'TEMPLATE'); + view.propertyDidChange('previewWidgetClass'); + expect(view.get('previewWidgetClass').create()).to.be.instanceof(App.TemplateWidgetView); + }); + + it("widgetType is NUMBER", function() { + view.set('controller.content.widgetType', 'NUMBER'); + view.propertyDidChange('previewWidgetClass'); + expect(view.get('previewWidgetClass').create()).to.be.instanceof(App.NumberWidgetView); + }); + + it("widgetType is GAUGE", function() { + view.set('controller.content.widgetType', 'GAUGE'); + view.propertyDidChange('previewWidgetClass'); + expect(view.get('previewWidgetClass').create()).to.be.instanceof(App.GaugeWidgetView); + }); + }); + + describe("#isStep2", function() { + + it("currentStep is '2'", function() { + view.set('controller.currentStep', '2'); + view.propertyDidChange('isStep2'); + expect(view.get('isStep2')).to.be.true; + }); + + it("currentStep is 2", function() { + view.set('controller.currentStep', 2); + view.propertyDidChange('isStep2'); + expect(view.get('isStep2')).to.be.true; + }); + + it("currentStep is null", function() { + view.set('controller.currentStep', null); + view.propertyDidChange('isStep2'); + expect(view.get('isStep2')).to.be.false; + }); + }); + + describe("#isStep3", function() { + + it("currentStep is '3'", function() { + view.set('controller.currentStep', '3'); + view.propertyDidChange('isStep3'); + expect(view.get('isStep3')).to.be.true; + }); + + it("currentStep is 3", function() { + view.set('controller.currentStep', 3); + view.propertyDidChange('isStep3'); + expect(view.get('isStep3')).to.be.true; + }); + + it("currentStep is null", function() { + view.set('controller.currentStep', null); + view.propertyDidChange('isStep3'); + expect(view.get('isStep3')).to.be.false; + }); + }); + +});