You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by on...@apache.org on 2015/12/10 15:14:16 UTC

[5/5] ambari git commit: AMBARI-14319. Add common tests for Em.computed macros (2) (onechiporenko)

AMBARI-14319. Add common tests for Em.computed macros (2) (onechiporenko)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/8750537a
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/8750537a
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/8750537a

Branch: refs/heads/trunk
Commit: 8750537a335f1975bdee53ff229b6a7a2cb07a4d
Parents: 4330659
Author: Oleg Nechiporenko <on...@apache.org>
Authored: Thu Dec 10 16:07:57 2015 +0200
Committer: Oleg Nechiporenko <on...@apache.org>
Committed: Thu Dec 10 16:07:57 2015 +0200

----------------------------------------------------------------------
 .../widgets/hbase_regions_in_transition.js      |   4 +-
 .../views/main/dashboard/widgets/text_widget.js |   4 +-
 ambari-web/test/aliases/computed/and.js         |  75 ++++++++++
 ambari-web/test/aliases/computed/or.js          |  76 ++++++++++
 ambari-web/test/controllers/application_test.js |  31 ++--
 .../global/cluster_controller_test.js           |   4 +
 .../global/update_controller_test.js            |   2 +
 .../controllers/main/admin/kerberos_test.js     |   2 +
 .../definitions_configs_controller_test.js      |  16 +-
 .../definitions_details_controller_test.js      |  12 ++
 ...anage_alert_notifications_controller_test.js |  25 +++-
 .../main/service/info/summary_test.js           |   6 +
 .../widgets/create/step3_controller_test.js     |  23 +--
 .../test/controllers/wizard/step2_test.js       |  42 +-----
 .../test/controllers/wizard/step3_test.js       |   2 +
 .../test/controllers/wizard/step6_test.js       |  52 +------
 .../test/controllers/wizard/step7_test.js       |   2 +
 ambari-web/test/init_computed_aliases.js        |  31 +++-
 .../test/models/alerts/alert_definition_test.js |  10 +-
 .../objects/service_config_property_test.js     |   2 +
 .../configs/service_config_version_test.js      |  41 +-----
 .../test/models/configs/sub_section_test.js     |  14 +-
 .../test/models/stack_service_component_test.js |   2 +
 .../configs/widgets/config_widget_view_test.js  |  27 ++--
 .../common/form/spinner_input_view_test.js      |   9 +-
 .../stack_upgrade/upgrade_task_view_test.js     |  29 +---
 .../stack_upgrade/upgrade_wizard_view_test.js   |  32 +---
 .../main/alerts/definition_details_view_test.js |  23 ++-
 .../widgets/hbase_regions_in_transition_test.js |   2 +
 .../widgets/node_managers_live_test.js          |  82 +----------
 .../main/dashboard/widgets/text_widget_test.js  |   2 +
 ambari-web/test/views/wizard/step1_view_test.js | 147 +------------------
 32 files changed, 354 insertions(+), 477 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/app/views/main/dashboard/widgets/hbase_regions_in_transition.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/dashboard/widgets/hbase_regions_in_transition.js b/ambari-web/app/views/main/dashboard/widgets/hbase_regions_in_transition.js
