earthengine-api/python/ee/apitestcase.py
2021-05-19 09:06:24 -07:00

316 lines
11 KiB
Python

#!/usr/bin/env python
"""A TestCase that initializes the library with standard API methods."""
import contextlib
import json
import os
from . import _cloud_api_utils
import unittest
import ee
# Cached algorithms list
_algorithms_cache = None
def GetAlgorithms():
"""Returns a static version of the ListAlgorithms call.
After ApiTestCase.setUp is called, ee.data.getAlgorithms() is patched to use
this data. This function may be called explicitly if the test data is needed
at a time before the test case has started executing.
"""
global _algorithms_cache
if _algorithms_cache is not None:
return _algorithms_cache
algorithms_path = os.path.join(
os.path.dirname(os.path.realpath(__file__)),
"tests/algorithms.json")
with open(algorithms_path, encoding='utf-8') as algorithms_file:
algorithms = json.load(algorithms_file)
_algorithms_cache = _cloud_api_utils.convert_algorithms(algorithms)
return _algorithms_cache
class ApiTestCase(unittest.TestCase):
def setUp(self):
super(ApiTestCase, self).setUp()
self.InitializeApi()
def InitializeApi(self, should_mock=True):
"""Initializes the library with standard API methods.
This is normally invoked during setUp(), but subclasses may invoke
it manually instead if they prefer.
Args:
should_mock: Whether or not to mock the various functions.
"""
self.last_download_call = None
self.last_thumb_call = None
self.last_table_call = None
self.last_mapid_call = None
ee.Reset()
ee.data._install_cloud_api_resource = lambda: None
ee.data.getAlgorithms = GetAlgorithms
if should_mock:
ee.data.computeValue = lambda x: {'value': 'fakeValue'}
ee.data.getMapId = self._MockMapId
ee.data.getDownloadId = self._MockDownloadUrl
ee.data.getThumbId = self._MockThumbUrl
ee.data.getTableDownloadId = self._MockTableDownload
ee.Initialize(None, '')
# We are mocking the url here so the unit tests are happy.
def _MockMapId(self, params):
self.last_mapid_call = {'url': '/mapid', 'data': params}
return {'mapid': 'fakeMapId', 'token': 'fakeToken'}
def _MockDownloadUrl(self, params):
self.last_download_call = {'url': '/download', 'data': params}
return {'docid': '1', 'token': '2'}
def _MockThumbUrl(self, params, thumbType=None): # pylint: disable=invalid-name,unused-argument
# Hang on to the call arguments.
self.last_thumb_call = {'url': '/thumb', 'data': params}
return {'thumbid': '3', 'token': '4'}
def _MockTableDownload(self, params):
self.last_table_call = {'url': '/table', 'data': params}
return {'docid': '5', 'token': '6'}
@contextlib.contextmanager
def UsingCloudApi(cloud_api_resource=None, mock_http=None):
"""Returns a context manager under which the Cloud API is enabled."""
old_cloud_api_resource = ee.data._cloud_api_resource
try:
if cloud_api_resource is None:
discovery_doc_path = os.path.join(
os.path.dirname(os.path.realpath(__file__)),
"tests/cloud_api_discovery_document.json")
with open(discovery_doc_path) as discovery_doc_file:
discovery_doc_str = discovery_doc_file.read()
cloud_api_resource = (
_cloud_api_utils.build_cloud_resource_from_document(
json.loads(discovery_doc_str),
http_transport=mock_http,
headers_supplier=ee.data._make_request_headers,
response_inspector=ee.data._handle_profiling_response))
ee.data._cloud_api_resource = cloud_api_resource
yield
finally:
ee.data._cloud_api_resource = old_cloud_api_resource
# A sample of encoded EE API JSON, used by SerializerTest and DeserializerTest.
ENCODED_JSON_SAMPLE = {
'type': 'CompoundValue',
'scope': [
['0', {
'type': 'Invocation',
'functionName': 'Date',
'arguments': {
'value': 1234567890000
}
}],
['1', {
'type': 'LineString',
'coordinates': [[1, 2], [3, 4]],
'crs': {
'type': 'name',
'properties': {
'name': 'SR-ORG:6974'
}
}
}],
['2', {
'evenOdd': True,
'type': 'Polygon',
'coordinates': [
[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]],
[[5, 6], [7, 6], [7, 8], [5, 8]],
[[1, 1], [2, 1], [2, 2], [1, 2]]
]
}],
['3', {
'type': 'Bytes',
'value': 'aGVsbG8='
}],
['4', {
'type': 'Invocation',
'functionName': 'String.cat',
'arguments': {
'string1': 'x',
'string2': 'y'
}
}],
['5', {
'type': 'Dictionary',
'value': {
'foo': 'bar',
'baz': {'type': 'ValueRef', 'value': '4'}
}
}],
['6', {
'type': 'Function',
'argumentNames': ['x', 'y'],
'body': {'type': 'ArgumentRef', 'value': 'y'}
}],
['7', [
None,
True,
5,
7,
3.4,
112233445566778899,
'hello',
{'type': 'ValueRef', 'value': '0'},
{'type': 'ValueRef', 'value': '1'},
{'type': 'ValueRef', 'value': '2'},
{'type': 'ValueRef', 'value': '3'},
{'type': 'ValueRef', 'value': '5'},
{'type': 'ValueRef', 'value': '4'},
{'type': 'ValueRef', 'value': '6'}
]]
],
'value': {'type': 'ValueRef', 'value': '7'}
}
# A sample of encoded EE API JSON for the Cloud API, used by SerializerTest.
ENCODED_CLOUD_API_JSON_SAMPLE = {
'values': {
'0': {
'arrayValue': {
'values': [
{'constantValue': None},
{'constantValue': True},
{'constantValue': 5},
{'constantValue': 7},
{'constantValue': 3.4},
{'integerValue': '112233445566778899'},
{'constantValue': 'hello'},
{'functionInvocationValue': {
'functionName': 'Date',
'arguments': {'value': {'constantValue': 1234567890000}}
}},
{'functionInvocationValue': {
'functionName': 'GeometryConstructors.LineString',
'arguments': {
'crs': {'functionInvocationValue': {
'functionName': 'Projection',
'arguments': {
'crs': {'constantValue': 'SR-ORG:6974'}}
}},
'coordinates': {'arrayValue': {'values': [
{'valueReference': '1'},
{'constantValue': [3, 4]}
]}}
}}},
{'functionInvocationValue': {
'functionName': 'GeometryConstructors.Polygon',
'arguments': {
'coordinates': {'arrayValue': {'values': [
{'arrayValue': {'values': [
{'valueReference': '2'},
{'constantValue': [10, 0]},
{'constantValue': [10, 10]},
{'constantValue': [0, 10]},
{'valueReference': '2'}]}},
{'constantValue':
[[5, 6], [7, 6], [7, 8], [5, 8]]},
{'arrayValue': {'values': [
{'constantValue': [1, 1]},
{'constantValue': [2, 1]},
{'constantValue': [2, 2]},
{'valueReference': '1'}]}}
]}},
'evenOdd': {'constantValue': True}}}},
{'bytesValue': 'aGVsbG8='},
{'dictionaryValue': {
'values': {
'baz': {'valueReference': '3'},
'foo': {'constantValue': 'bar'},
}
}},
{'valueReference': '3'},
{'functionDefinitionValue': {
'argumentNames': ['x', 'y'],
'body': '4'}
}
]}},
'1': {'constantValue': [1, 2]},
'2': {'constantValue': [0, 0]},
'3': {'functionInvocationValue': {
'functionName': 'String.cat',
'arguments': {
'string1': {'constantValue': 'x'},
'string2': {'constantValue': 'y'}
}}},
'4': {'argumentReference': 'y'},
},
'result': '0'
}
ENCODED_CLOUD_API_JSON_SAMPLE_PRETTY = {
'arrayValue': {
'values': [
{'constantValue': None},
{'constantValue': True},
{'constantValue': 5},
{'constantValue': 7},
{'constantValue': 3.4},
{'integerValue': '112233445566778899'},
{'constantValue': 'hello'},
{'functionInvocationValue': {
'functionName': 'Date',
'arguments': {'value': {'constantValue': 1234567890000}}
}},
{'functionInvocationValue': {
'functionName': 'GeometryConstructors.LineString',
'arguments': {
'crs': {'functionInvocationValue': {
'functionName': 'Projection',
'arguments': {
'crs': {'constantValue': 'SR-ORG:6974'}}
}},
'coordinates': {'constantValue': [[1, 2], [3, 4]]}
}}},
{'functionInvocationValue': {
'functionName': 'GeometryConstructors.Polygon',
'arguments': {
'coordinates': {
'constantValue':
[[[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]],
[[5, 6], [7, 6], [7, 8], [5, 8]],
[[1, 1], [2, 1], [2, 2], [1, 2]]]},
'evenOdd': {'constantValue': True}}}},
{'bytesValue': 'aGVsbG8='},
{'dictionaryValue': {
'values': {
'baz': {'functionInvocationValue': {
'functionName': 'String.cat',
'arguments': {
'string1': {'constantValue': 'x'},
'string2': {'constantValue': 'y'}
}}},
'foo': {'constantValue': 'bar'},
}}},
{'functionInvocationValue': {
'functionName': 'String.cat',
'arguments': {
'string1': {'constantValue': 'x'},
'string2': {'constantValue': 'y'}
}}},
{'functionDefinitionValue': {
'argumentNames': ['x', 'y'],
'body': {'argumentReference': 'y'}}
}
]}}