You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by pa...@apache.org on 2016/06/30 10:58:40 UTC

ambari git commit: AMBARI-17482. Hive2 view : port changes of following 8 UI bugs in hive2 view (pallavkul)

Repository: ambari
Updated Branches:
  refs/heads/trunk d6327321c -> 2fa027c18


AMBARI-17482. Hive2 view : port changes of following 8 UI bugs in hive2 view (pallavkul)


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

Branch: refs/heads/trunk
Commit: 2fa027c1869467fe35ea8de5849abc68cf10dfd7
Parents: d632732
Author: Pallav Kulshreshtha <pa...@gmail.com>
Authored: Thu Jun 30 16:27:00 2016 +0530
Committer: Pallav Kulshreshtha <pa...@gmail.com>
Committed: Thu Jun 30 16:27:00 2016 +0530

----------------------------------------------------------------------
 .../app/components/date-range-widget.js         |  13 ++
 .../ui/hive-web/app/controllers/databases.js    |  21 +++-
 .../controllers/index/history-query/explain.js  |  14 ++-
 .../ui/hive-web/app/controllers/open-queries.js |   5 +-
 .../ui/hive-web/app/initializers/i18n.js        |   1 +
 .../ui/hive-web/app/services/settings.js        |  44 +++++--
 .../resources/ui/hive-web/app/styles/app.scss   |  28 ++++-
 .../app/templates/components/tree-view.hbs      |   2 +-
 .../app/templates/databases-search-results.hbs  |   6 +-
 .../ui/hive-web/app/templates/databases.hbs     |   4 +-
 .../templates/index/history-query/explain.hbs   |  14 ++-
 .../ui/hive-web/tests/helpers/api-mock.js       |  13 ++
 .../ui/hive-web/tests/helpers/dbclick.js        |  26 ++++
 .../hive-web/tests/integration/database-test.js |  27 ++++
 .../tests/integration/query-editor-test.js      |  20 +++
 .../tests/integration/saved-queries-test.js     |  30 ++++-
 .../ui/hive-web/tests/integration/udfs-test.js  |  18 +++
 .../tests/unit/components/udf-tr-view-test.js   | 122 +++++++++++++++++++
 .../tests/unit/controllers/udfs-test.js         |  26 +++-
 19 files changed, 403 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/app/components/date-range-widget.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/components/date-range-widget.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/components/date-range-widget.js
