Просмотр исходного кода

AMBARI-15511. Refactor alerts models (onechiporenko)

Oleg Nechiporenko 9 лет назад
Родитель
Сommit
2925a6aa5a

+ 7 - 49
ambari-web/app/models/alerts/alert_definition.js

@@ -135,51 +135,15 @@ App.AlertDefinition = DS.Model.extend({
    */
   componentNameFormatted: Em.computed.formatRole('componentName', false),
 
-  /**
-   * Status generates from child-alerts
-   * Format: OK(1)  WARN(2)  CRIT(1)  UNKN(1)
-   * If single host: show: OK/WARNING/CRITICAL/UNKNOWN
-   * If some there are no alerts with some state, this state isn't shown
-   * If no OK/WARN/CRIT/UNKN state, then show PENDING
-   * Order is equal to example
-   * @type {string}
-   */
-  status: function () {
+  hostCnt: function () {
     var order = this.get('order'),
-        summary = this.get('summary'),
-        hostCnt = 0,
-        self = this;
+      summary = this.get('summary'),
+      hostCnt = 0;
     order.forEach(function (state) {
       hostCnt += summary[state] ? summary[state].count + summary[state].maintenanceCount : 0;
     });
-    if (hostCnt > 1) {
-      // multiple hosts
-      return order.map(function (state) {
-        var shortState = self.get('shortState')[state];
-        var result = '';
-        result += summary[state].count ? '<span class="alert-state-single-host label alert-state-' + state + '">' + shortState + ' (' + summary[state].count + ')</span>' : '';
-        // add status with maintenance mode icon
-        result += summary[state].maintenanceCount ?
-        '<span class="alert-state-single-host label alert-state-PENDING"><span class="icon-medkit"></span> ' + shortState + ' (' + summary[state].maintenanceCount + ')</span>' : '';
-        return result;
-      }).without('').join(' ');
-    } else if (hostCnt === 1) {
-      // single host, single status
-      return order.map(function (state) {
-        var shortState = self.get('shortState')[state];
-        var result = '';
-        result += summary[state].count ? '<span class="alert-state-single-host label alert-state-' + state + '">' + shortState + '</span>' : '';
-        // add status with maintenance mode icon
-        result += summary[state].maintenanceCount ?
-        '<span class="alert-state-single-host label alert-state-PENDING"><span class="icon-medkit"></span> ' + shortState + '</span>' : '';
-        return result;
-      }).without('').join(' ');
-    } else if (!hostCnt) {
-      // none
-      return '<span class="alert-state-single-host label alert-state-PENDING">NONE</span>';
-    }
-    return '';
-  }.property('summary'),
+    return hostCnt;
+  }.property('order', 'summary'),
 
   latestText: function () {
     var order = this.get('order'), summary = this.get('summary'), text = '';
@@ -198,20 +162,14 @@ App.AlertDefinition = DS.Model.extend({
 
   isHostAlertDefinition: Em.computed.and('isAmbariService', 'isAmbariAgentComponent'),
 
-  typeIconClass: function () {
-    var typeIcons = this.get('typeIcons'),
-        type = this.get('type');
-    return typeIcons[type];
-  }.property('type'),
+  typeIconClass: Em.computed.getByKey('typeIcons', 'type'),
 
   /**
    * if this definition is in state: CRITICAL / WARNING, if true, will show up in alerts fast access popup
    * instances with maintenance mode ON are ignored
    * @type {boolean}
    */
-  isCriticalOrWarning: function () {
-    return !!(this.get('summary.CRITICAL.count') || this.get('summary.WARNING.count'));
-  }.property('summary'),
+  isCriticalOrWarning: Em.computed.or('summary.CRITICAL.count', 'summary.WARNING.count'),
 
   /**
    * if this definition is in state: CRITICAL

+ 14 - 10
ambari-web/app/models/alerts/alert_instance.js

@@ -40,17 +40,21 @@ App.AlertInstance = DS.Model.extend({
   notification: DS.hasMany('App.AlertNotification'),
 
   /**
-   * Status icon markup
+   * @type {boolean}
+   */
+  isMaintenanceStateOn: Em.computed.equal('maintenanceState', 'ON'),
+
+  /**
+   * @type {string}
+   */
+  shortStateMsg: Em.computed.getByKey('shortState', 'state'),
+
+  /**
    * @type {string}
    */
-  status: function () {
-    var isMaintenanceStateOn = this.get('maintenanceState') === 'ON';
-    var state = this.get('state');
-    var stateClass = isMaintenanceStateOn ? 'PENDING' : state;
-    var shortState = this.get('shortState')[state];
-    var maintenanceIcon = isMaintenanceStateOn ? '<span class="icon-medkit"></span> ' : '';
-    return '<div class="label alert-state-single-host alert-state-' + stateClass + '">' + maintenanceIcon + shortState + '</div>';
-  }.property('state'),
+  stateClass: function () {
+    return 'alert-state-' + (this.get('isMaintenanceStateOn') ? 'PENDING' : this.get('state'));
+  }.property('isMaintenanceStateOn'),
 
   /**
    * For alerts we will have processes which are not typical
@@ -124,7 +128,7 @@ App.AlertInstance = DS.Model.extend({
   */  
   escapeSpecialCharactersFromTooltip: function () {
     var displayedText = this.get('text');
-    return  displayedText.replace(/[<>]/g, '');
+    return displayedText.replace(/[<>]/g, '');
   }.property('text'),
 
   /**

+ 1 - 0
ambari-web/app/templates.js

@@ -22,6 +22,7 @@
 
 require('templates/main/service/info/summary/base');
 require('templates/common/progress');
+require('templates/main/alerts/alert_instance/status');
 require("templates/main/service/widgets/create/step2_number");
 require("templates/main/service/widgets/create/step2_template");
 require("templates/main/service/widgets/create/step2_graph");

+ 7 - 7
ambari-web/app/templates/common/modal_popups/alerts_popup.hbs

@@ -28,24 +28,24 @@
           {{#if view.isAlertEmptyList}}
             <div class="alert-list-wrap">{{t alerts.fastAccess.popup.body.noalerts}}</div>
           {{else}}
-            {{#each alertInstance in view.pageContent}}
+            {{#each instance in view.pageContent}}
               <div class="alert-list-wrap">
                 <div class="alert-list-line-cursor">
                   <div class="service-text">
-                    {{view App.AlertInstanceServiceHostView instanceBinding="alertInstance"}}
+                    {{view App.AlertInstanceServiceHostView instanceBinding="instance"}}
                   </div>
                   <div class="name-text">
                     <div>
-                      <a href="#" {{action "gotoAlertDetails" alertInstance target="view"}}>{{alertInstance.label}}</a>
+                      <a href="#" {{action "gotoAlertDetails" instance target="view"}}>{{instance.label}}</a>
                     </div>
                     <div class="instance-text">
-                      {{alertInstance.text}}
+                      {{instance.text}}
                     </div>
                   </div>
-                  <div class="status-col" {{bindAttr title="alertInstance.lastTriggered"}}>
+                  <div class="status-col" {{bindAttr title="instance.lastTriggered"}}>
+                    {{template "templates/main/alerts/alert_instance/status"}}
                     <span>
-                      <span class="status-icon">{{{alertInstance.status}}}</span>
-                      <time>{{alertInstance.lastTriggeredForFormatted}}</time>
+                      <time>{{instance.lastTriggeredForFormatted}}</time>
                     </span>
                   </div>
               </div>

+ 10 - 7
ambari-web/app/templates/main/alerts/alert_definition/alert_definition_summary.hbs

@@ -16,13 +16,16 @@
 * limitations under the License.
 }}
 
-{{#if view.hostCount}}
-  {{#each state in view.states}}
-    <span {{bindAttr class=":alert-state-single-host :label state.stateClass"}}>
-      {{#if state.isMaintenance}}<span class="icon-medkit"></span>{{/if}}
-      {{state.shortStateWithCounter}}
-    </span>
+{{#if view.hasMultipleCount}}
+  {{#each st in view.definitionState}}
+    {{#if st.count}}
+      <span {{bindAttr class=":alert-state-single-host :label st.state"}}>{{st.count}}</span>
+    {{/if}}
+    {{#if st.maintenanceCount}}
+      <span class="alert-state-single-host label alert-state-PENDING"><span
+        class="icon-medkit"></span> {{st.maintenanceCount}}</span>
+    {{/if}}
   {{/each}}
 {{else}}
-  <span class="alert-state-single-host label alert-state-PENDING">NONE</span>
+  <span class="alert-state-single-host label alert-state-PENDING">{{view.content.shortState.PENDING}}</span>
 {{/if}}

+ 26 - 0
ambari-web/app/templates/main/alerts/alert_instance/status.hbs

@@ -0,0 +1,26 @@
+{{!
+* 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.
+}}
+
+{{! instance - App.AlertInstance }}
+
+<div {{bindAttr class=":label :alert-state-single-host instance.stateClass"}}>
+  {{#if instance.isMaintenanceStateOn}}
+    <span class="icon-medkit"></span>
+  {{/if}}
+  {{instance.shortStateMsg}}
+</div>

+ 3 - 2
ambari-web/app/templates/main/alerts/definition_details.hbs

@@ -55,7 +55,7 @@
     </div>
 
     <div class="status span4">
-      {{{controller.content.status}}}
+      {{view App.AlertDefinitionSummary contentBinding="view.controller.content"}}
     </div>
   </div>
 
@@ -211,7 +211,8 @@
                     </a>
                   {{/if}}
                 </td>
-                <td>{{{instance.status}}}
+                <td>
+                  {{template "templates/main/alerts/alert_instance/status"}}
                   <time class="timeago"
                         rel="tooltip" {{bindAttr data-original-title="instance.statusChangedAndLastCheckedFormatted"}}>
                     {{instance.lastTriggeredForFormatted}}

+ 9 - 9
ambari-web/app/templates/main/host/host_alerts.hbs

@@ -39,24 +39,24 @@
       </thead>
       <tbody>
       {{#if view.pageContent}}
-        {{#each alertInstance in view.pageContent}}
+        {{#each instance in view.pageContent}}
           <tr>
             <td class="first">
-              {{#if alertInstance.isAmbariServiceName}}
-                {{alertInstance.serviceDisplayName}}
+              {{#if instance.isAmbariServiceName}}
+                {{instance.serviceDisplayName}}
               {{else}}
-                <a href="#" {{action routeToService alertInstance.service}}>{{alertInstance.serviceDisplayName}}</a>
+                <a href="#" {{action routeToService instance.service}}>{{instance.serviceDisplayName}}</a>
               {{/if}}
             </td>
             <td>
-              <a href="#" {{action routeToAlertDefinition alertInstance.definitionId target="controller"}}>{{alertInstance.label}}</a>
+              <a href="#" {{action routeToAlertDefinition instance.definitionId target="controller"}}>{{instance.label}}</a>
             </td>
-            <td>{{{alertInstance.status}}}
-              <time class="timeago" {{bindAttr data-original-title="alertInstance.statusChangedAndLastCheckedFormatted"}}>{{alertInstance.lastTriggeredForFormatted}}</time>
+            <td>{{template "templates/main/alerts/alert_instance/status"}}
+              <time class="timeago" {{bindAttr data-original-title="instance.statusChangedAndLastCheckedFormatted"}}>{{instance.lastTriggeredForFormatted}}</time>
             </td>
             <td><span
-                    class="alert-text" {{bindAttr data-original-title="alertInstance.escapeSpecialCharactersFromTooltip"}}
-                    class="alert-text">{{alertInstance.text}}</span></td>
+                    class="alert-text" {{bindAttr data-original-title="instance.escapeSpecialCharactersFromTooltip"}}
+                    class="alert-text">{{instance.text}}</span></td>
           </tr>
         {{/each}}
       {{else}}

+ 1 - 0
ambari-web/app/templates/main/service/info/service_alert_popup.hbs

@@ -30,6 +30,7 @@
             </div>
           </div>
           <div class="span4 status-col" rel="alert-status-tooltip" >
+            {{view App.AlertDefinitionSummary contentBinding="alert"}}
             <span class="timeago" {{bindAttr data-original-title="alert.lastTriggeredVerboseDisplay"}}>
               <span class="status-icon">{{{alert.status}}}</span>
               <time>{{alert.lastTriggeredForFormatted}}</time>

+ 30 - 2
ambari-web/app/utils/ember_computed.js

@@ -1049,7 +1049,7 @@ computed.firstNotBlank = generateComputedWithValues(function (values) {
 computed.formatUnavailable = function(dependentKey) {
   return computed(dependentKey, function () {
     var value = smartGet(this, dependentKey);
-    return (value || value == 0) ? value : Em.I18n.t('services.service.summary.notAvailable');
+    return value || value == 0 ? value : Em.I18n.t('services.service.summary.notAvailable');
   });
 };
 
@@ -1089,4 +1089,32 @@ computed.countBasedMessage = function (dependentKey, zeroMsg, oneMsg, manyMsg) {
     }
     return oneMsg;
   });
-};
+};
+
+/**
+ * A computed property that returns property value according to the property key and object key
+ * App.*-keys are supported
+ * <pre>
+ *   var o = Em.Object.create({
+ *    p1: {a: 1, b: 2, c: 3},
+ *    p2: 'a',
+ *    p3: Em.computed.getByKey('p1', 'p2')
+ *   });
+ *   console.log(o.get('p3')); // 1
+ *   o.set('p2', 'b');
+ *   console.log(o.get('p3')); // 2
+ *   o.set('p2', 'c');
+ *   console.log(o.get('p3')); // 3
+ * </pre>
+ *
+ * @param {string} objectKey
+ * @param {string} propertyKey
+ * @returns {Ember.ComputedProperty}
+ */
+computed.getByKey = function (objectKey, propertyKey) {
+  return computed(objectKey, propertyKey, function () {
+    var object = smartGet(this, objectKey);
+    var property = smartGet(this, propertyKey);
+    return object ? object[property] : null;
+  });
+}

+ 40 - 36
ambari-web/app/views/main/alerts/alert_definition/alert_definition_summary.js

@@ -21,45 +21,49 @@ App.AlertDefinitionSummary = Em.View.extend({
 
   templateName: require('templates/main/alerts/alert_definition/alert_definition_summary'),
 
-  didInsertElement: function() {
-    this.stateObserver();
-  },
+  /**
+   * Bound from the template
+   * @type {App.AlertDefinition}
+   */
+  content: null,
 
-  hostCount: 0,
-  states: [],
+  hasMultipleCount: Em.computed.gt('content.hostCnt', 0),
 
-  stateObserver: function () {
-    var order = this.get('content.order'),
-      summary = this.get('content.summary'),
-      shortState = this.get('content.shortState');
-
-    var hostCnt = 0;
+  definitionState: function () {
+    var content = this.get('content');
+    if (!content) {
+      return [];
+    }
+    var order = content.get('order');
+    var summary = content.get('summary');
+    var hostCnt = content.get('hostCnt');
+    var showCounts = hostCnt > 1;
+    var ret = [];
     order.forEach(function (state) {
-      hostCnt += summary[state] ? summary[state].count + summary[state].maintenanceCount : 0;
-    });
-    var states = [];
-    if (hostCnt) {
-      order.forEach(function (state) {
-        if (summary[state]) {
-          if (summary[state].count) {
-            states.push({
-              'shortStateWithCounter': shortState[state] + (summary[state].count > 1 ? ' (' + summary[state].count + ')' : ''),
-              'isMaintenance': false,
-              'stateClass': 'alert-state-' + state
-            });
-          }
-          if (summary[state].maintenanceCount) {
-            states.push({
-              'shortStateWithCounter': shortState[state] + (summary[state].maintenanceCount > 1 ? ' (' + summary[state].maintenanceCount + ')' : ''),
-              'isMaintenance': true,
-              'stateClass': 'alert-state-PENDING'
-            });
-          }
+      var shortState = content.get('shortState')[state];
+      var _stateSummary = {
+        state: 'alert-state-' + state,
+        count: '',
+        maintenanceCount: ''
+      };
+      if (summary[state].count) {
+        var count = shortState;
+        if (showCounts) {
+          count += ' (' + summary[state].count + ')';
         }
-      }, this);
-    }
-    this.set('hostCount', hostCnt);
-    this.set('states', states);
-  }.observes('content.summary')
+        _stateSummary.count = count;
+      }
+      // add status with maintenance mode icon
+      if (summary[state].maintenanceCount) {
+        var maintenanceCount = shortState;
+        if (showCounts) {
+          maintenanceCount += ' (' + summary[state].maintenanceCount + ')';
+        }
+        _stateSummary.maintenanceCount = maintenanceCount;
+      }
+      ret.push(_stateSummary);
+    });
+    return ret;
+  }.property('content.summary', 'content.hostCnt')
 
 });

+ 55 - 0
ambari-web/test/aliases/computed/getByKey.js

@@ -0,0 +1,55 @@
+/**
+ * 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 helpers = App.TestAliases.helpers;
+
+/**
+ *
+ * @param {Em.Object} context
+ * @param {string} propertyName
+ * @param {string} dependentKey
+ * @param {number} neededValue
+ */
+App.TestAliases.testAsComputedGetByKey = function (context, propertyName, objectKey, propertyKey) {
+
+  var obj = Em.get(context, objectKey);
+  var toCheck = Object.keys(obj);
+
+  describe('#' + propertyName + ' as Em.computed.getByKey', function () {
+
+    afterEach(function () {
+      helpers.smartRestoreGet(context);
+    });
+
+    it('has valid dependent keys', function () {
+      expect(Em.meta(context).descs[propertyName]._dependentKeys).to.eql([objectKey, propertyKey]);
+    });
+
+    toCheck.forEach(function (key) {
+      var expectedValue = obj[key];
+      it('should be `' + JSON.stringify(expectedValue) + '` if '+ JSON.stringify(propertyKey) + 'is ' + JSON.stringify(key), function () {
+        helpers.smartStubGet(context, propertyKey, key)
+          .propertyDidChange(context, propertyName);
+        var value = helpers.smartGet(context, propertyName);
+        expect(value).to.be.equal(expectedValue);
+      });
+    });
+
+  });
+
+};

+ 1 - 0
ambari-web/test/controllers/main/alerts/manage_alert_notifications_controller_test.js

@@ -19,6 +19,7 @@
 var App = require('app');
 var controller;
 var helpers = require('test/helpers');
+require('templates/main/alerts/alert_instance/status');
 
 
 function getController() {

+ 2 - 1
ambari-web/test/init_computed_aliases.js

@@ -193,4 +193,5 @@ require('test/aliases/computed/findBy');
 require('test/aliases/computed/sumBy');
 require('test/aliases/computed/and');
 require('test/aliases/computed/or');
-require('test/aliases/computed/formatUnavailable');
+require('test/aliases/computed/formatUnavailable');
+require('test/aliases/computed/getByKey');

+ 2 - 42
ambari-web/test/models/alerts/alert_definition_test.js

@@ -34,48 +34,6 @@ describe('App.AlertDefinition', function () {
 
   App.TestAliases.testAsComputedAnd(getModel(), 'isHostAlertDefinition', ['isAmbariService', 'isAmbariAgentComponent']);
 
-  describe('#status', function () {
-
-    Em.A([
-      {
-        summary: {OK: {count: 1, maintenanceCount: 0}, UNKNOWN: {count: 1, maintenanceCount: 0}, WARNING: {count: 2, maintenanceCount: 0}, CRITICAL: {count: 0, maintenanceCount: 0}},
-        m: 'No CRITICAL',
-        e: '<span class="alert-state-single-host label alert-state-OK">OK (1)</span> ' +
-        '<span class="alert-state-single-host label alert-state-WARNING">WARN (2)</span> ' +
-        '<span class="alert-state-single-host label alert-state-UNKNOWN">UNKWN (1)</span>'
-      },
-      {
-        summary: {WARNING: {count: 2, maintenanceCount: 0}, CRITICAL: {count: 3, maintenanceCount: 0}, UNKNOWN: {count: 1, maintenanceCount: 0}, OK: {count: 1, maintenanceCount: 0}},
-        m: 'All states exists',
-        e: '<span class="alert-state-single-host label alert-state-OK">OK (1)</span> ' +
-        '<span class="alert-state-single-host label alert-state-WARNING">WARN (2)</span> ' +
-        '<span class="alert-state-single-host label alert-state-CRITICAL">CRIT (3)</span> ' +
-        '<span class="alert-state-single-host label alert-state-UNKNOWN">UNKWN (1)</span>'
-      },
-      {
-        summary: {OK: {count: 1, maintenanceCount: 0}, UNKNOWN: {count: 0, maintenanceCount: 0}, WARNING: {count: 0, maintenanceCount: 0}, CRITICAL: {count: 0, maintenanceCount: 0}},
-        m: 'Single host',
-        e: '<span class="alert-state-single-host label alert-state-OK">OK</span>'
-      },
-      {
-        summary: {OK: {count: 0, maintenanceCount: 1}, UNKNOWN: {count: 0, maintenanceCount: 0}, WARNING: {count: 0, maintenanceCount: 0}, CRITICAL: {count: 0, maintenanceCount: 0}},
-        m: 'Maintenance OK alert',
-        e: '<span class="alert-state-single-host label alert-state-PENDING"><span class="icon-medkit"></span> OK</span>'
-      },
-      {
-        summary: {},
-        m: 'Pending',
-        e: '<span class="alert-state-single-host label alert-state-PENDING">NONE</span>'
-      }
-    ]).forEach(function (test) {
-      it(test.m, function () {
-        model.set('summary', test.summary);
-        expect(model.get('status')).to.equal(test.e);
-      });
-    });
-
-  });
-
   describe('#isCriticalOrWarning', function () {
 
     Em.A([
@@ -207,6 +165,8 @@ describe('App.AlertDefinition', function () {
 
   });
 
+  App.TestAliases.testAsComputedGetByKey(getModel(), 'typeIconClass', 'typeIcons', 'type');
+
   describe('REOPEN', function () {
 
     describe('#getSortDefinitionsByStatus', function () {

+ 7 - 27
ambari-web/test/models/alerts/alert_instance_test.js

@@ -22,14 +22,18 @@ require('models/alerts/alert_instance');
 
 var model;
 
+function getModel() {
+  return App.AlertInstance.createRecord();
+}
+
 describe('App.AlertInstance', function () {
 
   beforeEach(function () {
-
-    model = App.AlertInstance.createRecord();
-
+    model = getModel();
   });
 
+  App.TestAliases.testAsComputedGetByKey(getModel(), 'shortStateMsg', 'shortState', 'state');
+
   describe('#serviceDisplayName', function () {
 
     it('should get name for non-existing service', function () {
@@ -56,30 +60,6 @@ describe('App.AlertInstance', function () {
 
   });
 
-  describe('#status', function () {
-
-    it('should show maint mode icon', function () {
-
-      model.set('maintenanceState', 'ON');
-      model.set('state', 'OK');
-      var status = model.get('status');
-
-      expect(status).to.equal('<div class="label alert-state-single-host alert-state-PENDING"><span class="icon-medkit"></span> OK</div>');
-
-    });
-
-    it('should not show maint mode icon', function () {
-
-      model.set('maintenanceState', 'OFF');
-      model.set('state', 'OK');
-      var status = model.get('status');
-
-      expect(status).to.equal('<div class="label alert-state-single-host alert-state-OK">OK</div>');
-
-    });
-
-  });
-
   describe('#escapeSpecialCharactersFromTooltip', function () {
     it('it Should Display Alert Without special characters "<" and ">"', function () {
 

+ 56 - 0
ambari-web/test/utils/ember_computed_test.js

@@ -1468,4 +1468,60 @@ describe('Ember.computed macros', function () {
 
   });
 
+  describe('#getByKey', function () {
+
+    beforeEach(function () {
+      this.obj = Em.Object.create({
+        prop1: {a: 1, b: 2, c: 3},
+        prop2: 'a',
+        prop3: Em.computed.getByKey('prop1', 'prop2'),
+        prop4: Em.computed.getByKey('prop1', 'App.someRandomTestingKey')
+      });
+      App.set('someAnotherKey', 'a');
+    });
+
+    it('prop3 dependent keys are valid', function () {
+      expect(Em.meta(this.obj).descs.prop3._dependentKeys).to.eql(['prop1', 'prop2']);
+    });
+
+    it('prop4 dependent keys are valid', function () {
+      expect(Em.meta(this.obj).descs.prop4._dependentKeys).to.eql(['prop1', 'App.someRandomTestingKey']);
+    });
+
+    it('prop3 value is 1', function () {
+      expect(this.obj.get('prop3')).to.be.equal(1);
+    });
+
+    it('prop3 value is 2', function () {
+      this.obj.set('prop2', 'b');
+      expect(this.obj.get('prop3')).to.be.equal(2);
+    });
+
+    it('prop3 value is 3', function () {
+      this.obj.set('prop2', 'c');
+      expect(this.obj.get('prop3')).to.be.equal(3);
+    });
+
+    it('prop3 value is 4', function () {
+      this.obj.set('prop1.c', 4);
+      this.obj.set('prop2', 'c');
+      expect(this.obj.get('prop3')).to.be.equal(4);
+    });
+
+    it('prop4 values is 1', function () {
+      expect(this.obj.get('prop4')).to.be.equal(1);
+    });
+
+    it('prop4 values is 2', function () {
+      App.set('someAnotherKey', 'b');
+      expect(this.obj.get('prop4')).to.be.equal(2);
+    });
+
+    it('prop4 values is 3', function () {
+      App.set('someAnotherKey', 'c');
+      expect(this.obj.get('prop4')).to.be.equal(3);
+    });
+
+  });
+
 });