Merge branch '21941-keep-web-link' refs #21941
[arvados.git] / sdk / python / tests / test_api.py
index 2768d2e7cfff61c56d1637aa1e9ed68edbf11af1..760bc7675f574b4af4419471e55bec894c2bad4a 100644 (file)
@@ -2,9 +2,6 @@
 #
 # SPDX-License-Identifier: Apache-2.0
 
-from __future__ import absolute_import
-from builtins import str
-from builtins import range
 import arvados
 import collections
 import contextlib
@@ -26,13 +23,15 @@ from . import run_test_server
 from apiclient import errors as apiclient_errors
 from apiclient import http as apiclient_http
 from arvados.api import (
+    ThreadSafeAPIClient,
     api_client,
     normalize_api_kwargs,
     api_kwargs_from_config,
-    OrderedJsonModel,
     _googleapiclient_log_lock,
 )
 from .arvados_testutil import fake_httplib2_response, mock_api_responses, queue_with
+
+import googleapiclient
 import httplib2.error
 
 if not mimetypes.inited:
@@ -70,8 +69,8 @@ class ArvadosApiTest(run_test_server.TestCaseWithServers):
         self.assertIsNot(*clients)
 
     def test_empty_list(self):
-        answer = arvados.api('v1').humans().list(
-            filters=[['uuid', '=', None]]).execute()
+        answer = arvados.api('v1').collections().list(
+            filters=[['uuid', '=', 'abcdef']]).execute()
         self.assertEqual(answer['items_available'], len(answer['items']))
 
     def test_nonempty_list(self):
@@ -81,11 +80,11 @@ class ArvadosApiTest(run_test_server.TestCaseWithServers):
 
     def test_timestamp_inequality_filter(self):
         api = arvados.api('v1')
-        new_item = api.specimens().create(body={}).execute()
+        new_item = api.collections().create(body={}).execute()
         for operator, should_include in [
                 ['<', False], ['>', False],
                 ['<=', True], ['>=', True], ['=', True]]:
-            response = api.specimens().list(filters=[
+            response = api.collections().list(filters=[
                 ['created_at', operator, new_item['created_at']],
                 # Also filter by uuid to ensure (if it matches) it's on page 0
                 ['uuid', '=', new_item['uuid']]]).execute()
@@ -100,13 +99,13 @@ class ArvadosApiTest(run_test_server.TestCaseWithServers):
 
     def test_exceptions_include_errors(self):
         mock_responses = {
-            'arvados.humans.get': self.api_error_response(
+            'arvados.collections.get': self.api_error_response(
                 422, "Bad UUID format", "Bad output format"),
             }
         req_builder = apiclient_http.RequestMockBuilder(mock_responses)
         api = arvados.api('v1', requestBuilder=req_builder)
         with self.assertRaises(apiclient_errors.HttpError) as err_ctx:
-            api.humans().get(uuid='xyz-xyz-abcdef').execute()
+            api.collections().get(uuid='xyz-xyz-abcdef').execute()
         err_s = str(err_ctx.exception)
         for msg in ["Bad UUID format", "Bad output format"]:
             self.assertIn(msg, err_s)
@@ -126,14 +125,14 @@ class ArvadosApiTest(run_test_server.TestCaseWithServers):
 
     def test_exceptions_without_errors_have_basic_info(self):
         mock_responses = {
-            'arvados.humans.delete': (
+            'arvados.collections.delete': (
                 fake_httplib2_response(500, **self.ERROR_HEADERS),
                 b"")
             }
         req_builder = apiclient_http.RequestMockBuilder(mock_responses)
         api = arvados.api('v1', requestBuilder=req_builder)
         with self.assertRaises(apiclient_errors.HttpError) as err_ctx:
-            api.humans().delete(uuid='xyz-xyz-abcdef').execute()
+            api.collections().delete(uuid='xyz-xyz-abcdef').execute()
         self.assertIn("500", str(err_ctx.exception))
 
     def test_request_too_large(self):
@@ -204,21 +203,6 @@ class ArvadosApiTest(run_test_server.TestCaseWithServers):
                 self.assertEqual(response.status, code)
                 self.assertEqual(response.get('status'), str(code))
 
-    def test_ordered_json_model(self):
-        mock_responses = {
-            'arvados.humans.get': (
-                None,
-                json.dumps(collections.OrderedDict(
-                    (c, int(c, 16)) for c in string.hexdigits
-                )).encode(),
-            ),
-        }
-        req_builder = apiclient_http.RequestMockBuilder(mock_responses)
-        api = arvados.api('v1',
-                          requestBuilder=req_builder, model=OrderedJsonModel())
-        result = api.humans().get(uuid='test').execute()
-        self.assertEqual(string.hexdigits, ''.join(list(result.keys())))
-
     def test_api_is_threadsafe(self):
         api_kwargs = {
             'host': os.environ['ARVADOS_API_HOST'],
@@ -542,5 +526,61 @@ class PreCloseSocketTestCase(unittest.TestCase):
             self.assertEqual(c.close.call_count, expect)
 
 
+class ThreadSafeAPIClientTestCase(run_test_server.TestCaseWithServers):
+    MAIN_SERVER = {}
+
+    def test_constructor(self):
+        env_mapping = {
+            key: value
+            for key, value in os.environ.items()
+            if key.startswith('ARVADOS_API_')
+        }
+        extra_params = {
+            'timeout': 299,
+        }
+        base_params = {
+            key[12:].lower(): value
+            for key, value in env_mapping.items()
+        }
+        try:
+            base_params['insecure'] = base_params.pop('host_insecure')
+        except KeyError:
+            pass
+        expected_keep_params = {}
+        for config, params, subtest in [
+                (None, {}, "default arguments"),
+                (None, extra_params, "extra params"),
+                (env_mapping, {}, "explicit config"),
+                (env_mapping, extra_params, "explicit config and params"),
+                ({}, base_params, "params only"),
+        ]:
+            with self.subTest(f"test constructor with {subtest}"):
+                expected_timeout = params.get('timeout', 300)
+                expected_params = dict(params)
+                keep_params = dict(expected_keep_params)
+                client = ThreadSafeAPIClient(config, keep_params, params, 'v1')
+                self.assertTrue(hasattr(client, 'localapi'), "client missing localapi method")
+                self.assertEqual(client.api_token, os.environ['ARVADOS_API_TOKEN'])
+                self.assertEqual(client._http.timeout, expected_timeout)
+                self.assertEqual(params, expected_params,
+                                 "api_params was modified in-place")
+                self.assertEqual(keep_params, expected_keep_params,
+                                 "keep_params was modified in-place")
+
+    def test_constructor_no_args(self):
+        client = ThreadSafeAPIClient()
+        self.assertTrue(hasattr(client, 'localapi'), "client missing localapi method")
+        self.assertEqual(client.api_token, os.environ['ARVADOS_API_TOKEN'])
+        self.assertTrue(client.insecure)
+
+    def test_constructor_bad_version(self):
+        with self.assertRaises(googleapiclient.errors.UnknownApiNameOrVersion):
+            ThreadSafeAPIClient(version='BadTestVersion')
+
+    def test_pre_v3_0_name(self):
+        from arvados.safeapi import ThreadSafeApiCache
+        self.assertIs(ThreadSafeApiCache, ThreadSafeAPIClient)
+
+
 if __name__ == '__main__':
     unittest.main()