index 3c22a5c..18902b5 100644
--- a/ambari-web/app/views/main/dashboard/widgets/hbase_regions_in_transition.js
+++ b/ambari-web/app/views/main/dashboard/widgets/hbase_regions_in_transition.js
@@ -33,10 +33,8 @@ App.HBaseRegionsInTransitionView = App.TextDashboardWidgetView.extend({
 
   classNameBindings: ['isRed', 'isOrange', 'isGreen', 'isNA'],
   isGreen: Em.computed.lteProperties('data', 'thresh1'),
-  isNotGreen: Em.computed.not('isGreen'),
   isRed: Em.computed.gtProperties('data', 'thresh2'),
-  isNotRed: Em.computed.not('isRed'),
-  isOrange: Em.computed.and('isNotGreen', 'isNotRed'),
+  isOrange: Em.computed.and('!isGreen', '!isRed'),
   isNA: function () {
     return this.get('data') === null;
   }.property('data'),

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/app/views/main/dashboard/widgets/text_widget.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/dashboard/widgets/text_widget.js b/ambari-web/app/views/main/dashboard/widgets/text_widget.js
index 4389cb3..6d257a1 100644
--- a/ambari-web/app/views/main/dashboard/widgets/text_widget.js
+++ b/ambari-web/app/views/main/dashboard/widgets/text_widget.js
@@ -26,10 +26,8 @@ App.TextDashboardWidgetView = App.DashboardWidgetView.extend({
   classNameBindings: ['isRed', 'isOrange', 'isGreen', 'isNA'],
 
   isRed: Em.computed.lteProperties('data', 'thresh1'),
-  isNotRed: Em.computed.not('isRed'),
-  isOrange: Em.computed.and('isNotGreen', 'isNotRed'),
+  isOrange: Em.computed.and('!isGreen', '!isRed'),
   isGreen: Em.computed.gtProperties('data', 'thresh2'),
-  isNotGreen: Em.computed.not('isGreen'),
 
   isNA: function () {
     return this.get('data') === null;

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/aliases/computed/and.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/aliases/computed/and.js b/ambari-web/test/aliases/computed/and.js
new file mode 100644
index 0000000..1e6ddf4
--- /dev/null
+++ b/ambari-web/test/aliases/computed/and.js
@@ -0,0 +1,75 @@
+/**
+ * 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 objectUtils = require('utils/object_utils');
+
+var helpers = App.TestAliases.helpers;
+
+function getTrulyCombination(dependentKeys) {
+  var hash = {};
+  dependentKeys.forEach(function (key) {
+    if (key.startsWith('!')) {
+      hash[key.substr(1)] = false;
+    }
+    else {
+      hash[key] = true;
+    }
+  });
+  return hash;
+}
+
+/**
+ *
+ * @param {Em.Object} context
+ * @param {string} propertyName
+ * @param {string[]} dependentKeys
+ */
+App.TestAliases.testAsComputedAnd = function (context, propertyName, dependentKeys) {
+
+  var realKeys = dependentKeys.map(function (key) {
+    return key.startsWith('!') ? key.substr(1) : key;
+  });
+  var trulyCombination = getTrulyCombination(dependentKeys);
+  var binaryCombos = helpers.getBinaryCombos(realKeys);
+
+  describe('#' + propertyName + ' as Em.computed.and', function () {
+
+    afterEach(function () {
+      helpers.smartRestoreGet(context);
+    });
+
+    it('has valid dependent keys', function () {
+      expect(Em.meta(context).descs[propertyName]._dependentKeys).to.eql(realKeys);
+    });
+
+    binaryCombos.forEach(function (combo) {
+
+      var expectedResult = objectUtils.deepEqual(trulyCombination, combo);
+
+      it('`' + expectedResult + '` for ' + JSON.stringify(combo), function() {
+        helpers.smartStubGet(context, combo)
+          .propertyDidChange(context, propertyName);
+        var value = helpers.smartGet(context, propertyName);
+        expect(value).to.equal(expectedResult);
+      });
+
+    });
+
+  });
+
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/aliases/computed/or.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/aliases/computed/or.js b/ambari-web/test/aliases/computed/or.js
new file mode 100644
index 0000000..8bf25c5
--- /dev/null
+++ b/ambari-web/test/aliases/computed/or.js
@@ -0,0 +1,76 @@
+/**
+ * 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 objectUtils = require('utils/object_utils');
+
+var helpers = App.TestAliases.helpers;
+
+function getFalsyCombination(dependentKeys) {
+  var hash = {};
+  dependentKeys.forEach(function (key) {
+    if (key.startsWith('!')) {
+      hash[key.substr(1)] = true;
+    }
+    else {
+      hash[key] = false;
+    }
+  });
+  return hash;
+}
+
+
+/**
+ *
+ * @param {Em.Object} context
+ * @param {string} propertyName
+ * @param {string[]} dependentKeys
+ */
+App.TestAliases.testAsComputedOr = function (context, propertyName, dependentKeys) {
+
+  var realKeys = dependentKeys.map(function (key) {
+    return key.startsWith('!') ? key.substr(1) : key;
+  });
+  var falsyCombination = getFalsyCombination(dependentKeys);
+  var binaryCombos = helpers.getBinaryCombos(realKeys);
+
+  describe('#' + propertyName + ' as Em.computed.or', function () {
+
+    afterEach(function () {
+      helpers.smartRestoreGet(context);
+    });
+
+    it('has valid dependent keys', function () {
+      expect(Em.meta(context).descs[propertyName]._dependentKeys).to.eql(realKeys);
+    });
+
+    binaryCombos.forEach(function (combo) {
+
+      var expectedResult = !objectUtils.deepEqual(falsyCombination, combo);
+
+      it('`' + expectedResult + '` for ' + JSON.stringify(combo), function() {
+        helpers.smartStubGet(context, combo)
+          .propertyDidChange(context, propertyName);
+        var value = helpers.smartGet(context, propertyName);
+        expect(value).to.equal(expectedResult);
+      });
+
+    });
+
+  });
+
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/controllers/application_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/application_test.js b/ambari-web/test/controllers/application_test.js
index dbe5a96..efe5103 100644
--- a/ambari-web/test/controllers/application_test.js
+++ b/ambari-web/test/controllers/application_test.js
@@ -20,9 +20,17 @@
 var App = require('app');
 require('models/cluster');
 
+function getController() {
+  return App.ApplicationController.create();
+}
+
 describe('App.ApplicationController', function () {
 
-  var applicationController = App.ApplicationController.create();
+  var applicationController = getController();
+
+  App.TestAliases.testAsComputedAnd(getController(), 'isClusterDataLoaded', ['App.router.clusterController.isLoaded','App.router.loggedIn']);
+
+  App.TestAliases.testAsComputedAnd(getController(), 'isExistingClusterDataLoaded', ['App.router.clusterInstallCompleted','isClusterDataLoaded']);
 
   describe('#showAboutPopup', function() {
     var dataToShowRes = {};
@@ -109,25 +117,4 @@ describe('App.ApplicationController', function () {
     });
   });
 
-  describe('#clusterDisplayName', function() {
-    it ('Should return cluster display name', function() {
-      applicationController.set('clusterName', '');
-      expect(applicationController.get('clusterDisplayName')).to.equal('mycluster');
-    });
-  });
-
-  describe('#isClusterDataLoaded', function() {
-    beforeEach(function () {
-      var stub = sinon.stub(App, 'get');
-      stub.withArgs('router.clusterController.isLoaded').returns(true);
-      stub.withArgs('router.loggedIn').returns(true);
-    });
-    afterEach(function () {
-      App.get.restore();
-    });
-    it ('Should return true, when data loaded', function() {
-      expect(applicationController.get('isClusterDataLoaded')).to.be.true;
-    });
-  });
-
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/controllers/global/cluster_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/global/cluster_controller_test.js b/ambari-web/test/controllers/global/cluster_controller_test.js
index 2b01ea0..c2f3498 100644
--- a/ambari-web/test/controllers/global/cluster_controller_test.js
+++ b/ambari-web/test/controllers/global/cluster_controller_test.js
@@ -35,6 +35,10 @@ describe('App.clusterController', function () {
     {service_name: 'GANGLIA'}
   ];
 
+  App.TestAliases.testAsComputedAnd(controller, 'isHostContentLoaded', ['isHostsLoaded', 'isComponentsStateLoaded']);
+
+  App.TestAliases.testAsComputedAnd(controller, 'isServiceContentFullyLoaded', ['isServiceMetricsLoaded', 'isComponentsStateLoaded', 'isComponentsConfigLoaded']);
+
   App.TestAliases.testAsComputedAlias(controller, 'clusterName', 'App.clusterName', 'string');
 
   describe('#updateLoadStatus()', function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/controllers/global/update_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/global/update_controller_test.js b/ambari-web/test/controllers/global/update_controller_test.js
index fc29aa0..482e58c 100644
--- a/ambari-web/test/controllers/global/update_controller_test.js
+++ b/ambari-web/test/controllers/global/update_controller_test.js
@@ -30,6 +30,8 @@ describe('App.UpdateController', function () {
 
   App.TestAliases.testAsComputedAlias(App.UpdateController.create(), 'clusterName', 'App.router.clusterController.clusterName', 'string');
 
+  App.TestAliases.testAsComputedAnd(App.UpdateController.create(), 'updateAlertInstances', ['isWorking', '!App.router.mainAlertInstancesController.isUpdating']);
+
   describe('#getUrl()', function () {
 
     it('testMode = true', function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/controllers/main/admin/kerberos_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/admin/kerberos_test.js b/ambari-web/test/controllers/main/admin/kerberos_test.js
index 8130941..4b58069 100644
--- a/ambari-web/test/controllers/main/admin/kerberos_test.js
+++ b/ambari-web/test/controllers/main/admin/kerberos_test.js
@@ -26,6 +26,8 @@ describe('App.MainAdminKerberosController', function() {
 
   App.TestAliases.testAsComputedSomeBy(controller, 'isPropertiesChanged', 'stepConfigs', 'isPropertiesChanged', true);
 
+  App.TestAliases.testAsComputedOr(controller, 'isSaveButtonDisabled', ['isSubmitDisabled', '!isPropertiesChanged']);
+
   describe('#prepareConfigProperties', function() {
     beforeEach(function() {
       sinon.stub(App.Service, 'find').returns([

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/controllers/main/alerts/definitions_configs_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/alerts/definitions_configs_controller_test.js b/ambari-web/test/controllers/main/alerts/definitions_configs_controller_test.js
index ac06de7..097fc00 100644
--- a/ambari-web/test/controllers/main/alerts/definitions_configs_controller_test.js
+++ b/ambari-web/test/controllers/main/alerts/definitions_configs_controller_test.js
@@ -20,16 +20,22 @@ var App = require('app');
 
 var controller;
 
+function getController() {
+  return App.MainAlertDefinitionConfigsController.create({
+    allServices: ['service1', 'service2', 'service3'],
+    allComponents: ['component1', 'component2', 'component3'],
+    aggregateAlertNames: ['alertDefinitionName', 'alertDefinitionName2', 'alertDefinitionName3']
+  });
+}
+
 describe('App.MainAlertDefinitionConfigsController', function () {
 
   beforeEach(function () {
-    controller = App.MainAlertDefinitionConfigsController.create({
-      allServices: ['service1', 'service2', 'service3'],
-      allComponents: ['component1', 'component2', 'component3'],
-      aggregateAlertNames: ['alertDefinitionName', 'alertDefinitionName2', 'alertDefinitionName3']
-    });
+    controller = getController();
   });
 
+  App.TestAliases.testAsComputedOr(getController(), 'hasErrors', ['someConfigIsInvalid', 'hasThresholdsError']);
+
   describe('#renderConfigs()', function () {
 
     beforeEach(function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/controllers/main/alerts/definitions_details_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/alerts/definitions_details_controller_test.js b/ambari-web/test/controllers/main/alerts/definitions_details_controller_test.js
index 7b56068..2eb91c8 100644
--- a/ambari-web/test/controllers/main/alerts/definitions_details_controller_test.js
+++ b/ambari-web/test/controllers/main/alerts/definitions_details_controller_test.js
@@ -36,6 +36,18 @@ describe('App.MainAlertDefinitionDetailsController', function () {
 
   App.TestAliases.testAsComputedMapBy(getController(), 'groupsList', 'content.groups', 'displayName');
 
+  App.TestAliases.testAsComputedOr(getController(), 'isEditing', ['editing.label.isEditing', 'App.router.mainAlertDefinitionConfigsController.canEdit']);
+
+  describe('#showSavePopup', function () {
+    var popup;
+    beforeEach(function () {
+      popup = getController().showSavePopup();
+    });
+
+    App.TestAliases.testAsComputedOr(getController().showSavePopup(), 'disablePrimary', ['App.router.mainAlertDefinitionDetailsController.editing.label.isError', 'App.router.mainAlertDefinitionConfigsController.hasErrors']);
+
+  });
+
   describe('#labelValidation()', function () {
 
     it('should set editing.label.isError to true', function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/controllers/main/alerts/manage_alert_notifications_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/alerts/manage_alert_notifications_controller_test.js b/ambari-web/test/controllers/main/alerts/manage_alert_notifications_controller_test.js
index 6c48b64..25ed383 100644
--- a/ambari-web/test/controllers/main/alerts/manage_alert_notifications_controller_test.js
+++ b/ambari-web/test/controllers/main/alerts/manage_alert_notifications_controller_test.js
@@ -20,10 +20,16 @@ var App = require('app');
 var controller;
 var helpers = require('test/helpers');
 
+
+function getController() {
+  return App.ManageAlertNotificationsController.create({});
+}
+var createEditPopupView = getController().showCreateEditPopup();
+
 describe('App.ManageAlertNotificationsController', function () {
 
   beforeEach(function () {
-    controller = App.ManageAlertNotificationsController.create({});
+    controller = getController();
     sinon.stub($, 'ajax', Em.K);
   });
 
@@ -503,13 +509,11 @@ describe('App.ManageAlertNotificationsController', function () {
 
     });
 
-    describe('#bodyClass', function () {
-
-      var view;
-
-      beforeEach(function () {
+    App.TestAliases.testAsComputedOr(getController().showCreateEditPopup(), 'disablePrimary', ['isSaving', 'hasErrors']);
 
-        view = controller.showCreateEditPopup().get('bodyClass').create({
+    describe('#bodyClass', function () {
+      function getBodyClass() {
+        return createEditPopupView.get('bodyClass').create({
           controller: Em.Object.create({
             inputFields: {
               name: {},
@@ -528,9 +532,16 @@ describe('App.ManageAlertNotificationsController', function () {
             hasErrors: false
           })
         });
+      }
+
+      var view;
 
+      beforeEach(function () {
+        view = getBodyClass();
       });
 
+      App.TestAliases.testAsComputedOr(getBodyClass(), 'someErrorExists', ['nameError', 'emailToError', 'emailFromError', 'smtpPortError', 'hostError', 'portError', 'passwordError']);
+
       describe('#selectAllGroups', function () {
 
         it('should check inputFields.allGroups.value', function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/controllers/main/service/info/summary_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/info/summary_test.js b/ambari-web/test/controllers/main/service/info/summary_test.js
index b42175b..bec3be1 100644
--- a/ambari-web/test/controllers/main/service/info/summary_test.js
+++ b/ambari-web/test/controllers/main/service/info/summary_test.js
@@ -19,6 +19,10 @@
 var App = require('app');
 require('controllers/main/service/info/summary');
 
+function getController() {
+  return App.MainServiceInfoSummaryController.create();
+}
+
 describe('App.MainServiceInfoSummaryController', function () {
 
   var controller;
@@ -27,6 +31,8 @@ describe('App.MainServiceInfoSummaryController', function () {
     controller = App.MainServiceInfoSummaryController.create();
   });
 
+App.TestAliases.testAsComputedOr(getController(), 'showTimeRangeControl', ['!isServiceWithEnhancedWidgets', 'someWidgetGraphExists']);
+
   describe('#setRangerPlugins', function () {
 
     var cases = [

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/controllers/main/service/widgets/create/step3_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/widgets/create/step3_controller_test.js b/ambari-web/test/controllers/main/service/widgets/create/step3_controller_test.js
index b6f46f3..144918e 100644
--- a/ambari-web/test/controllers/main/service/widgets/create/step3_controller_test.js
+++ b/ambari-web/test/controllers/main/service/widgets/create/step3_controller_test.js
@@ -34,28 +34,7 @@ describe('App.WidgetWizardStep3Controller', function () {
 
   App.TestAliases.testAsComputedGte(controller, 'isDescriptionInvalid', 'widgetDescription.length', 2049);
 
-  describe("#isSubmitDisabled", function () {
-    it("widgetName - null", function () {
-      controller.set('widgetName', null);
-      controller.propertyDidChange('isSubmitDisabled');
-      expect(controller.get('isSubmitDisabled')).to.be.true;
-    });
-    it("widgetName empty ", function () {
-      controller.set('widgetName', '');
-      controller.propertyDidChange('isSubmitDisabled');
-      expect(controller.get('isSubmitDisabled')).to.be.true;
-    });
-    it("widgetName contains only whitespace", function () {
-      controller.set('widgetName', ' ');
-      controller.propertyDidChange('isSubmitDisabled');
-      expect(controller.get('isSubmitDisabled')).to.be.true;
-    });
-    it("widgetName correct", function () {
-      controller.set('widgetName', 'w1');
-      controller.propertyDidChange('isSubmitDisabled');
-      expect(controller.get('isSubmitDisabled')).to.be.false;
-    });
-  });
+  App.TestAliases.testAsComputedOr(controller, 'isSubmitDisabled', ['widgetNameEmpty', 'isNameInvalid', 'isDescriptionInvalid']);
 
   describe("#initPreviewData()", function () {
     beforeEach(function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/controllers/wizard/step2_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step2_test.js b/ambari-web/test/controllers/wizard/step2_test.js
index 9afad41..41782bc 100644
--- a/ambari-web/test/controllers/wizard/step2_test.js
+++ b/ambari-web/test/controllers/wizard/step2_test.js
@@ -74,6 +74,8 @@ describe('App.WizardStep2Controller', function () {
 
   App.TestAliases.testAsComputedAlias(getController(), 'agentUser', 'content.installOptions.agentUser', 'string');
 
+  App.TestAliases.testAsComputedOr(getController(), 'isSubmitDisabled', ['hostsError', 'sshKeyError', 'sshUserError', 'sshPortError', 'agentUserError']);
+
   describe('#hostNames', function() {
     it('should be equal to content.installOptions.hostNames', function() {
       var controller = App.WizardStep2Controller.create({content: {installOptions: {hostNames: 'A,b,C'}}});
@@ -471,46 +473,6 @@ describe('App.WizardStep2Controller', function () {
 
   });
 
-  describe('#isSubmitDisabled', function () {
-
-    var controller = App.WizardStep2Controller.create({
-      hostsError: '',
-      sshKeyError: '',
-      sshUserError: '',
-      sshPortError: '',
-      agentUserError: ''
-    });
-
-    it('should return value if hostsError is not empty', function () {
-      controller.set('hostsError', 'error');
-      expect(controller.get('isSubmitDisabled')).to.be.true;
-    });
-
-    it('should return value if sshKeyError is not empty', function () {
-      controller.set('sshKeyError', 'error');
-      controller.set('hostsError', '');
-      expect(controller.get('isSubmitDisabled')).to.be.true;
-    });
-
-    it('should return value if sshUserError is not empty', function () {
-      controller.set('sshUserError', 'error');
-      controller.set('sshKeyError', '');
-      expect(controller.get('isSubmitDisabled')).to.be.true;
-    });
-
-    it('should return value if agentUserError is not empty', function () {
-      controller.set('agentUserError', 'error');
-      controller.set('sshUserError', '');
-      expect(controller.get('isSubmitDisabled')).to.be.true;
-    });
-
-    it('should return value if sshPortError is not empty', function () {
-        controller.set('sshPortError', 'error');
-        controller.set('agentUserError', '');
-        expect(controller.get('isSubmitDisabled')).to.be.true;
-    });
-  });
-
   describe('#installedHostsPopup', function() {
     beforeEach(function() {
       sinon.spy(App.ModalPopup, 'show');

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/controllers/wizard/step3_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step3_test.js b/ambari-web/test/controllers/wizard/step3_test.js
index a699dcc..dd1e918 100644
--- a/ambari-web/test/controllers/wizard/step3_test.js
+++ b/ambari-web/test/controllers/wizard/step3_test.js
@@ -57,6 +57,8 @@ describe('App.WizardStep3Controller', function () {
 
   App.TestAliases.testAsComputedIfThenElse(getController(), 'registrationTimeoutSecs', 'content.installOptions.manualInstall', 15, 120);
 
+  App.TestAliases.testAsComputedAnd(getController(), 'isWarningsLoaded', ['isJDKWarningsLoaded', 'isHostsWarningsLoaded']);
+
   describe('#getAllRegisteredHostsCallback', function () {
 
     it('One host is already in the cluster, one host is registered', function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/controllers/wizard/step6_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step6_test.js b/ambari-web/test/controllers/wizard/step6_test.js
index 056c30a..fdeaf0d 100644
--- a/ambari-web/test/controllers/wizard/step6_test.js
+++ b/ambari-web/test/controllers/wizard/step6_test.js
@@ -208,27 +208,7 @@ describe('App.WizardStep6Controller', function () {
     });
   });
 
-  describe('#anyGeneralErrors', function () {
-    beforeEach(function () {
-      controller.set('errorMessage', undefined);
-    });
-    it('should return errorMessage', function () {
-      controller.set('errorMessage', "error 404");
-      expect(controller.get('anyGeneralErrors')).to.be.true
-    });
-    it('true if generalErrorMessages is non empty array and errorMessage is undefined', function () {
-      controller.set('generalErrorMessages', ["error1", "error2"]);
-      expect(controller.get('anyGeneralErrors')).to.equal(true);
-    });
-    it('false if generalErrorMessages is empty array and errorMessage is undefined', function () {
-      controller.set('generalErrorMessages', []);
-      expect(controller.get('anyGeneralErrors')).to.equal(false);
-    });
-    it('undefined if generalErrorMessages is undefined and errorMessage is undefined', function () {
-      controller.set('generalErrorMessages', undefined);
-      expect(controller.get('anyGeneralErrors')).to.equal(false);
-    });
-  });
+  App.TestAliases.testAsComputedOr(getController(), 'anyGeneralErrors', ['errorMessage', 'generalErrorMessages.length']);
 
   describe('#render', function () {
     it('true if loaded', function () {
@@ -309,31 +289,11 @@ describe('App.WizardStep6Controller', function () {
     });
   });
 
-  describe('#anyGeneralIssues', function () {
-    it('should return error message if errorMessage', function () {
-      controller.set('errorMessage', "error 404");
-      expect(controller.get('anyGeneralIssues')).to.be.true;
-    });
-    it('should return true if we have several errors', function () {
-      controller.set('generalErrorMessages', ["error 404", "error"]);
-      expect(controller.get('anyGeneralIssues')).to.be.true;
-    });
-    it('should return true if we have several warnings', function () {
-      controller.set('generalWarningMessages', ["error 404", "error"]);
-      expect(controller.get('anyGeneralIssues')).to.be.true;
-    });
-  });
+  App.TestAliases.testAsComputedOr(getController(), 'anyGeneralIssues', ['anyGeneralErrors', 'anyGeneralWarnings']);
 
-  describe('#anyErrors', function () {
-    it('true if generalErrorMessages is non empty', function () {
-      controller.set('generalErrorMessages', ["error 404", "error"]);
-      expect(controller.get('anyErrors')).to.equal(true);
-    });
-    it('false if generalErrorMessages is empty', function () {
-      controller.set('generalErrorMessages', []);
-      expect(controller.get('anyErrors')).to.equal(false);
-    });
-  });
+  App.TestAliases.testAsComputedOr(getController(), 'anyErrors', ['anyGeneralErrors', 'anyHostErrors']);
+
+  App.TestAliases.testAsComputedOr(getController(), 'anyWarnings', ['anyGeneralWarnings', 'anyHostWarnings']);
 
   describe('#anyWarnings', function () {
     it('true if generalWarningMessages is non empty', function () {
@@ -986,7 +946,7 @@ describe('App.WizardStep6Controller', function () {
     });
   });
 
-describe('#getCurrentBlueprint', function () {
+  describe('#getCurrentBlueprint', function () {
     var tests = Em.A([
       {
         clientComponents: Em.A([{component_name: "name1"}]),

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/controllers/wizard/step7_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step7_test.js b/ambari-web/test/controllers/wizard/step7_test.js
index 4d43a09..334563d 100644
--- a/ambari-web/test/controllers/wizard/step7_test.js
+++ b/ambari-web/test/controllers/wizard/step7_test.js
@@ -121,6 +121,8 @@ describe('App.InstallerStep7Controller', function () {
 
   App.TestAliases.testAsComputedAlias(getController(), 'slaveComponentHosts', 'content.slaveGroupProperties', 'array');
 
+  App.TestAliases.testAsComputedAnd(getController(), 'isConfigsLoaded', ['wizardController.stackConfigsLoaded', 'isAppliedConfigLoaded']);
+
   describe('#installedServiceNames', function () {
 
     var tests = Em.A([

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/init_computed_aliases.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/init_computed_aliases.js b/ambari-web/test/init_computed_aliases.js
index 030480d..62d0842 100644
--- a/ambari-web/test/init_computed_aliases.js
+++ b/ambari-web/test/init_computed_aliases.js
@@ -49,7 +49,6 @@ App.TestAliases = {
         return this._stubOneKey.apply(this, args);
       }
       return this._stubManyKeys.apply(this, args)
-
     },
 
     /**
@@ -136,6 +135,32 @@ App.TestAliases = {
         return Em.get(self, k);
       });
       return this;
+    },
+
+    /**
+     * Generates array of all possible boolean combinations
+     * Example:
+     * <code>
+     *   var keys = ['a', 'b'];
+     *   var result = getBinaryCombos(keys);
+     *   console.log(result); // [{a: true, b: true}, {a: true, b: false}, {a: false, b: true}, {a: false, b: false}]
+     * </code>
+     *
+     * @param {string[]} dependentKeys
+     * @returns {Array}
+     */
+    getBinaryCombos: function (dependentKeys) {
+      var n = dependentKeys.length;
+      var result = [];
+      var allCombos = Math.pow(2, n);
+      for (var y = 0; y < allCombos; y++) {
+        var combo = {};
+        for (var x = 0; x < n; x++) {
+          combo[dependentKeys[x]] = !!((y >> x) & 1);
+        }
+        result.push(combo);
+      }
+      return result;
     }
 
   }
@@ -166,4 +191,6 @@ require('test/aliases/computed/everyBy');
 require('test/aliases/computed/mapBy');
 require('test/aliases/computed/filterBy');
 require('test/aliases/computed/findBy');
-require('test/aliases/computed/sumBy');
\ No newline at end of file
+require('test/aliases/computed/sumBy');
+require('test/aliases/computed/and');
+require('test/aliases/computed/or');
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/models/alerts/alert_definition_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/models/alerts/alert_definition_test.js b/ambari-web/test/models/alerts/alert_definition_test.js
index c32dde4..d151faf 100644
--- a/ambari-web/test/models/alerts/alert_definition_test.js
+++ b/ambari-web/test/models/alerts/alert_definition_test.js
@@ -22,14 +22,18 @@ require('models/alerts/alert_definition');
 
 var model;
 
+function getModel() {
+  return App.AlertDefinition.createRecord();
+}
+
 describe('App.AlertDefinition', function () {
 
   beforeEach(function () {
-
-    model = App.AlertDefinition.createRecord();
-
+    model = getModel();
   });
 
+  App.TestAliases.testAsComputedAnd(getModel(), 'isHostAlertDefinition', ['isAmbariService', 'isAmbariAgentComponent']);
+
   describe('#status', function () {
 
     Em.A([

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/models/configs/objects/service_config_property_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/models/configs/objects/service_config_property_test.js b/ambari-web/test/models/configs/objects/service_config_property_test.js
index 11ea4ab..e292109 100644
--- a/ambari-web/test/models/configs/objects/service_config_property_test.js
+++ b/ambari-web/test/models/configs/objects/service_config_property_test.js
@@ -333,6 +333,8 @@ describe('App.ServiceConfigProperty', function () {
 
   App.TestAliases.testAsComputedFirstNotBlank(getProperty(), 'placeholder', ['placeholderText', 'savedValue']);
 
+  App.TestAliases.testAsComputedAnd(getProperty(), 'hideFinalIcon', ['!isFinal', 'isNotEditable']);
+
   describe('#overrideErrorTrigger', function () {
     it('should be an increment', function () {
       serviceConfigProperty.set('overrides', configsData[0].overrides);

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/models/configs/service_config_version_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/models/configs/service_config_version_test.js b/ambari-web/test/models/configs/service_config_version_test.js
index e721890..b5b730c 100644
--- a/ambari-web/test/models/configs/service_config_version_test.js
+++ b/ambari-web/test/models/configs/service_config_version_test.js
@@ -21,10 +21,14 @@ require('models/configs/service_config_version');
 
 var model;
 
+function getModel() {
+  return App.ServiceConfigVersion.createRecord({});
+}
+
 describe('App.ServiceConfigVersion', function () {
 
   beforeEach(function () {
-    model = App.ServiceConfigVersion.createRecord({});
+    model = getModel();
   });
 
   describe('#authorFormatted', function () {
@@ -51,39 +55,6 @@ describe('App.ServiceConfigVersion', function () {
 
   });
 
-  describe('#canBeMadeCurrent', function () {
-
-    var cases = [
-      {
-        isCompatible: true,
-        isCurrent: true,
-        canBeMadeCurrent: false,
-        title: 'current version'
-      },
-      {
-        isCompatible: true,
-        isCurrent: false,
-        canBeMadeCurrent: true,
-        title: 'compatible version'
-      },
-      {
-        isCompatible: false,
-        isCurrent: false,
-        canBeMadeCurrent: false,
-        title: 'not compatible version'
-      }
-    ];
-
-    cases.forEach(function (item) {
-      it(item.title, function () {
-        model.setProperties({
-          isCompatible: item.isCompatible,
-          isCurrent: item.isCurrent
-        });
-        expect(model.get('canBeMadeCurrent')).to.equal(item.canBeMadeCurrent);
-      });
-    });
-
-  });
+  App.TestAliases.testAsComputedAnd(getModel(), 'canBeMadeCurrent', ['isCompatible', '!isCurrent']);
 
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/models/configs/sub_section_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/models/configs/sub_section_test.js b/ambari-web/test/models/configs/sub_section_test.js
index 1e1e356..afc37b2 100644
--- a/ambari-web/test/models/configs/sub_section_test.js
+++ b/ambari-web/test/models/configs/sub_section_test.js
@@ -19,12 +19,24 @@
 var App = require('app');
 var model;
 
+function getModel() {
+  return App.SubSection.createRecord();
+}
+
 describe('App.SubSection', function () {
 
   beforeEach(function () {
-    model = App.SubSection.createRecord();
+    model = getModel();
   });
 
+  App.TestAliases.testAsComputedAnd(getModel(), 'showTabs', ['hasTabs', 'someSubSectionTabIsVisible']);
+
+  App.TestAliases.testAsComputedAnd(getModel(), 'addLeftVerticalSplitter', ['!isFirstColumn', 'leftVerticalSplitter']);
+
+  App.TestAliases.testAsComputedAnd(getModel(), 'showTopSplitter', ['!isFirstRow', '!border']);
+
+  App.TestAliases.testAsComputedAnd(getModel(), 'isSectionVisible', ['!isHiddenByFilter', '!isHiddenByConfig', 'someConfigIsVisible']);
+
   describe('#errorsCount', function () {
 
     beforeEach(function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/models/stack_service_component_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/models/stack_service_component_test.js b/ambari-web/test/models/stack_service_component_test.js
index cc58fcb..7e971ce 100644
--- a/ambari-web/test/models/stack_service_component_test.js
+++ b/ambari-web/test/models/stack_service_component_test.js
@@ -302,6 +302,8 @@ describe('App.StackServiceComponent', function() {
     modelSetup.setupStackServiceComponent();
   });
 
+  App.TestAliases.testAsComputedAnd(App.StackServiceComponent.createRecord(), 'isMasterAddableInstallerWizard', ['isMaster', 'isMultipleAllowed', '!isMasterAddableOnlyOnHA', '!isNotAddableOnlyInInstall']);
+
   describe('component properties validation', function() {
     componentPropertiesValidationTests.forEach(function(test) {
       describe('properties validation for ' + test.componentName + ' component', function() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/views/common/configs/widgets/config_widget_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/configs/widgets/config_widget_view_test.js b/ambari-web/test/views/common/configs/widgets/config_widget_view_test.js
index d2523ac..e7f979b 100644
--- a/ambari-web/test/views/common/configs/widgets/config_widget_view_test.js
+++ b/ambari-web/test/views/common/configs/widgets/config_widget_view_test.js
@@ -19,20 +19,29 @@
 var App = require('app');
 
 var view;
+
+function getView() {
+  return App.ConfigWidgetView.create({
+    initPopover: Em.K,
+    config: Em.Object.create({
+      isOriginalSCP: false,
+      isPropertyOverridable: false,
+      cantBeUndone: false,
+      isNotDefaultValue: false
+    })
+  });
+}
+
 describe('App.ConfigWidgetView', function () {
 
   beforeEach(function () {
-    view = App.ConfigWidgetView.create({
-      initPopover: Em.K,
-      config: Em.Object.create({
-        isOriginalSCP: false,
-        isPropertyOverridable: false,
-        cantBeUndone: false,
-        isNotDefaultValue: false
-      })
-    });
+    view = getView();
   });
 
+  App.TestAliases.testAsComputedAnd(getView(), 'showPencil', ['supportSwitchToTextBox', '!disabled']);
+
+  App.TestAliases.testAsComputedOr(getView(), 'doNotShowWidget', ['isPropertyUndefined', 'config.showAsTextBox']);
+
   describe('#undoAllowed', function () {
 
     Em.A([

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/views/common/form/spinner_input_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/form/spinner_input_view_test.js b/ambari-web/test/views/common/form/spinner_input_view_test.js
index 075ca88..8e668a0 100644
--- a/ambari-web/test/views/common/form/spinner_input_view_test.js
+++ b/ambari-web/test/views/common/form/spinner_input_view_test.js
@@ -20,10 +20,15 @@ var App = require('app');
 
 var view;
 var e;
+
+function getView() {
+  return App.SpinnerInputView.create({});
+}
+
 describe('App.SpinnerInputView', function () {
 
   beforeEach(function () {
-    view = App.SpinnerInputView.create({});
+    view = getView();
     e = {
       preventDefault: Em.K
     };
@@ -34,6 +39,8 @@ describe('App.SpinnerInputView', function () {
     e.preventDefault.restore();
   });
 
+  App.TestAliases.testAsComputedOr(getView(), 'computedDisabled', ['!content.enabled', 'disabled']);
+
   describe('#keyDown', function () {
 
     Em.A([

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_task_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_task_view_test.js b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_task_view_test.js
index de578a1..66e6d41 100644
--- a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_task_view_test.js
+++ b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_task_view_test.js
@@ -28,6 +28,8 @@ describe('App.upgradeTaskView', function () {
   view.removeObserver('content.isExpanded', view, 'doPolling');
   view.removeObserver('outsideView', view, 'doPolling');
 
+  App.TestAliases.testAsComputedOr(view, 'showContent', ['outsideView', 'content.isExpanded']);
+
   describe("#logTabId", function() {
     it("", function() {
       view.reopen({
@@ -158,31 +160,4 @@ describe('App.upgradeTaskView', function () {
     });
   });
 
-  describe("#showContent", function() {
-    it("outsideView = false, content.isExpanded = false", function() {
-      view.set('outsideView', false);
-      view.set('content.isExpanded', false);
-      view.propertyDidChange('showContent');
-      expect(view.get('showContent')).to.be.false;
-    });
-    it("outsideView = true, content.isExpanded = false", function() {
-      view.set('outsideView', true);
-      view.set('content.isExpanded', false);
-      view.propertyDidChange('showContent');
-      expect(view.get('showContent')).to.be.true;
-    });
-    it("outsideView = false, content.isExpanded = true", function() {
-      view.set('outsideView', false);
-      view.set('content.isExpanded', true);
-      view.propertyDidChange('showContent');
-      expect(view.get('showContent')).to.be.true;
-    });
-    it("outsideView = true, content.isExpanded = true", function() {
-      view.set('outsideView', true);
-      view.set('content.isExpanded', true);
-      view.propertyDidChange('showContent');
-      expect(view.get('showContent')).to.be.true;
-    });
-  });
-
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
index a9fdfed..9507e08 100644
--- a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
+++ b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
@@ -37,6 +37,8 @@ describe('App.upgradeWizardView', function () {
   });
   view.removeObserver('App.clusterName', view, 'startPolling');
 
+  App.TestAliases.testAsComputedOr(view, 'isManualProceedDisabled', ['!isManualDone', 'controller.requestInProgress']);
+
   App.TestAliases.testAsComputedEqualProperties(view, 'isFinalizeItem', 'manualItem.context', 'controller.finalizeContext');
 
   describe("#upgradeGroups", function () {
@@ -231,21 +233,6 @@ describe('App.upgradeWizardView', function () {
     });
   });
 
-  describe("#isManualProceedDisabled", function () {
-    it("requestInProgress is false", function () {
-      view.set('isManualDone', true);
-      view.set('controller.requestInProgress', false);
-      view.propertyDidChange('isManualProceedDisabled');
-      expect(view.get('isManualProceedDisabled')).to.be.false;
-    });
-    it("requestInProgress is true", function () {
-      view.set('controller.requestInProgress', true);
-      view.propertyDidChange('isManualProceedDisabled');
-      expect(view.get('isManualProceedDisabled')).to.be.true;
-    });
-
-  });
-
   describe("#failedItem", function () {
     it("no running item", function () {
       view.set('activeGroup.upgradeItems', []);
@@ -390,20 +377,7 @@ describe('App.upgradeWizardView', function () {
     });
   });
 
-  describe("#isDowngradeAvailable", function () {
-    it("downgrade available", function () {
-      view.set('controller.isDowngrade', false);
-      view.set('controller.downgradeAllowed', true);
-      view.propertyDidChange('isDowngradeAvailable');
-      expect(view.get('isDowngradeAvailable')).to.be.true;
-    });
-    it("downgrade unavailable", function () {
-      view.set('controller.isDowngrade', true);
-      view.set('controller.downgradeAllowed', true);
-      view.propertyDidChange('isDowngradeAvailable');
-      expect(view.get('isDowngradeAvailable')).to.be.false;
-    });
-  });
+  App.TestAliases.testAsComputedAnd(view, 'isDowngradeAvailable', ['!controller.isDowngrade', 'controller.downgradeAllowed']);
 
   describe("#taskDetails", function () {
     it("runningItem present", function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/views/main/alerts/definition_details_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/alerts/definition_details_view_test.js b/ambari-web/test/views/main/alerts/definition_details_view_test.js
index ae4ac99..f988ceb 100644
--- a/ambari-web/test/views/main/alerts/definition_details_view_test.js
+++ b/ambari-web/test/views/main/alerts/definition_details_view_test.js
@@ -20,16 +20,17 @@ var App = require('app');
 
 var view, instanceTableRow;
 
+function getView() {
+  return App.MainAlertDefinitionDetailsView.create({
+    initFilters: Em.K
+  });
+}
+
 describe('App.MainAlertDefinitionDetailsView', function () {
 
   beforeEach(function () {
-
-    view = App.MainAlertDefinitionDetailsView.create({
-      initFilters: Em.K
-    });
-
+    view = getView();
     instanceTableRow = view.get('instanceTableRow').create();
-
   });
 
   describe("#goToHostAlerts()", function () {
@@ -54,3 +55,13 @@ describe('App.MainAlertDefinitionDetailsView', function () {
   });
 
 });
+
+function getInstanceView() {
+  return App.AlertInstanceServiceHostView.create();
+}
+
+describe('App.AlertInstanceServiceHostView', function () {
+
+  App.TestAliases.testAsComputedAnd(getInstanceView(), 'showSeparator', ['instance.serviceDisplayName', 'instance.hostName']);
+
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/views/main/dashboard/widgets/hbase_regions_in_transition_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/dashboard/widgets/hbase_regions_in_transition_test.js b/ambari-web/test/views/main/dashboard/widgets/hbase_regions_in_transition_test.js
index 3615ccc..ce39742 100644
--- a/ambari-web/test/views/main/dashboard/widgets/hbase_regions_in_transition_test.js
+++ b/ambari-web/test/views/main/dashboard/widgets/hbase_regions_in_transition_test.js
@@ -109,4 +109,6 @@ describe('App.HBaseRegionsInTransitionView', function() {
 
   App.TestAliases.testAsComputedLteProperties(getView(), 'isGreen', 'data', 'thresh1');
 
+  App.TestAliases.testAsComputedAnd(getView(), 'isOrange', ['!isGreen', '!isRed']);
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/views/main/dashboard/widgets/node_managers_live_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/dashboard/widgets/node_managers_live_test.js b/ambari-web/test/views/main/dashboard/widgets/node_managers_live_test.js
index cd1c150..3e5fce0 100644
--- a/ambari-web/test/views/main/dashboard/widgets/node_managers_live_test.js
+++ b/ambari-web/test/views/main/dashboard/widgets/node_managers_live_test.js
@@ -23,84 +23,16 @@ require('views/main/dashboard/widget');
 require('views/main/dashboard/widgets/text_widget');
 require('views/main/dashboard/widgets/node_managers_live');
 
-describe('App.NodeManagersLiveView', function() {
-
-  beforeEach(function () {
-    sinon.stub(App, 'get').withArgs('router.clusterController.isComponentsStateLoaded').returns(true);
+function getView() {
+  return App.NodeManagersLiveView.create({
+    parentView: Em.Object.create()
   });
+}
 
-  afterEach(function () {
-    App.get.restore();
-  });
+describe('App.NodeManagersLiveView', function() {
 
-  var tests = [
-    {
-      model: {
-        nodeManagersTotal: 3,
-        nodeManagerLiveNodes: 2
-      },
-      e: {
-        isRed: false,
-        isOrange: true,
-        isGreen: false,
-        isNA: false,
-        content: '2/3',
-        data: 67
-      }
-    },
-    {
-      model: {
-        nodeManagersTotal: 2,
-        nodeManagerLiveNodes: 2
-      },
-      e: {
-        isRed: false,
-        isOrange: false,
-        isGreen: true,
-        isNA: false,
-        content: '2/2',
-        data: 100
-      }
-    },
-    {
-      model: {
-        nodeManagersTotal: 2,
-        nodeManagerLiveNodes: 0
-      },
-      e: {
-        isRed: true,
-        isOrange: false,
-        isGreen: false,
-        isNA: false,
-        content: '0/2',
-        data: 0.00
-      }
-    }
-  ];
+  App.TestAliases.testAsComputedAnd(getView(), 'isDataAvailable', ['!model.metricsNotAvailable', 'App.router.clusterController.isComponentsStateLoaded']);
 
-  tests.forEach(function(test) {
-    describe('nodeManagersTotal length - ' + test.model.nodeManagersTotal + ' | nodeManagerLiveNodes length - ' + test.model.nodeManagerLiveNodes, function() {
-      var AppNodeManagersLiveView = App.NodeManagersLiveView.extend({nodeManagersLive: test.model.nodeManagerLiveNodes});
-      var nodeManagersLiveView = AppNodeManagersLiveView.create({model_type:null, model: test.model});
-      it('content', function() {
-        expect(nodeManagersLiveView.get('content')).to.equal(test.e.content);
-      });
-      it('data', function() {
-        expect(nodeManagersLiveView.get('data')).to.equal(test.e.data);
-      });
-      it('isRed', function() {
-        expect(nodeManagersLiveView.get('isRed')).to.equal(test.e.isRed);
-      });
-      it('isOrange', function() {
-        expect(nodeManagersLiveView.get('isOrange')).to.equal(test.e.isOrange);
-      });
-      it('isGreen', function() {
-        expect(nodeManagersLiveView.get('isGreen')).to.equal(test.e.isGreen);
-      });
-      it('isNA', function() {
-        expect(nodeManagersLiveView.get('isNA')).to.equal(test.e.isNA);
-      });
-    });
-  });
+  App.TestAliases.testAsComputedAlias(getView(), 'nodeManagersLive', 'model.nodeManagersCountActive');
 
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/views/main/dashboard/widgets/text_widget_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/dashboard/widgets/text_widget_test.js b/ambari-web/test/views/main/dashboard/widgets/text_widget_test.js
index 1f95076..5dbb599 100644
--- a/ambari-web/test/views/main/dashboard/widgets/text_widget_test.js
+++ b/ambari-web/test/views/main/dashboard/widgets/text_widget_test.js
@@ -89,4 +89,6 @@ describe('App.TextDashboardWidgetView', function() {
 
   App.TestAliases.testAsComputedLteProperties(getView(), 'isRed', 'data', 'thresh1');
 
+  App.TestAliases.testAsComputedAnd(getView(), 'isOrange', ['!isGreen', '!isRed']);
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/8750537a/ambari-web/test/views/wizard/step1_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/wizard/step1_view_test.js b/ambari-web/test/views/wizard/step1_view_test.js
index a470495..497da5e 100644
--- a/ambari-web/test/views/wizard/step1_view_test.js
+++ b/ambari-web/test/views/wizard/step1_view_test.js
@@ -28,6 +28,8 @@ function getView() {
 
 describe('App.WizardStep1View', function () {
 
+  App.TestAliases.testAsComputedAnd(getView(), 'showErrorsWarningCount', ['isSubmitDisabled', 'totalErrorCnt']);
+
   describe('#operatingSystems', function () {
     beforeEach(function () {
       sinon.stub(App.Stack, 'find', function () {
@@ -210,6 +212,8 @@ describe('App.WizardStep1View', function () {
 
   App.TestAliases.testAsComputedEveryBy(getView(), 'isNoOsChecked', 'operatingSystems', 'isSelected', false);
 
+  App.TestAliases.testAsComputedOr(getView(), 'isSubmitDisabled', ['invalidFormatUrlExist', 'isNoOsChecked', 'invalidUrlExist', 'controller.content.isCheckInProgress']);
+
   describe('#stacks', function () {
 
     var tests = Em.A([
@@ -245,148 +249,9 @@ describe('App.WizardStep1View', function () {
 
   });
 
-  describe('#isSubmitDisabled', function () {
-
-    var tests = Em.A([
-      {
-        invalidFormatUrlExist: false,
-        isNoOsChecked: false,
-        invalidUrlExist: false,
-        checkInProgress: false,
-        e: false
-      },
-      {
-        invalidFormatUrlExist: true,
-        isNoOsChecked: false,
-        invalidUrlExist: false,
-        checkInProgress: false,
-        e: true
-      },
-      {
-        invalidFormatUrlExist: false,
-        isNoOsChecked: true,
-        invalidUrlExist: false,
-        checkInProgress: false,
-        e: true
-      },
-      {
-        invalidFormatUrlExist: false,
-        isNoOsChecked: false,
-        invalidUrlExist: true,
-        checkInProgress: false,
-        e: true
-      },
-      {
-        invalidFormatUrlExist: true,
-        isNoOsChecked: false,
-        invalidUrlExist: true,
-        checkInProgress: false,
-        e: true
-      },
-      {
-        invalidFormatUrlExist: true,
-        isNoOsChecked: true,
-        invalidUrlExist: false,
-        checkInProgress: false,
-        e: true
-      },
-      {
-        invalidFormatUrlExist: false,
-        isNoOsChecked: true,
-        invalidUrlExist: true,
-        checkInProgress: false,
-        e: true
-      },
-      {
-        invalidFormatUrlExist: true,
-        isNoOsChecked: true,
-        invalidUrlExist: true,
-        checkInProgress: false,
-        e: true
-      },
-      {
-        invalidFormatUrlExist: true,
-        isNoOsChecked: false,
-        invalidUrlExist: false,
-        checkInProgress: true,
-        e: true
-      }
-    ]);
+  App.TestAliases.testAsComputedSomeBy(getView(), 'invalidUrlExist', 'allRepositories', 'validation', App.Repository.validation['INVALID']);
 
-    tests.forEach(function (test) {
-      it(test.invalidFormatUrlExist.toString() + ' ' + test.isNoOsChecked.toString() + ' ' + test.invalidUrlExist.toString()+ ' ' + test.checkInProgress.toString(), function () {
-        view = App.WizardStep1View.create();
-        view.reopen({
-          invalidFormatUrlExist: test.invalidFormatUrlExist,
-          isNoOsChecked: test.isNoOsChecked,
-          invalidUrlExist: test.invalidUrlExist
-        });
-        view.set('controller', {});
-        view.set('controller.content', {});
-        view.set('controller.content.isCheckInProgress', test.checkInProgress);
-        expect(view.get('isSubmitDisabled')).to.equal(test.e);
-      });
-    });
-  });
-
-  describe('#showErrorsWarningCount', function() {
-    var tests = [
-      {
-        isSubmitDisabled: true,
-        totalErrorCnt: 0,
-        e: false
-      },
-      {
-        isSubmitDisabled: true,
-        totalErrorCnt: 1,
-        e: true
-      },
-      {
-        isSubmitDisabled: false,
-        totalErrorCnt: 0,
-        e: false
-      }
-    ];
-    tests.forEach(function(test) {
-      it(test.isSubmitDisabled.toString() + ' ' + test.totalErrorCnt.toString(), function () {
-        var view = App.WizardStep1View.create();
-        view.reopen({
-          isSubmitDisabled: test.isSubmitDisabled,
-          totalErrorCnt: test.totalErrorCnt
-        });
-        expect(view.get('showErrorsWarningCount')).to.equal(test.e);
-      })
-    });
-  });
-
-  describe('#invalidUrlExist', function () {
-    var tests = Em.A([
-      {
-        allRepositories: [Em.Object.create({validation: 'icon-exclamation-sign'})],
-        m: 'invalidCnt: 1, validation: icon-exclamation-sign',
-        e: true
-      },
-      {
-        allRepositories: [Em.Object.create({validation: ''})],
-        m: 'invalidCnt: 1, validation: ""',
-        e: false
-      },
-      {
-        allRepositories: [Em.Object.create({validation: ''})],
-        m: 'invalidCnt: 0, validation: ""',
-        e: false
-      }
-    ]);
-    tests.forEach(function (test) {
-      it(test.m, function () {
-        view = App.WizardStep1View.create();
-        view.reopen({
-          allRepositories: test.allRepositories
-        });
-        expect(view.get('invalidUrlExist')).to.equal(test.e);
-      });
-    });
-  });
+  App.TestAliases.testAsComputedSomeBy(getView(), 'invalidFormatUrlExist', 'allRepositories', 'invalidFormatError', true);
 
   describe('#totalErrorCnt', function () {
     var tests = Em.A([