Repository: ambari
Updated Branches:
  refs/heads/trunk d5b7d404c -> 1f2aa2c21


AMBARI-13497. Ambari Web: Timezone issues (onechiporenko)


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

Branch: refs/heads/trunk
Commit: 1f2aa2c21e0275f257c1e93b45cfec8182bf6040
Parents: d5b7d40
Author: Oleg Nechiporenko <onechipore...@apache.org>
Authored: Wed Oct 21 11:43:21 2015 +0300
Committer: Oleg Nechiporenko <onechipore...@apache.org>
Committed: Wed Oct 21 11:49:06 2015 +0300

----------------------------------------------------------------------
 .../global/background_operations_controller.js  | 18 ++---
 .../global/user_settings_controller.js          | 74 ++++++++++++++------
 ambari-web/app/messages.js                      |  1 +
 ambari-web/app/styles/application.less          |  8 +++
 .../app/templates/common/chart/linear_time.hbs  |  5 +-
 ambari-web/app/templates/common/settings.hbs    |  2 +-
 ambari-web/app/utils/date/timezone.js           | 39 ++++++-----
 ambari-web/app/utils/helper.js                  |  2 +-
 .../global/user_settings_controller_test.js     | 30 +++++++-
 ambari-web/test/utils/date/timezone_test.js     | 36 +++++-----
 10 files changed, 144 insertions(+), 71 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/1f2aa2c2/ambari-web/app/controllers/global/background_operations_controller.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/app/controllers/global/background_operations_controller.js 
