Browse Source

HUE-5832 [autocomplete] Add initial jasmine tests for SqlAutocompleter3

Johan Ahlen 8 years ago
parent
commit
9b084c4d7e

+ 35 - 32
desktop/core/src/desktop/static/desktop/js/sqlAutocompleter3.js

@@ -14,7 +14,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-var SqlAutocompleter3 = (function () {
+var AutocompleteResults = (function () {
 
   var normalizedColors = HueColors.getNormalizedColors();
 
@@ -116,7 +116,7 @@ var SqlAutocompleter3 = (function () {
    * @param options
    * @constructor
    */
-  function Suggestions (options) {
+  function AutocompleteResults (options) {
     var self = this;
     self.apiHelper = ApiHelper.getInstance();
     self.snippet = options.snippet;
@@ -265,7 +265,7 @@ var SqlAutocompleter3 = (function () {
     }).extend({ rateLimit: 200 });
   }
 
-  Suggestions.prototype.backTickIfNeeded = function (text) {
+  AutocompleteResults.prototype.backTickIfNeeded = function (text) {
     var self = this;
     if (text.indexOf('`') === 0) {
       return text;
@@ -283,7 +283,7 @@ var SqlAutocompleter3 = (function () {
     return text;
   };
 
-  Suggestions.prototype.update = function (parseResult) {
+  AutocompleteResults.prototype.update = function (parseResult) {
     var self = this;
 
     while (self.activeDeferrals.length > 0) {
@@ -353,7 +353,7 @@ var SqlAutocompleter3 = (function () {
    *
    * @returns {object} - jQuery Deferred
    */
-  Suggestions.prototype.handleColumnReference = function () {
+  AutocompleteResults.prototype.handleColumnReference = function () {
     var self = this;
     var colRefDeferred = $.Deferred();
     if (self.parseResult.colRef) {
@@ -384,7 +384,7 @@ var SqlAutocompleter3 = (function () {
     return colRefDeferred;
   };
 
-  Suggestions.prototype.loadDatabases = function () {
+  AutocompleteResults.prototype.loadDatabases = function () {
     var self = this;
     var databasesDeferred = $.Deferred();
     self.apiHelper.loadDatabases({
@@ -397,7 +397,7 @@ var SqlAutocompleter3 = (function () {
     return databasesDeferred;
   };
 
-  Suggestions.prototype.handleKeywords = function (colRefDeferred) {
+  AutocompleteResults.prototype.handleKeywords = function (colRefDeferred) {
     var self = this;
     if (self.parseResult.suggestKeywords) {
       var keywordSuggestions = $.map(self.parseResult.suggestKeywords, function (keyword) {
@@ -438,7 +438,7 @@ var SqlAutocompleter3 = (function () {
     }
   };
 
-  Suggestions.prototype.handleIdentifiers = function () {
+  AutocompleteResults.prototype.handleIdentifiers = function () {
     var self = this;
     if (self.parseResult.suggestIdentifiers) {
       var identifierSuggestions = [];
@@ -455,7 +455,7 @@ var SqlAutocompleter3 = (function () {
     }
   };
 
-  Suggestions.prototype.handleColumnAliases = function () {
+  AutocompleteResults.prototype.handleColumnAliases = function () {
     var self = this;
     if (self.parseResult.suggestColumnAliases) {
       var columnAliasSuggestions = [];
@@ -483,7 +483,7 @@ var SqlAutocompleter3 = (function () {
     }
   };
 
-  Suggestions.prototype.handleCommonTableExpressions = function () {
+  AutocompleteResults.prototype.handleCommonTableExpressions = function () {
     var self = this;
     if (self.parseResult.suggestCommonTableExpressions) {
       var commonTableExpressionSuggestions = [];
@@ -505,7 +505,7 @@ var SqlAutocompleter3 = (function () {
     }
   };
 
-  Suggestions.prototype.handleFunctions = function (colRefDeferred) {
+  AutocompleteResults.prototype.handleFunctions = function (colRefDeferred) {
     var self = this;
     if (self.parseResult.suggestFunctions) {
       var functionSuggestions = [];
@@ -551,7 +551,7 @@ var SqlAutocompleter3 = (function () {
     }
   };
 
-  Suggestions.prototype.handleDatabases = function (databasesDeferred) {
+  AutocompleteResults.prototype.handleDatabases = function (databasesDeferred) {
     var self = this;
     var suggestDatabases = self.parseResult.suggestDatabases;
     if (suggestDatabases) {
@@ -579,7 +579,7 @@ var SqlAutocompleter3 = (function () {
     }
   };
 
-  Suggestions.prototype.handleTables = function (databasesDeferred) {
+  AutocompleteResults.prototype.handleTables = function (databasesDeferred) {
     var self = this;
     var tablesDeferred = $.Deferred();
 
@@ -650,7 +650,7 @@ var SqlAutocompleter3 = (function () {
     return tablesDeferred;
   };
 
-  Suggestions.prototype.handleColumns = function (colRefDeferred, tablesDeferred) {
+  AutocompleteResults.prototype.handleColumns = function (colRefDeferred, tablesDeferred) {
     var self = this;
     var columnsDeferred = $.Deferred();
 
@@ -704,7 +704,7 @@ var SqlAutocompleter3 = (function () {
     return columnsDeferred;
   };
 
-  Suggestions.prototype.addColumns = function (table, types, columnSuggestions) {
+  AutocompleteResults.prototype.addColumns = function (table, types, columnSuggestions) {
     var self = this;
     var addColumnsDeferred = $.Deferred();
 
@@ -996,7 +996,7 @@ var SqlAutocompleter3 = (function () {
     return addColumnsDeferred;
   };
 
-  Suggestions.prototype.mergeColumns = function (columnSuggestions) {
+  AutocompleteResults.prototype.mergeColumns = function (columnSuggestions) {
     columnSuggestions.sort(function (a, b) {
       return a.value.localeCompare(b.value);
     });
@@ -1032,7 +1032,7 @@ var SqlAutocompleter3 = (function () {
     }
   };
 
-  Suggestions.prototype.handleValues = function (colRefDeferred) {
+  AutocompleteResults.prototype.handleValues = function (colRefDeferred) {
     var self = this;
     var suggestValues = self.parseResult.suggestValues;
     if (suggestValues) {
@@ -1066,7 +1066,7 @@ var SqlAutocompleter3 = (function () {
     }
   };
 
-  Suggestions.prototype.handlePaths = function () {
+  AutocompleteResults.prototype.handlePaths = function () {
     var self = this;
     var suggestHdfs = self.parseResult.suggestHdfs;
     var pathsDeferred = $.Deferred();
@@ -1111,7 +1111,7 @@ var SqlAutocompleter3 = (function () {
     return pathsDeferred;
   };
 
-  Suggestions.prototype.handleJoins = function () {
+  AutocompleteResults.prototype.handleJoins = function () {
     var self = this;
     var joinsDeferred = $.Deferred();
     var suggestJoins = self.parseResult.suggestJoins;
@@ -1188,7 +1188,7 @@ var SqlAutocompleter3 = (function () {
     return joinsDeferred;
   };
 
-  Suggestions.prototype.handleJoinConditions = function () {
+  AutocompleteResults.prototype.handleJoinConditions = function () {
     var self = this;
     var joinConditionsDeferred = $.Deferred();
     var suggestJoinConditions = self.parseResult.suggestJoinConditions;
@@ -1242,7 +1242,7 @@ var SqlAutocompleter3 = (function () {
     return joinConditionsDeferred;
   };
 
-  Suggestions.prototype.handleAggregateFunctions = function () {
+  AutocompleteResults.prototype.handleAggregateFunctions = function () {
     var self = this;
     var aggregateFunctionsDeferred = $.Deferred();
 
@@ -1318,7 +1318,7 @@ var SqlAutocompleter3 = (function () {
     return aggregateFunctionsDeferred;
   };
 
-  Suggestions.prototype.handleGroupBys = function () {
+  AutocompleteResults.prototype.handleGroupBys = function () {
     var self = this;
     var groupBysDeferred = $.Deferred();
     var suggestGroupBys = self.parseResult.suggestGroupBys;
@@ -1361,7 +1361,7 @@ var SqlAutocompleter3 = (function () {
     return groupBysDeferred;
   };
 
-  Suggestions.prototype.handleOrderBys = function () {
+  AutocompleteResults.prototype.handleOrderBys = function () {
     var self = this;
     var orderBysDeferred = $.Deferred();
     var suggestOrderBys = self.parseResult.suggestOrderBys;
@@ -1402,7 +1402,7 @@ var SqlAutocompleter3 = (function () {
     return orderBysDeferred;
   };
 
-  Suggestions.prototype.handleFilters = function () {
+  AutocompleteResults.prototype.handleFilters = function () {
     var self = this;
     var filtersDeferred = $.Deferred();
     var suggestFilters = self.parseResult.suggestFilters;
@@ -1462,7 +1462,7 @@ var SqlAutocompleter3 = (function () {
     return filtersDeferred;
   };
 
-  Suggestions.prototype.handlePopularTables = function (tablesDeferred) {
+  AutocompleteResults.prototype.handlePopularTables = function (tablesDeferred) {
     var self = this;
     var popularTablesDeferred = $.Deferred();
     if (HAS_OPTIMIZER && self.parseResult.suggestTables) {
@@ -1512,7 +1512,7 @@ var SqlAutocompleter3 = (function () {
     return popularTablesDeferred
   };
 
-  Suggestions.prototype.handlePopularColumns = function (columnsDeferred) {
+  AutocompleteResults.prototype.handlePopularColumns = function (columnsDeferred) {
     var self = this;
     var popularColumnsDeferred = $.Deferred();
     var suggestColumns = self.parseResult.suggestColumns;
@@ -1588,7 +1588,7 @@ var SqlAutocompleter3 = (function () {
     return popularColumnsDeferred;
   };
 
-  Suggestions.prototype.createNavOptIdentifier = function (navOptTableName, navOptColumnName, tables) {
+  AutocompleteResults.prototype.createNavOptIdentifier = function (navOptTableName, navOptColumnName, tables) {
     var self = this;
     var path = navOptTableName + '.' + navOptColumnName.split('.').pop();
     for (var i = 0; i < tables.length; i++) {
@@ -1609,7 +1609,7 @@ var SqlAutocompleter3 = (function () {
     return path;
   };
 
-  Suggestions.prototype.createNavOptIdentifierForColumn = function (navOptColumn, tables) {
+  AutocompleteResults.prototype.createNavOptIdentifierForColumn = function (navOptColumn, tables) {
     var self = this;
     for (var i = 0; i < tables.length; i++) {
       if (navOptColumn.dbName && (navOptColumn.dbName !== self.activeDatabase || navOptColumn.dbName !== tables[i].identifierChain[0].name)) {
@@ -1629,7 +1629,7 @@ var SqlAutocompleter3 = (function () {
     return navOptColumn.columnName;
   };
 
-  Suggestions.prototype.convertNavOptQualifiedIdentifier = function (qualifiedIdentifier, tables) {
+  AutocompleteResults.prototype.convertNavOptQualifiedIdentifier = function (qualifiedIdentifier, tables) {
     var self = this;
     var aliases = [];
     var tablesHasDefaultDatabase = false;
@@ -1659,8 +1659,7 @@ var SqlAutocompleter3 = (function () {
    * @param callback
    * @param errorCallback
    */
-
-  Suggestions.prototype.fetchFieldsForIdentifiers = function (originalIdentifierChain, callback, errorCallback) {
+  AutocompleteResults.prototype.fetchFieldsForIdentifiers = function (originalIdentifierChain, callback, errorCallback) {
     var self = this;
     var identifierChain = originalIdentifierChain.concat();
 
@@ -1751,6 +1750,10 @@ var SqlAutocompleter3 = (function () {
     }
   };
 
+  return AutocompleteResults;
+})();
+
+var SqlAutocompleter3 = (function () {
   /**
    * @param {Object} options
    * @param {Snippet} options.snippet
@@ -1760,7 +1763,7 @@ var SqlAutocompleter3 = (function () {
     var self = this;
     self.snippet = options.snippet;
     self.editor = options.editor;
-    self.suggestions = new Suggestions(options);
+    self.suggestions = new AutocompleteResults(options);
   }
 
   SqlAutocompleter3.prototype.autocomplete = function () {

+ 117 - 0
desktop/core/src/desktop/static/desktop/spec/sqlAutocompleter3Spec.js

@@ -0,0 +1,117 @@
+// Licensed to Cloudera, Inc. under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  Cloudera, Inc. 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.
+(function () {
+  describe('sqlAutocompleter3.js', function () {
+
+    describe('AutocompleteResults', function () {
+      var subject = new AutocompleteResults({
+        snippet: {
+          type: function () {
+            return 'hive';
+          },
+          database: function () {
+            'default'
+          }
+        }
+      });
+
+      it('should handle parse results with keywords', function () {
+        subject.entries([]);
+        expect(subject.filtered().length).toBe(0);
+        subject.update({
+          lowerCase: true,
+          suggestKeywords: [{ value: 'BAR', weight: 1 }, { value: 'FOO', weight: 2 }]
+        });
+        expect(subject.filtered().length).toBe(2);
+        console.log(subject.filtered());
+        // Sorted by weight, case adjusted
+        expect(subject.filtered()[0].meta).toBe(AutocompleterGlobals.i18n.meta.keyword);
+        expect(subject.filtered()[0].value).toBe('foo');
+        expect(subject.filtered()[1].meta).toBe(AutocompleterGlobals.i18n.meta.keyword);
+        expect(subject.filtered()[1].value).toBe('bar');
+      });
+
+      it('should handle parse results with identifiers', function () {
+        subject.entries([]);
+        expect(subject.filtered().length).toBe(0);
+        subject.update({
+          lowerCase: false,
+          suggestIdentifiers: [{ name: 'foo', type: 'alias' }, { name: 'bar', type: 'table' }]
+        });
+        expect(subject.filtered().length).toBe(2);
+        console.log(subject.filtered());
+        // Sorted by name, no case adjust
+        expect(subject.filtered()[0].meta).toBe('table');
+        expect(subject.filtered()[0].value).toBe('bar');
+        expect(subject.filtered()[1].meta).toBe('alias');
+        expect(subject.filtered()[1].value).toBe('foo');
+      });
+
+      it('should handle parse results with functions', function () {
+        subject.entries([]);
+        expect(subject.filtered().length).toBe(0);
+        subject.update({
+          lowerCase: false,
+          suggestFunctions: {}
+        });
+        expect(subject.filtered().length).toBeGreaterThan(0);
+        expect(subject.filtered()[0].details.arguments).toBeDefined();
+        expect(subject.filtered()[0].details.signature).toBeDefined();
+        expect(subject.filtered()[0].details.description).toBeDefined();
+      });
+    });
+
+    describe('SqlAutocomplete3', function () {
+
+      var createSubject = function (dialect, textBeforeCursor, textAfterCursor) {
+        return new SqlAutocompleter3({
+          snippet: {
+            type: function () {
+              return dialect;
+            },
+            database: function () {
+              'default'
+            }
+          },
+          editor: function() {
+            return {
+              getTextBeforeCursor: function () {
+                return textBeforeCursor;
+              },
+              getTextAfterCursor: function () {
+                return textAfterCursor;
+              }
+            }
+          }
+        })
+      };
+
+      it('should create suggestions for Hive', function () {
+        var subject = createSubject('hive', '', '');
+        expect(subject.suggestions.filtered().length).toBe(0);
+        subject.autocomplete();
+        expect(subject.suggestions.filtered().length).toBeGreaterThan(0);
+      });
+
+      it('should create suggestions for Impala', function () {
+        var subject = createSubject('impala', '', '');
+        expect(subject.suggestions.filtered().length).toBe(0);
+        subject.autocomplete();
+        expect(subject.suggestions.filtered().length).toBeGreaterThan(0);
+      });
+    });
+  });
+})();

+ 46 - 2
desktop/core/src/desktop/templates/jasmineRunner.html

@@ -8,17 +8,58 @@
   <link rel="stylesheet" href="../static/desktop/ext/js/jasmine-2.3.4/jasmine.css">
 
   <script type="text/javascript" charset="utf-8">
-    ApiHelperGlobals = {
+    var ApiHelperGlobals = {
       i18n: {
         errorLoadingDatabases: 'errorLoadingDatabases',
         errorLoadingTablePreview: 'errorLoadingTablePreview'
       },
       user: 'user'
-    }
+    };
+
+
+    var AUTOCOMPLETE_TIMEOUT = 0;
+
+    var AutocompleterGlobals = {
+      i18n: {
+        category: {
+          all: 'All',
+          column: 'Columns',
+          cte: 'CTEs',
+          database: 'Databases',
+          identifier: 'Identifiers',
+          keyword: 'Keywords',
+          popular: 'Popular',
+          sample: 'Samples',
+          table: 'Tables',
+          udf: 'UDFs',
+          variable: 'Variables'
+        },
+        meta: {
+          aggregateFunction: 'aggregate',
+          alias: 'alias',
+          commonTableExpression: 'cte',
+          database: 'database',
+          filter: 'filter',
+          groupBy: 'group by',
+          join: 'join',
+          joinCondition: 'condition',
+          keyword: 'keyword',
+          orderBy: 'order by',
+          table: 'table',
+          value: 'value',
+          variable: 'variable',
+          view: 'view',
+          virtual: 'virtual'
+        }
+      }
+    };
+
+    var HAS_OPTIMIZER = false;
   </script>
 
   <script type="text/javascript" src="../static/desktop/ext/js/jquery/jquery-2.1.1.min.js"></script>
   <script type="text/javascript" src="../static/desktop/js/jquery.migration.js"></script>
+  <script type="text/javascript" src="../static/desktop/js/hue.colors.js"></script>
   <script type="text/javascript" src="../static/desktop/js/hue.utils.js"></script>
   <script type="text/javascript" src="../static/desktop/ext/js/jquery/plugins/jquery.total-storage.min.js"></script>
   <script type="text/javascript" src="../static/desktop/js/ace/ace.js"></script>
@@ -45,6 +86,9 @@
   <script type="text/javascript" src="../static/desktop/js/sqlAutocompleter2.js"></script>
   <script type="text/javascript" src="../static/desktop/spec/sqlAutocompleter2Spec.js"></script>
 
+  <script type="text/javascript" src="../static/desktop/js/sqlAutocompleter3.js"></script>
+  <script type="text/javascript" src="../static/desktop/spec/sqlAutocompleter3Spec.js"></script>
+
   <script type="text/javascript" src="../static/desktop/js/sqlFunctions.js"></script>
   <script type="text/javascript" src="../static/desktop/spec/sqlFunctionsSpec.js"></script>