浏览代码

HUE-8758 [editor] Add a test for check_status Notebook API

Romain 5 年之前
父节点
当前提交
4545fa717e

+ 1 - 0
desktop/libs/notebook/src/notebook/api.py

@@ -274,6 +274,7 @@ def _check_status(request, notebook=None, snippet=None, operation_id=None):
       status = 'expired'
     else:
       status = 'failed'
+
     if response.get('query_status'):
       has_result_set = response['query_status'].get('has_result_set')
     else:

+ 11 - 8
desktop/libs/notebook/src/notebook/connectors/base.py

@@ -279,7 +279,7 @@ class Notebook(object):
     )
 
   def execute(self, request, batch=False):
-    from notebook.api import _execute_notebook # Cyclic dependency
+    from notebook.api import _execute_notebook  # Cyclic dependency
 
     notebook_data = self.get_data()
     snippet = notebook_data['snippets'][0]
@@ -294,17 +294,18 @@ class Notebook(object):
 
       Check status until it finishes or timeouts.
       """
-      task = self.execute(request, batch=False)
-      task['uuid'] = task['history_uuid']
-      status = self.check_status(task)
+      snippet = self.execute(request, batch=False)
+      snippet['uuid'] = snippet['history_uuid']
       curr = time.time()
       end = curr + timeout_sec
 
+      status = self.check_status(request, snippet)
+
       while curr <= end:
         if status['status'] not in ('waiting', 'running'):
-          return task
+          return snippet
 
-        status = self.check_status(task)
+        status = self.check_status(request, snippet)
         time.sleep(sleep_interval)
         curr = time.time()
 
@@ -322,8 +323,10 @@ class Notebook(object):
 
       raise OperationTimeout()
 
-  def check_status(self, task):
-    pass
+  def check_status(self, request, notebook, snippet):
+    from notebook.api import _check_status  # Cyclic dependency
+
+    return _check_status(request, notebook=notebook, snippet=snippet)
 
 
 def get_interpreter(connector_type, user=None):

+ 37 - 4
desktop/libs/notebook/src/notebook/connectors/base_tests.py

@@ -30,9 +30,9 @@ from useradmin.models import User
 from notebook.connectors.base import Notebook
 
 if sys.version_info[0] > 2:
-  from unittest.mock import patch, Mock
+  from unittest.mock import patch, Mock, MagicMock
 else:
-  from mock import patch, Mock
+  from mock import patch, Mock, MagicMock
 
 
 class TestNotebook(object):
@@ -44,8 +44,8 @@ class TestNotebook(object):
 
   def test_execute_and_wait(self):
     query = Notebook()
-    query.execute = Mock(return_value={'history_uuid': 1})
 
+    query.execute = Mock(return_value={'history_uuid': 1})
     query.check_status = Mock(
       side_effect=check_status_side_effect
     )
@@ -56,8 +56,41 @@ class TestNotebook(object):
     assert_equal(2, query.check_status.call_count)
 
 
+  def test_check_status(self):
+    query = Notebook()
+
+    notebook = MagicMock()
+    def notebook_side_effect(key):
+      if key == 'type':
+        return 'query-hive'
+      elif key == 'uuid':
+        return 'uuid-1'
+      else:
+        return Mock()
+    notebook.__getitem__.side_effect = notebook_side_effect
+    snippet = MagicMock()
+    def snippet_side_effect(key):
+      if key == 'status':
+        return 0
+      else:
+        return Mock()
+    snippet.__getitem__.side_effect = snippet_side_effect
+    request=Mock()
+
+    with patch('notebook.api.Document2.objects.get_by_uuid') as get_by_uuid:
+      with patch('notebook.api.get_api') as get_api:
+        with patch('notebook.api.Notebook') as Notebook2:
+          get_api.return_value=Mock(
+            check_status=Mock(return_value={'status': 0})
+          )
+          resp = query.check_status(request=request, notebook=notebook, snippet=snippet)
+
+          assert_equal(0, resp['status'])
+          assert_equal(0, resp['query_status']['status'])
+
+
 iteration = 0
-def check_status_side_effect(value):
+def check_status_side_effect(request, snippet):
   """First time query is still running, second time the execution is finished."""
   global iteration
 

+ 3 - 3
desktop/libs/notebook/src/notebook/connectors/hiveserver2.py

@@ -333,16 +333,16 @@ class HS2Api(Api):
     status = HiveServerQueryHistory.STATE_MAP[operation.operationState]
 
     if status.value in (QueryHistory.STATE.failed.value, QueryHistory.STATE.expired.value):
-      if operation.errorMessage and 'transition from CANCELED to ERROR' in operation.errorMessage: # Hive case on canceled query
+      if operation.errorMessage and 'transition from CANCELED to ERROR' in operation.errorMessage:  # Hive case on canceled query
         raise QueryExpired()
-      elif  operation.errorMessage and re.search('Cannot validate serde: org.apache.hive.hcatalog.data.JsonSerDe', str(operation.errorMessage)):
+      elif operation.errorMessage and re.search('Cannot validate serde: org.apache.hive.hcatalog.data.JsonSerDe', str(operation.errorMessage)):
         raise QueryError(message=operation.errorMessage + _('. Is hive-hcatalog-core.jar registered?'))
       else:
         raise QueryError(operation.errorMessage)
 
     response['status'] = 'running' if status.value in (QueryHistory.STATE.running.value, QueryHistory.STATE.submitted.value) else 'available'
     if operation.hasResultSet is not None:
-      response['has_result_set']= operation.hasResultSet # HIVE-12442 - With LLAP & HIVE_CLI_SERVICE_PROTOCOL_V8, hasResultSet can change after get_operation_status
+      response['has_result_set']= operation.hasResultSet  # HIVE-12442 - With LLAP & HIVE_CLI_SERVICE_PROTOCOL_V8, hasResultSet can change after get_operation_status
 
     return response