b/ambari-web/app/controllers/global/background_operations_controller.js
index 2cc3057..b78a35b 100644
--- a/ambari-web/app/controllers/global/background_operations_controller.js
+++ b/ambari-web/app/controllers/global/background_operations_controller.js
@@ -222,11 +222,13 @@ App.BackgroundOperationsController = 
Em.Controller.extend({
       currentRequestIds.push(request.Requests.id);
 
       if (rq) {
-        rq.set('progress', Math.floor(request.Requests.progress_percent));
-        rq.set('status', request.Requests.request_status);
-        rq.set('isRunning', isRunning);
-        rq.set('startTime', request.Requests.start_time);
-        rq.set('endTime', request.Requests.end_time);
+        rq.setProperties({
+          progress: Math.floor(request.Requests.progress_percent),
+          status: request.Requests.request_status,
+          isRunning: isRunning,
+          startTime: App.dateTimeWithTimeZone(request.Requests.start_time),
+          endTime: App.dateTimeWithTimeZone(request.Requests.end_time)
+        });
       } else {
         rq = Em.Object.create({
           id: request.Requests.id,
@@ -246,7 +248,7 @@ App.BackgroundOperationsController = Em.Controller.extend({
         });
         this.get("services").unshift(rq);
         //To sort DESC by request id
-        this.set("services", this.get("services").sort( function(a,b) { return 
b.get('id') - a.get('id'); }));
+        this.set("services", 
this.get("services").sortProperty('id').reverse());
       }
       runningServices += ~~isRunning;
     }, this);
@@ -294,7 +296,7 @@ App.BackgroundOperationsController = Em.Controller.extend({
     return false
   },
   /**
-   * assign schedule_id of request to null if it's Recommision operation
+   * assign schedule_id of request to null if it's Recommission operation
    * @param request
    * @param requestParams
    */
@@ -361,7 +363,7 @@ App.BackgroundOperationsController = Em.Controller.extend({
         $(self.get('popupView.element')).appendTo('#wrapper');
       } else {
         self.set('popupView', App.HostPopup.initPopup("", self, true));
-        self.set ('popupView.isNotShowBgChecked', !initValue);
+        self.set('popupView.isNotShowBgChecked', !initValue);
       }
     });
   },

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f2aa2c2/ambari-web/app/controllers/global/user_settings_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/global/user_settings_controller.js 
b/ambari-web/app/controllers/global/user_settings_controller.js
index 4ad7786..e78ada0 100644
--- a/ambari-web/app/controllers/global/user_settings_controller.js
+++ b/ambari-web/app/controllers/global/user_settings_controller.js
@@ -36,7 +36,8 @@ App.UserSettingsController = 
Em.Controller.extend(App.UserPref, {
   userSettings: {},
 
   /**
-   * Each property type is {name: string, defaultValue: *}
+   * Each property's type is {name: string, defaultValue: *, formatter: 
function}
+   *
    * @type {object}
    */
   userSettingsKeys: function () {
@@ -49,7 +50,10 @@ App.UserSettingsController = 
Em.Controller.extend(App.UserPref, {
       },
       timezone: {
         name: prefix + 'timezone-' + loginName,
-        defaultValue: timezoneUtils.detectUserTimezone()
+        defaultValue: timezoneUtils.detectUserTimezone(),
+        formatter: function (v) {
+          return timezoneUtils.get('timezonesMappedByValue')[v];
+        }
       }
     };
   }.property('App.router.loginName'),
@@ -57,6 +61,7 @@ App.UserSettingsController = 
Em.Controller.extend(App.UserPref, {
   /**
    * Load some user's setting from the persist
    * If <code>persistKey</code> is not provided, all settings are loaded
+   *
    * @param {string} [persistKey]
    * @method dataLoading
    * @returns {$.Deferred.promise}
@@ -73,14 +78,30 @@ App.UserSettingsController = 
Em.Controller.extend(App.UserPref, {
     return dfd.promise();
   },
 
-  getUserPrefSuccessCallback: function (response) {
-    if (!Em.isNone(response)) {
-      this.updateUserPrefWithDefaultValues(response);
+  /**
+   * Success-callback for user pref
+   *
+   * @param {*} response
+   * @param {object} opt
+   * @returns {*}
+   * @method getUserPrefSuccessCallback
+   */
+  getUserPrefSuccessCallback: function (response, opt) {
+    var getAllRequest = opt.url.contains('persist/?_');
+    if (Em.isNone(response)) {
+      this.updateUserPrefWithDefaultValues(response, getAllRequest);
     }
     this.set('currentPrefObject', response);
     return response;
   },
 
+  /**
+   * Error-callback for user-pref request
+   * Update user pref with default values if user firstly login
+   *
+   * @param {object} request
+   * @method getUserPrefErrorCallback
+   */
   getUserPrefErrorCallback: function (request) {
     // this user is first time login
     if (404 == request.status) {
@@ -90,14 +111,26 @@ App.UserSettingsController = 
Em.Controller.extend(App.UserPref, {
 
   /**
    * Load all current user's settings to the <code>userSettings</code>
+   *
    * @method getAllUserSettings
    */
   getAllUserSettings: function () {
     var userSettingsKeys = this.get('userSettingsKeys');
     var userSettings = {};
+    var self = this;
     this.dataLoading().done(function (json) {
       Object.keys(userSettingsKeys).forEach(function (k) {
-        userSettings[k] = JSON.parse(json[userSettingsKeys[k].name]);
+        var value = userSettingsKeys[k].defaultValue;
+        if (undefined === json[userSettingsKeys[k].name]) {
+          self.postUserPref(k, userSettingsKeys[k].defaultValue);
+        }
+        else {
+          value = JSON.parse(json[userSettingsKeys[k].name]);
+        }
+        if ('function' === Em.typeOf(userSettingsKeys[k].formatter)) {
+          value = userSettingsKeys[k].formatter(value);
+        }
+        userSettings[k] = value;
       });
     });
     this.set('userSettings', userSettings);
@@ -106,18 +139,22 @@ App.UserSettingsController = 
Em.Controller.extend(App.UserPref, {
   /**
    * If user doesn't have any settings stored in the persist,
    * default values should be populated there
+   *
    * @param {object} [response]
+   * @param {boolean} [getAllRequest] determines, if user tried to get one 
field or all fields
    * @method updateUserPrefWithDefaultValues
    */
-  updateUserPrefWithDefaultValues: function (response) {
+  updateUserPrefWithDefaultValues: function (response, getAllRequest) {
     response = response || {};
     var keys = this.get('userSettingsKeys');
     var self = this;
-    Object.keys(keys).forEach(function (key) {
-      if (Em.isNone(response[keys[key].name])) {
-        self.postUserPref(key, keys[key].defaultValue);
-      }
-    });
+    if (getAllRequest) {
+      Object.keys(keys).forEach(function (key) {
+        if (Em.isNone(response[keys[key].name])) {
+          self.postUserPref(key, keys[key].defaultValue);
+        }
+      });
+    }
   },
 
   /**
@@ -125,6 +162,7 @@ App.UserSettingsController = 
Em.Controller.extend(App.UserPref, {
    * Example:
    *  real key is something like 'userSettingsKeys.timezone.name'
    *  but user should call this method with 'timezone'
+   *
    * @method postUserPref
    * @param {string} key
    * @param {*} value
@@ -132,19 +170,12 @@ App.UserSettingsController = 
Em.Controller.extend(App.UserPref, {
    */
   postUserPref: function (key, value) {
     var k = key.startsWith('userSettingsKeys.') ? key : 'userSettingsKeys.' + 
key + '.name';
+    var kk = k.replace('userSettingsKeys.', '').replace('.name', '');
+    this.set('userSettings.' + kk, value);
     return this._super(this.get(k), value);
   },
 
   /**
-   * Sync <code>userSettingsKeys</code> after each POST-update
-   * @returns {*}
-   */
-  postUserPrefSuccessCallback: function () {
-    return this.getAllUserSettings();
-  },
-
-  /**
-   * Check if popup may be opened (based on <code>upgrade_ADMIN</code>)
    * Open popup with user settings after settings-request is complete
    *
    * @method showSettingsPopup
@@ -214,6 +245,7 @@ App.UserSettingsController = 
Em.Controller.extend(App.UserPref, {
 
       /**
        * Determines if page should be refreshed after user click "Save"
+       *
        * @returns {boolean}
        */
       needsPageRefresh: function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f2aa2c2/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index c67cbf8..1c19b7d 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -280,6 +280,7 @@ Em.I18n.translations = {
   'common.csv': 'CSV',
   'common.json': 'JSON',
   'common.timestamp': 'Timestamp',
+  'common.timezone': 'Timezone',
   'common.loading.eclipses': 'Loading...',
   'common.running': 'Running',
   'common.stopped': 'Stopped',

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f2aa2c2/ambari-web/app/styles/application.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/application.less 
b/ambari-web/app/styles/application.less
index 31d495e..dae745ae 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -5572,6 +5572,14 @@ input[type="radio"].align-checkbox, 
input[type="checkbox"].align-checkbox {
   margin-top: @space-m;
 }
 
+.mtl {
+  margin-top: @space-l;
+}
+
+.mtl15 {
+  margin-top: @space-l * 1.5;
+}
+
 .mbm { margin-bottom: @space-m; }
 
 .mls {

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f2aa2c2/ambari-web/app/templates/common/chart/linear_time.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/chart/linear_time.hbs 
b/ambari-web/app/templates/common/chart/linear_time.hbs
index e7bfa97..60937de 100644
--- a/ambari-web/app/templates/common/chart/linear_time.hbs
+++ b/ambari-web/app/templates/common/chart/linear_time.hbs
@@ -20,7 +20,7 @@
 <div {{bindAttr class="view.isReady::hidden :time-label"}}>
   {{view.parentView.currentTimeState.name}}
   <a {{bindAttr class="view.isExportButtonHidden:hidden :corner-icon 
:pull-right"}} href="#" {{action toggleFormatsList target="view"}}>
-    <i class="icon-save"></i>
+   {{t common.export}} <i class="icon-save"></i>
   </a>
   {{view view.exportMetricsMenuView}}
 </div>
@@ -37,3 +37,6 @@
 {{#if view.isTimePagingEnable}}
   <div {{bindAttr class="view.rightArrowVisible:visibleArrow :arrow-right"}} 
{{action "switchTimeForward" "forward" target="view.parentView"}}></div>
 {{/if}}
+<div class="timezone mtl15 mll">
+  {{t common.timezone}}: 
<strong>{{App.router.userSettingsController.userSettings.timezone.label}}</strong>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f2aa2c2/ambari-web/app/templates/common/settings.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/settings.hbs 
b/ambari-web/app/templates/common/settings.hbs
index 226b264..2ca2991 100644
--- a/ambari-web/app/templates/common/settings.hbs
+++ b/ambari-web/app/templates/common/settings.hbs
@@ -32,7 +32,7 @@
       {{t app.settings.selectTimezone}}
         {{view Em.Select
           contentBinding="view.timezonesList"
-          optionLabelPath="content.value"
+          optionLabelPath="content.label"
           optionValuePath="content.value"
           selectionBinding="view.parentView.selectedTimezone"
           class="group-select select-group-box"

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f2aa2c2/ambari-web/app/utils/date/timezone.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/date/timezone.js 
b/ambari-web/app/utils/date/timezone.js
index 2d8a550..2421fca 100644
--- a/ambari-web/app/utils/date/timezone.js
+++ b/ambari-web/app/utils/date/timezone.js
@@ -34,10 +34,11 @@ var dataUtils = require('utils/data_manipulation');
  * List of timezones used in the user's settings popup
  *
  * <code>utcOffset</code> - offset-value (0, 180, 240 etc)
- * <code>value</code> - string like '(UTC+02:00) Europe / Athens, Kiev, Minsk'
+ * <code>value</code> - string like '120180|Europe'
+ * <code>label</code> - string like '(UTC+02:00) Europe / Athens, Kiev, Minsk'
  * <code>zones</code> - list of zone-objects from <code>moment.tz</code> 
included to the <code>value</code>
  *
- * @typedef {{utcOffset: number, label: string, value: string, zones: 
object[]}} shownTimezone
+ * @typedef {{utcOffset: number, label: string, value: string, label: string, 
zones: object[]}} shownTimezone
  */
 
 module.exports = Em.Object.create({
@@ -56,7 +57,7 @@ module.exports = Em.Object.create({
    * @type {object}
    * @readOnly
    */
-  timezonesMappedByLabel: function () {
+  timezonesMappedByValue: function () {
     var ret = {};
     this.get('timezones').forEach(function (tz) {
       ret[tz.value] = tz;
@@ -176,24 +177,24 @@ module.exports = Em.Object.create({
    * Example:
    * <pre>
    *   var zones = [
-   *    {groupByKey: 1, formattedOffset: '+01:00', value: 'a/Aa', region: 'a', 
city: 'Aa'},
-   *    {groupByKey: 1, formattedOffset: '+01:00', value: 'a/Bb', region: 'a', 
city: 'Bb'},
-   *    {groupByKey: 2, formattedOffset: '+02:00', value: 'a/Cc', region: 'a', 
city: 'Cc'},
-   *    {groupByKey: 2, formattedOffset: '+02:00', value: 'a/Dd', region: 'a', 
city: 'Dd'},
-   *    {groupByKey: 1, formattedOffset: '+01:00', value: 'b/Ee', region: 'b', 
city: 'Ee'},
-   *    {groupByKey: 1, formattedOffset: '+01:00', value: 'b/Ff', region: 'b', 
city: 'Ff'},
-   *    {groupByKey: 2, formattedOffset: '+02:00', value: 'b/Gg', region: 'b', 
city: 'Gg'},
-   *    {groupByKey: 2, formattedOffset: '+02:00', value: 'b/Hh', region: 'b', 
city: 'Hh'},
-   *    {groupByKey: 2, formattedOffset: '+02:00', value: 'b/II', region: 'b', 
city: 'II'}, // will be ignored, because city is abbreviation
-   *    {groupByKey: 2, formattedOffset: '+02:00', value: 'b',    region: 'b', 
city: ''  }  // will be ignored, because city is empty
+   *    {groupByKey: '1', formattedOffset: '+01:00', value: 'a/Aa', region: 
'a', city: 'Aa'},
+   *    {groupByKey: '1', formattedOffset: '+01:00', value: 'a/Bb', region: 
'a', city: 'Bb'},
+   *    {groupByKey: '2', formattedOffset: '+02:00', value: 'a/Cc', region: 
'a', city: 'Cc'},
+   *    {groupByKey: '2', formattedOffset: '+02:00', value: 'a/Dd', region: 
'a', city: 'Dd'},
+   *    {groupByKey: '1', formattedOffset: '+01:00', value: 'b/Ee', region: 
'b', city: 'Ee'},
+   *    {groupByKey: '1', formattedOffset: '+01:00', value: 'b/Ff', region: 
'b', city: 'Ff'},
+   *    {groupByKey: '2', formattedOffset: '+02:00', value: 'b/Gg', region: 
'b', city: 'Gg'},
+   *    {groupByKey: '2', formattedOffset: '+02:00', value: 'b/Hh', region: 
'b', city: 'Hh'},
+   *    {groupByKey: '2', formattedOffset: '+02:00', value: 'b/II', region: 
'b', city: 'II'}, // will be ignored, because city is abbreviation
+   *    {groupByKey: '2', formattedOffset: '+02:00', value: 'b',    region: 
'b', city: ''  }  // will be ignored, because city is empty
    *   ];
    *   var groupedZones = _groupTimezones(zones);
    *   // groupedZones is:
    *   [
-   *    {utcOffset: 1, value: '(UTC+01:00) a / Aa, Bb'},
-   *    {utcOffset: 1, value: '(UTC+01:00) b / Ee, Ff'},
-   *    {utcOffset: 2, value: '(UTC+02:00) a / Cc, Dd'},
-   *    {utcOffset: 2, value: '(UTC+02:00) b / Gg, Hh'}
+   *    {utcOffset: 1, label: '(UTC+01:00) a / Aa, Bb', value: '1|a'},
+   *    {utcOffset: 1, label: '(UTC+01:00) b / Ee, Ff', value: '1|b'},
+   *    {utcOffset: 2, label: '(UTC+02:00) a / Cc, Dd', value: '2|a'},
+   *    {utcOffset: 2, label: '(UTC+02:00) b / Gg, Hh', value: '2|b'}
    *   ]
    * </pre>
    *
@@ -213,9 +214,11 @@ module.exports = Em.Object.create({
         }).uniq().join(', ');
         var formattedOffset = Em.get(groupedByRegionZones[region], 
'firstObject.formattedOffset');
         var utcOffset = Em.get(groupedByRegionZones[region], 
'firstObject.utcOffset');
+        var value = Em.get(groupedByRegionZones[region], 
'firstObject.groupByKey') + '|' + region;
         newZones.pushObject({
           utcOffset: utcOffset,
-          value: '(UTC' + formattedOffset + ') ' + region + (cities ? ' / ' + 
cities : ''),
+          label: '(UTC' + formattedOffset + ') ' + region + (cities ? ' / ' + 
cities : ''),
+          value: value,
           zones: groupedByRegionZones[region]
         });
       });

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f2aa2c2/ambari-web/app/utils/helper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/helper.js b/ambari-web/app/utils/helper.js
index 03bbce0..9489eee 100644
--- a/ambari-web/app/utils/helper.js
+++ b/ambari-web/app/utils/helper.js
@@ -635,7 +635,7 @@ App.dateTime = function() {
 App.dateTimeWithTimeZone = function (x) {
   var timezone = 
App.router.get('userSettingsController.userSettings.timezone');
   if (timezone) {
-    var tz = 
Em.getWithDefault(timezoneUtils.get('timezonesMappedByLabel')[timezone], 
'zones.0.value', '');
+    var tz = Em.getWithDefault(timezone, 'zones.0.value', '');
     return moment(moment.tz(x ? new Date(x) : new Date(), 
tz).toArray()).toDate().getTime();
   }
   return x || new Date().getTime();

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f2aa2c2/ambari-web/test/controllers/global/user_settings_controller_test.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/test/controllers/global/user_settings_controller_test.js 
b/ambari-web/test/controllers/global/user_settings_controller_test.js
index 99a7df2..92bb346 100644
--- a/ambari-web/test/controllers/global/user_settings_controller_test.js
+++ b/ambari-web/test/controllers/global/user_settings_controller_test.js
@@ -24,7 +24,13 @@ describe('App.UserSettingsController', function () {
   beforeEach(function () {
     userSettingsController = App.UserSettingsController.create();
   });
-  
+
+  describe('#userSettingsKeys', function () {
+    it('should not be empty', function () {
+      
expect(Object.keys(userSettingsController.get('userSettingsKeys'))).to.have.length.gt(0);
+    });
+  });
+
   describe('#showSettingsPopup', function() {
     var dataToShowRes = {};
 
@@ -71,4 +77,26 @@ describe('App.UserSettingsController', function () {
     });
   });
 
+  describe('#updateUserPrefWithDefaultValues', function () {
+
+    beforeEach(function () {
+      sinon.stub(userSettingsController, 'postUserPref', Em.K);
+    });
+
+    afterEach(function () {
+      userSettingsController.postUserPref.restore();
+    });
+
+    it('should update user pref with default values', function () {
+      userSettingsController.updateUserPrefWithDefaultValues(null, true);
+      expect(userSettingsController.postUserPref.called).to.be.false;
+    });
+
+    it('should not update user pref with default values', function () {
+      userSettingsController.updateUserPrefWithDefaultValues(null, false);
+      expect(userSettingsController.postUserPref.called).to.be.true;
+    });
+
+  });
+
 });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/1f2aa2c2/ambari-web/test/utils/date/timezone_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/utils/date/timezone_test.js 
b/ambari-web/test/utils/date/timezone_test.js
index 4b9027a..837557b 100644
--- a/ambari-web/test/utils/date/timezone_test.js
+++ b/ambari-web/test/utils/date/timezone_test.js
@@ -23,16 +23,16 @@ describe('timezoneUtils', function () {
   describe('#_groupTimezones', function () {
 
     var formattedTimezones = [
-      {utcOffset: 1, groupByKey: 1, formattedOffset: '+01:00', value: 'a/Aa', 
region: 'a', city: 'Aa'},
-      {utcOffset: 1, groupByKey: 1, formattedOffset: '+01:00', value: 'a/Bb', 
region: 'a', city: 'Bb'},
-      {utcOffset: 2, groupByKey: 2, formattedOffset: '+02:00', value: 'a/Cc', 
region: 'a', city: 'Cc'},
-      {utcOffset: 2, groupByKey: 2, formattedOffset: '+02:00', value: 'a/Dd', 
region: 'a', city: 'Dd'},
-      {utcOffset: 1, groupByKey: 1, formattedOffset: '+01:00', value: 'b/Ee', 
region: 'b', city: 'Ee'},
-      {utcOffset: 1, groupByKey: 1, formattedOffset: '+01:00', value: 'b/Ff', 
region: 'b', city: 'Ff'},
-      {utcOffset: 2, groupByKey: 2, formattedOffset: '+02:00', value: 'b/Gg', 
region: 'b', city: 'Gg'},
-      {utcOffset: 2, groupByKey: 2, formattedOffset: '+02:00', value: 'b/Hh', 
region: 'b', city: 'Hh'},
-      {utcOffset: 2, groupByKey: 2, formattedOffset: '+02:00', value: 'b/II', 
region: 'b', city: 'II'},
-      {utcOffset: 2, groupByKey: 2, formattedOffset: '+02:00', value: 'b', 
region: 'b', city: ''}
+      {utcOffset: 1, groupByKey: '1', formattedOffset: '+01:00', value: 
'a/Aa', region: 'a', city: 'Aa'},
+      {utcOffset: 1, groupByKey: '1', formattedOffset: '+01:00', value: 
'a/Bb', region: 'a', city: 'Bb'},
+      {utcOffset: 2, groupByKey: '2', formattedOffset: '+02:00', value: 
'a/Cc', region: 'a', city: 'Cc'},
+      {utcOffset: 2, groupByKey: '2', formattedOffset: '+02:00', value: 
'a/Dd', region: 'a', city: 'Dd'},
+      {utcOffset: 1, groupByKey: '1', formattedOffset: '+01:00', value: 
'b/Ee', region: 'b', city: 'Ee'},
+      {utcOffset: 1, groupByKey: '1', formattedOffset: '+01:00', value: 
'b/Ff', region: 'b', city: 'Ff'},
+      {utcOffset: 2, groupByKey: '2', formattedOffset: '+02:00', value: 
'b/Gg', region: 'b', city: 'Gg'},
+      {utcOffset: 2, groupByKey: '2', formattedOffset: '+02:00', value: 
'b/Hh', region: 'b', city: 'Hh'},
+      {utcOffset: 2, groupByKey: '2', formattedOffset: '+02:00', value: 
'b/II', region: 'b', city: 'II'},
+      {utcOffset: 2, groupByKey: '2', formattedOffset: '+02:00', value: 'b', 
region: 'b', city: ''}
     ];
 
     before(function () {
@@ -52,7 +52,7 @@ describe('timezoneUtils', function () {
       '(UTC+01:00) b / Ee, Ff',
       '(UTC+02:00) a / Cc, Dd',
       '(UTC+02:00) b / Gg, Hh'];
-      var values = this.result.mapProperty('value');
+      var values = this.result.mapProperty('label');
       expect(values).to.eql(expected);
       expect(values.join('')).to.not.contain('II');
       expect(values.join('')).to.not.contain(', ,');
@@ -139,35 +139,31 @@ describe('timezoneUtils', function () {
     it('Detect UTC+1', function () {
       mockTimezoneOffset(0, 60);
       var tz = timezoneUtils.detectUserTimezone();
-      expect(tz).to.contain('(UTC+01:00) Atlantic');
+      expect(tz).to.contain('0-60|Atlantic');
     });
 
     it('Detect UTC+1 for Europe', function () {
       mockTimezoneOffset(0, 60);
       var tz = timezoneUtils.detectUserTimezone('Europe');
-      expect(tz).to.contain('(UTC+01:00) Europe');
-      expect(tz).to.contain('London');
+      expect(tz).to.contain('0-60|Europe');
     });
 
     it('Detect UTC-4', function () {
       mockTimezoneOffset(-300, -240);
       var tz = timezoneUtils.detectUserTimezone();
-      expect(tz).to.contain('(UTC-04:00) America');
-      expect(tz).to.contain('New York');
+      expect(tz).to.contain('300240|America');
     });
 
     it('Detect UTC+3 for Asia', function () {
       mockTimezoneOffset(120, 180);
       var tz = timezoneUtils.detectUserTimezone();
-      expect(tz).to.contain('(UTC+03:00) Asia');
-      expect(tz).to.contain('Damascus');
+      expect(tz).to.contain('-120-180|Asia');
     });
 
     it('Detect UTC-7', function () {
       mockTimezoneOffset(-480, -420);
       var tz = timezoneUtils.detectUserTimezone();
-      expect(tz).to.contain('(UTC-07:00) America');
-      expect(tz).to.contain('Los Angeles');
+      expect(tz).to.contain('480420|America');
     });
 
   });

Reply via email to