forked from Open-EO/openeo-test-suite
-
Notifications
You must be signed in to change notification settings - Fork 0
/
backend_under_test.py
108 lines (73 loc) · 3.11 KB
/
backend_under_test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
"""
Pytest plugin to allow parameterizing tests over the available collections and processes
of the openEO backend under test.
Originally this was approximated through fixtures, but fixtures are evaluated at test execution time,
not test collection time, making it practically impossible to implement proper parametrization.
"""
import abc
import functools
import logging
from typing import List, Union
import openeo
import pytest
_log = logging.getLogger(__name__)
class _BackendUnderTest(metaclass=abc.ABCMeta):
"""Abstract base class for back-end under test."""
@abc.abstractmethod
def list_collection_ids(self) -> List[str]:
"""List available collections."""
...
@abc.abstractmethod
def list_process_ids(self) -> List[str]:
"""List available processes."""
...
class HttpBackend(_BackendUnderTest):
"""Back-end under test that uses the openEO HTTP API."""
def __init__(self, connection: openeo.Connection):
self.connection = connection
def list_collection_ids(self) -> List[str]:
return [c["id"] for c in self.connection.list_collections()]
def list_process_ids(self) -> List[str]:
return [p["id"] for p in self.connection.list_processes()]
class NoBackend(_BackendUnderTest):
"""No backend under test, just to get basic test suite setup working."""
def list_collection_ids(self) -> List[str]:
return []
def list_process_ids(self) -> List[str]:
return []
def get_backend_url(config: pytest.Config, required: bool = False) -> Union[str, None]:
"""
Get openEO backend URL from command line options.
:param config: pytest config object, e.g. `request.config` from the `request` fixture
:param required: Whether the backend URL must be set or can be None.
It's recommended to only require it from within tests and fixtures.
In more generic cases it must be considered optional,
so that the test suite can be constructed/run even when no backend is specified.
"""
url = config.getoption("--openeo-backend-url")
if required and not url:
raise ValueError(
"No openEO backend URL found."
" Specify it using the `--openeo-backend-url` command line option (short form `-U`)."
)
if isinstance(url, str) and "://" not in url:
url = f"https://{url}"
return url
# Internal singleton, pointing to backend under test,
# setup happens in `pytest_configure` hook
_backend_under_test: Union[None, _BackendUnderTest] = None
def set_backend_under_test(backend: _BackendUnderTest):
global _backend_under_test
assert _backend_under_test is None
assert isinstance(backend, _BackendUnderTest)
_backend_under_test = backend
def get_backend_under_test() -> _BackendUnderTest:
global _backend_under_test
assert isinstance(_backend_under_test, _BackendUnderTest)
return _backend_under_test
@functools.lru_cache
def get_collection_ids() -> List[str]:
return get_backend_under_test().list_collection_ids()
@functools.lru_cache
def get_process_ids() -> List[str]:
return get_backend_under_test().list_process_ids()