index 9e38786..a9315ba 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/components/date-range-widget.js
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/components/date-range-widget.js
@@ -68,6 +68,7 @@ export default Ember.Component.extend({
 
     this.$(".toDate").datepicker({
       defaultDate: new Date(dateRange.get('to')),
+
       minDate: new Date(dateRange.get('from')),
 
       onSelect: function (selectedDate) {
@@ -80,6 +81,18 @@ export default Ember.Component.extend({
       }
     });
 
+    this.$(".fromDate").on('blur', () => {
+      if(moment(self.$(".fromDate").val(), 'MM/DD/YYYY', true).format() === 'Invalid date'){
+        self.$(".fromDate").val('')
+      }
+    });
+
+    this.$(".toDate").on('blur', () => {
+      if(moment(self.$(".toDate").val(), 'MM/DD/YYYY', true).format() === 'Invalid date'){
+        self.$(".toDate").val('')
+      }
+    });
+
     this.set('rendered', true);
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/databases.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/databases.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/databases.js
index b76bca3..2c3cd5e 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/databases.js
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/databases.js
@@ -33,6 +33,8 @@ export default Ember.Controller.extend({
   tableSearchResults: Ember.Object.create(),
 
   isDatabaseRefreshInProgress: false,
+  showColumnsResultAlert: false,
+  textColumnSearchTerm:'',
 
   tableControls: [
     {
@@ -357,6 +359,8 @@ export default Ember.Controller.extend({
 
       searchTerm = searchTerm ? searchTerm.toLowerCase() : '';
 
+      this.set('showColumnsResultAlert', false);
+
       this.set('tablesSearchTerm', searchTerm);
       resultsTab.set('visible', true);
       this.set('selectedTab', resultsTab);
@@ -381,18 +385,33 @@ export default Ember.Controller.extend({
 
       searchTerm = searchTerm ? searchTerm.toLowerCase() : '';
 
-      this.set('selectedTab', resultsTab);
+      this.set('columnSearchTerm', searchTerm);
+      this.set('textColumnSearchTerm', searchTerm);
 
+      this.set('selectedTab', resultsTab);
       this.set('isLoading', true);
+      this.set('showColumnsResultAlert', false);
+
+      var tableCount = tables.length || 0;
+      var noColumnMatchTableCount = 0;
 
       tables.forEach(function (table) {
         self.get('databaseService').getColumnsPage(database.get('name'), table, searchTerm, true).then(function (result) {
+
+          if(Ember.isEmpty(result.columns)){
+            noColumnMatchTableCount = noColumnMatchTableCount + 1;
+          }
           table.set('columns', result.columns);
           table.set('hasNext', result.hasNext);
 
           if (tables.indexOf(table) === tables.get('length') -1) {
             self.set('isLoading', false);
           }
+
+          // This will execute only in the last interation
+          if(noColumnMatchTableCount === tableCount) {
+            self.set('showColumnsResultAlert', true);
+          }
         }, function (err) {
           self._handleError(err);
         });

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/index/history-query/explain.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/index/history-query/explain.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/index/history-query/explain.js
index 20092e2..bc74e0b 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/index/history-query/explain.js
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/index/history-query/explain.js
@@ -119,7 +119,6 @@ export default Ember.ObjectController.extend({
               } else {
                 formatted.pushObject(currentNode);
               }
-
               break;
             }
           }
@@ -128,7 +127,16 @@ export default Ember.ObjectController.extend({
         formatted.pushObject(currentNode);
       }
     }
-
+    formatted = this.filterExplain(formatted);
     this.set('formattedExplain', formatted);
+  },
+  filterExplain: function (explain){
+    var formattedExplain = explain.filter(function(item){
+      if(item.text !== '""'){
+        return item;
+      }
+    })
+    return formattedExplain;
   }
-});
\ No newline at end of file
+});
+

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/open-queries.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/open-queries.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/open-queries.js
index a4048be..e4e1490 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/open-queries.js
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/open-queries.js
@@ -364,7 +364,10 @@ export default Ember.ArrayController.extend({
             });
           }, function () {
             model.rollback();
-            query.rollback();
+            // Rollback the query if it is a DS model
+            if(query.get('constructor.typeKey') !== undefined) {
+              query.rollback();
+            }
             self.closeTab(tab, true);
           });
         }

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/app/initializers/i18n.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/initializers/i18n.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/initializers/i18n.js
index d2f6aaf..056db29 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/initializers/i18n.js
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/initializers/i18n.js
@@ -212,6 +212,7 @@ TRANSLATIONS = {
 
   labels: {
     noTablesMatch: 'No tables match',
+    noColumnsMatch: 'No columns match',
     table: 'Table ',
     hoursShort: "{{hours}} hrs",
     minsShort: "{{minutes}} mins",

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/app/services/settings.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/services/settings.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/services/settings.js
index b813bbf..df135d3 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/services/settings.js
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/services/settings.js
@@ -124,20 +124,40 @@ export default Ember.Service.extend({
     var url      = adapter.buildURL() + '/savedQueries/defaultSettings';
     var settings = this.get('settings');
 
-    settings.forEach(function(setting) {
-      data[ setting.get('key.name') ] = setting.get('value');
-    });
+    var settingException = {};
+
+    try {
+      settings.forEach(function(setting) {
+
+        settingException['value'] = Ember.isEmpty(setting.get('value'));
+
+        if(settingException['value']) {
+          settingException['name'] = setting.get('key.name');
+          throw settingException
+        }
+        data[setting.get('key.name')] = setting.get('value');
+
+      });
+    } catch(e) {
+      if (e!==settingException) throw e;
+    }
+
+
+    if(settingException['value']){
+      self.get('notifyService').error('Please enter the value for '+ settingException['name'] );
+      return;
+    }
 
     adapter.ajax(url, 'POST', {
-      data: {settings: data }
-    })
-    .then(function(response) {
-      if (response && response.settings) {
-        self.get('notifyService').success(Ember.I18n.t('alerts.success.settings.saved'));
-      } else {
-        self.get('notifyService').error(response);
-      }
-    });
+        data: {settings: data }
+      })
+      .then(function(response) {
+        if (response && response.settings) {
+          self.get('notifyService').success(Ember.I18n.t('alerts.success.settings.saved'));
+        } else {
+          self.get('notifyService').error(response);
+        }
+      });
   },
 
   getSettings: function() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/app/styles/app.scss
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/styles/app.scss b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/styles/app.scss
index 803d9b7..d72ae8c 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/styles/app.scss
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/styles/app.scss
@@ -468,6 +468,7 @@ body {
   .input-group-addon {
     text-align: justify;
     width: 50%;
+    vertical-align: top;
   }
 }
 
@@ -475,11 +476,15 @@ body {
   line-height: 30px;
   font-size: 18px;
   cursor: pointer;
+  position: absolute;
 }
 
 .setting .setting-input-value {
   width: calc(100% - 30px);
   display: inline-block;
+  input {
+    height: 33px;
+  }
 }
 .setting .global-setting-value {
   width: calc(100% - 25px);
@@ -640,6 +645,11 @@ td.data-upload-form-field {
     width: 350px;
 }
 
+.hdfsPath {
+  width: 80%;
+  display: inline;
+}
+
 #hdfs-param input {
   width: 80%;
   display: inline;
@@ -675,10 +685,26 @@ td.data-upload-form-field {
   padding-right: 10px;
 }
 
+.accordion-body {
+   word-break: break-all;
+   overflow-y: scroll;
+}
+
 table.no-border, table.no-border tr, table.no-border tr td {
   border: none;
 }
 
 .red-border {
   border-color :red;
-}
\ No newline at end of file
+}
+
+ul.explainlist li{
+  background: none;
+  word-break: break-all;
+  padding: 0;
+}
+
+pre.explainprint{
+ line-height: 0.5;
+ padding: 12px 15px;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/components/tree-view.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/components/tree-view.hbs b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/components/tree-view.hbs
index cb83ec3..ef9a566 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/components/tree-view.hbs
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/components/tree-view.hbs
@@ -16,7 +16,7 @@
 * limitations under the License.
 }}
 
-<ul class="list-unstyled">
+<ul class="list-unstyled explainlist">
   {{#each item in content}}
     <li>
       {{item.text}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/databases-search-results.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/databases-search-results.hbs b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/databases-search-results.hbs
index 007d9ca..8ff3895 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/databases-search-results.hbs
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/databases-search-results.hbs
@@ -37,10 +37,14 @@
           {{/if}}
         </div>
       {{/each}}
-
       {{#if tableSearchResults.hasNext}}
         <strong><a {{action "showMoreResultTables" database}}>{{t "buttons.loadMore"}}</a></strong>
       {{/if}}
+      {{#if showColumnsResultAlert}}
+        <div class="alert alert-warning database-explorer-alert" role="alert">
+          {{t "labels.noColumnsMatch"}} <strong>&quot;{{textColumnSearchTerm}}&quot;</strong>
+        </div>
+      {{/if}}
     </div>
   </div>
 {{else}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/databases.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/databases.hbs b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/databases.hbs
index 290cdac..3997ea8 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/databases.hbs
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/databases.hbs
@@ -29,7 +29,7 @@
     <hr />
 
     {{#if selectedDatabase}}
-      {{extended-input class="form-control input-sm mozBoxSizeFix"
+      {{extended-input class="form-control input-sm mozBoxSizeFix input-sm search-tables-text"
                        placeholderTranslation="placeholders.search.tables"
                        valueSearched="searchTables"
                        value=tableSearchTerm}}
@@ -39,7 +39,7 @@
 
 
     {{#if tableSearchResults.tables}}
-      {{extended-input class="form-control input-sm mozBoxSizeFix"
+      {{extended-input class="form-control input-sm mozBoxSizeFix search-columns-text"
                        placeholderTranslation="placeholders.search.columns"
                        valueSearched="searchColumns"
                        value=columnSearchTerm}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/index/history-query/explain.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/index/history-query/explain.hbs b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/index/history-query/explain.hbs
index 3f8810f..f7948e2 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/index/history-query/explain.hbs
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/templates/index/history-query/explain.hbs
@@ -15,9 +15,13 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 }}
-
+<pre class="explainprint">
 {{#each header in formattedExplain}}
-  {{#expander-widget heading=header.text}}
-    {{tree-view content=header.contents}}
-  {{/expander-widget}}
-{{/each}}
\ No newline at end of file
+  {{#if header.text}}
+    <div>{{header.text}}</div>
+    {{#if header.contents.length }}
+      {{tree-view content=header.contents}}
+    {{/if}}
+  {{/if}}
+{{/each}}
+</pre>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/helpers/api-mock.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/helpers/api-mock.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/helpers/api-mock.js
index ed4822d..5bf41e6 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/helpers/api-mock.js
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/helpers/api-mock.js
@@ -246,6 +246,15 @@ export default function() {
     return [200, {"Content-Type": "application/json"}, JSON.stringify(files)];
   });
 
+  this.delete(baseUrl + '/fileResources/1', function (req) {
+    return [200, {"Content-Type": "application/json"}, JSON.stringify({})];
+  });
+
+  this.put(baseUrl + '/udfs/1', function (req) {
+    return [200, {"Content-Type": "application/json"}, JSON.stringify({})];
+  });
+
+
   this.get(baseUrl + '/fileResources/1', function (req) {
     var files = {
       "fileResources": [
@@ -274,6 +283,10 @@ export default function() {
     return [200, {"Content-Type": "application/json"}, JSON.stringify(data)];
   });
 
+  this.delete(baseUrl + '/savedQueries/1', function (req) {
+    return [200, {"Content-Type": "application/json"}, JSON.stringify({})];
+  });
+
   this.get(baseUrl + '/api/v1/views/TEZ/versions/1', function (req) {
     var data = {
       instances: [

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/helpers/dbclick.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/helpers/dbclick.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/helpers/dbclick.js
new file mode 100644
index 0000000..e6dfe83
--- /dev/null
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/helpers/dbclick.js
@@ -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.
+ */
+
+Ember.Test.registerAsyncHelper('dblclick',
+  function (app, selector, context) {
+    var $el = findWithAssert(selector, context);
+    Ember.run(function () {
+      $el.dblclick();
+    });
+  }
+);

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/database-test.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/database-test.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/database-test.js
index 52cda77..1af72c8 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/database-test.js
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/database-test.js
@@ -101,3 +101,30 @@ test('Searching for a table will display table results and column search field',
     });
   });
 });
+
+
+test('Users can search tables', function (assert) {
+  assert.expect(4);
+
+  visit('/');
+
+  andThen(function () {
+    fillIn(find('.database-explorer .search-tables-text'), 'not_found');
+    keyEvent(find('.database-explorer .search-tables-text'), 'keyup', 13);
+  });
+
+  andThen(function () {
+    assert.ok(find('.alert-warning .database-explorer-alert'), 'Alert is show when a table is not found');
+  });
+
+  andThen(function () {
+    fillIn(find('.database-explorer .search-tables-text'), 'table');
+    keyEvent(find('.database-explorer .search-tables-text'), 'keyup', 13);
+  });
+
+  andThen(function () {
+    assert.ok(find('.database-explorer .nav-tabs li:last').hasClass('active'), 'Search results tab is active');
+    assert.ok(find('.database-explorer .databases .fa-database').length, 'Found databases are shown');
+    assert.ok(find('.database-explorer .databases .tables').length, 'Found tables are shown');
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/query-editor-test.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/query-editor-test.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/query-editor-test.js
index b409e12..3073013 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/query-editor-test.js
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/query-editor-test.js
@@ -20,6 +20,7 @@ import Ember from 'ember';
 import { test } from 'ember-qunit';
 import startApp from '../helpers/start-app';
 import api from '../helpers/api-mock';
+import '../helpers/dbclick';
 
 var App;
 var server;
@@ -104,3 +105,22 @@ test('Can save query', function() {
 
   click('.modal-footer .btn-danger');
 });
+
+test('Can change tab title', function (assert) {
+  assert.expect(1);
+
+  visit('/');
+
+  andThen(function () {
+    dblclick('.query-editor-panel tabs li:first a');
+
+    andThen(function () {
+      fillIn('.modal-body input', 'WS');
+      click('.modal-footer .btn-success');
+
+      andThen(function () {
+        assert.equal(find('.query-editor-panel tabs li:first a').text().trim(), 'WS', 'Tab renamed');
+      });
+    });
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/saved-queries-test.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/saved-queries-test.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/saved-queries-test.js
index c444523..fdbcd4e 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/saved-queries-test.js
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/saved-queries-test.js
@@ -117,10 +117,36 @@ test('Saved Query options menu', function() {
   expect(2);
 
   visit("/queries");
-  click('.fa-gear');
+  click('.fa-gear:first');
 
   andThen(function() {
     equal(find('.dropdown-menu:visible').length, 1, 'Query menu is visible');
     equal(find('.dropdown-menu:visible li').length, 2, 'Query menu has 2 options');
   });
-});
\ No newline at end of file
+});
+
+test('User is able to see history for a query', function (assert) {
+  assert.expect(2);
+
+  visit("/queries");
+  click('.fa-gear:first');
+  click('.dropdown-menu:visible li:first');
+
+  andThen(function () {
+    assert.equal(currentURL(), "/history", 'User is redirected to history');
+    assert.equal(find('#content .table tbody tr').length, 1, 'Queries are filtered');
+  });
+});
+
+test('User is able to delete a query', function (assert) {
+  assert.expect(1);
+
+  visit("/queries");
+  click('.fa-gear:first');
+  click('.dropdown-menu:visible li:last');
+  click('.modal-footer .btn-success');
+
+  andThen(function () {
+    equal(find('#content .table tbody tr').length, 1, 'Query deleted');
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/udfs-test.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/udfs-test.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/udfs-test.js
index 95a0043..526efc0 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/udfs-test.js
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/integration/udfs-test.js
@@ -89,3 +89,21 @@ test('User is able to add udf', function() {
     equal(find('#content .table tbody tr').length, 3);
   });
 });
+
+
+test('Can delete file resource', function (assert) {
+  assert.expect(1);
+
+  visit('/udfs');
+  click('.fa-gear:first');
+  click('.dropdown-menu li:first');
+  click('.dropdown-toggle:first');
+  click('.fa-remove:first');
+
+  andThen(function () {
+    click('.modal-footer .btn-success');
+    click('tr.ember-view:first .btn-success');
+  });
+
+  assert.equal($('tr.ember-view:first td:first').text().trim().length, 0, 'File Resource Deleted');
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/unit/components/udf-tr-view-test.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/unit/components/udf-tr-view-test.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/unit/components/udf-tr-view-test.js
new file mode 100644
index 0000000..18916de
--- /dev/null
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/unit/components/udf-tr-view-test.js
@@ -0,0 +1,122 @@
+/**
+ * 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.
+ */
+
+import Ember from 'ember';
+import { moduleForComponent, test } from 'ember-qunit';
+
+moduleForComponent('udf-tr-view', 'UdfTrViewComponent', {
+  unit: true,
+  needs: ['component:select-widget']
+});
+
+test('Can send actions', function (assert) {
+  assert.expect(6);
+
+  var targetObject = {
+    onDeleteUdf: function () {
+      assert.ok(true, 'onDeleteUdf called');
+    },
+    onAddFileResource: function () {
+      assert.ok(true, 'onAddFileResource called');
+    },
+    onDeleteFileResource: function () {
+      assert.ok(true, 'onDeleteFileResource called');
+    },
+    onSaveUdf: function () {
+      assert.ok(true, 'onSaveUdf called');
+    },
+  };
+
+  var component = this.subject({
+    onDeleteUdf: 'onDeleteUdf',
+    onAddFileResource: 'onAddFileResource',
+    onDeleteFileResource: 'onDeleteFileResource',
+    onSaveUdf: 'onSaveUdf',
+
+    targetObject: targetObject,
+
+    udf: Ember.Object.create()
+  });
+
+  Ember.run(function () {
+    component.send('deleteUdf');
+    component.send('addFileResource');
+    component.send('deleteFileResource');
+    component.send('save');
+
+    component.send('editUdf');
+    component.send('editFileResource', {});
+  });
+
+  assert.ok(component.get('udf.isEditing'), 'Can edit udf');
+  assert.ok(component.get('udf.isEditingResource'), 'Can edit resource');
+});
+
+test('It sets isEditing to true if udf.isNew', function (assert) {
+  assert.expect(1);
+
+  var component = this.subject({
+    udf: Ember.Object.create({
+      isNew: true,
+      isEditing: false
+    })
+  });
+
+  var $component = this.render();
+  assert.ok(component.get('udf.isEditing'), 'isEditing set to true');
+});
+
+test('Cancel edit whould rollback changes', function (assert) {
+  assert.expect(5);
+
+  var backup = 'fileResource backup';
+  var file = Ember.Object.create({
+    rollback: function () {
+      assert.ok(true, 'file.rollback() called');
+    }
+  });
+
+  var udf = Ember.Object.create({
+    isEditing: true,
+    isEditingResource: true,
+    get: function () {
+      var defer = new Ember.RSVP.defer;
+      defer.resolve(file);
+
+      return defer.promise;
+    },
+    rollback: function () {
+      assert.ok(true, 'udf.rollback() called');
+    }
+  });
+
+  var component = this.subject({
+    file: file,
+    udf: udf,
+    fileBackup: backup
+  });
+
+  Ember.run(function () {
+    component.send('cancel');
+  });
+
+  assert.ok(!component.get('udf.isEditing'), 'isEditing set to false');
+  assert.ok(!component.get('udf.isEditingResource'), 'isEditingResource set to false');
+
+  assert.equal(component.get('udf.fileResource'), backup, 'backup is set as file resource');
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/2fa027c1/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/unit/controllers/udfs-test.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/unit/controllers/udfs-test.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/unit/controllers/udfs-test.js
index 5bd369e..2568d4a 100644
--- a/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/unit/controllers/udfs-test.js
+++ b/contrib/views/hive-next/src/main/resources/ui/hive-web/tests/unit/controllers/udfs-test.js
@@ -19,7 +19,11 @@
 import Ember from 'ember';
 import { moduleFor, test } from 'ember-qunit';
 
-moduleFor('controller:udfs', 'UdfsController', {});
+moduleFor('controller:udfs', 'UdfsController', {
+  needs: [
+    'model:file-resource'
+  ]
+});
 
 test('controller is initialized', function() {
   expect(3);
@@ -57,4 +61,22 @@ test('add', function() {
   Ember.run(function () {
     component.send('add');
   });
-});
\ No newline at end of file
+});
+
+test('handleAddFileResource', function (assert) {
+  assert.expect(2);
+
+  var udf = Ember.Object.create({
+    isEditingResource: false,
+    fileResource: null
+  });
+
+  var controller = this.subject();
+
+  Ember.run(function () {
+    controller.send('handleAddFileResource', udf);
+  });
+
+  assert.ok(udf.get('fileResource'), 'File Resource created');
+  assert.ok(udf.get('isEditingResource'), 'Editing mode in enabled');
+});