Skip to content

Commit 632ad1c

Browse files
committed
Issue #668 some final tweaks and tests
1 parent e577200 commit 632ad1c

File tree

4 files changed

+190
-5
lines changed

4 files changed

+190
-5
lines changed

openeo/rest/models/federation_extension.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
_log = logging.getLogger(__name__)
55

6+
67
def get_backend_details(data: dict) -> Union[Dict[str, dict], None]:
78
"""
89
Get federated backend details from capabilities document (``GET /``)
@@ -15,6 +16,7 @@ def get_backend_details(data: dict) -> Union[Dict[str, dict], None]:
1516
def get_federation_missing(data: dict, *, resource_name: str, auto_warn: bool = False) -> Union[List[str], None]:
1617
"""
1718
Get "federation:missing" field from response data, if present.
19+
1820
:param data: response data
1921
:param resource_name: name of the requested resource (listing)
2022
:param auto_warn: whether to automatically log a warning if missing federation components are detected.

openeo/rest/models/general.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ def ext_federation_missing(self, *, auto_warn: bool = False) -> Union[None, List
8181
data=self._data, resource_name="collection listing", auto_warn=auto_warn
8282
)
8383

84+
8485
class ProcessListingResponse(list):
8586
"""
8687
Container for process metadata listing received
@@ -99,7 +100,6 @@ class ProcessListingResponse(list):
99100
.. versionadded:: 0.38.0
100101
"""
101102

102-
103103
__slots__ = ["_data"]
104104

105105
def __init__(self, response_data: dict):
@@ -134,6 +134,7 @@ def ext_federation_missing(self, *, auto_warn: bool = False) -> Union[None, List
134134
data=self._data, resource_name="process listing", auto_warn=auto_warn
135135
)
136136

137+
137138
class JobListingResponse(list):
138139
"""
139140
Container for job metadata listing received
@@ -153,7 +154,6 @@ class JobListingResponse(list):
153154
.. versionadded:: 0.38.0
154155
"""
155156

156-
157157
__slots__ = ["_data"]
158158

159159
def __init__(self, response_data: dict):
@@ -186,6 +186,7 @@ def ext_federation_missing(self, *, auto_warn: bool = False) -> Union[None, List
186186
data=self._data, resource_name="job listing", auto_warn=auto_warn
187187
)
188188

189+
189190
class LogsResponse(list):
190191
"""
191192
Container for job/service logs as received
@@ -208,7 +209,6 @@ class LogsResponse(list):
208209
.. versionadded:: 0.38.0
209210
"""
210211

211-
212212
__slots__ = ["_data"]
213213

214214
def __init__(self, response_data: dict, *, log_level: Optional[str] = None):
@@ -236,7 +236,6 @@ def accept_level(level: str) -> bool:
236236

237237
self.ext_federation_missing(auto_warn=True)
238238

239-
240239
def _repr_html_(self):
241240
return render_component(component="logs", data=self)
242241

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import pytest
2+
3+
from openeo.rest.models.federation_extension import (
4+
get_backend_details,
5+
get_federation_missing,
6+
)
7+
8+
9+
def test_get_backend_details():
10+
assert get_backend_details({}) is None
11+
assert get_backend_details(
12+
{
13+
"api_version": "1.2.0",
14+
"backend_version": "1.1.2",
15+
"stac_version": "1.0.0",
16+
"type": "Catalog",
17+
"id": "cool-eo-cloud",
18+
"endpoints": [
19+
{"path": "/collections", "methods": ["GET"]},
20+
],
21+
"federation": {
22+
"eoa": {"title": "EO Answers", "url": "https://eoe.test/go"},
23+
"eob": {"title": "Beyond EO", "url": "https://eoeb.example.com"},
24+
},
25+
}
26+
) == {
27+
"eoa": {"title": "EO Answers", "url": "https://eoe.test/go"},
28+
"eob": {"title": "Beyond EO", "url": "https://eoeb.example.com"},
29+
}
30+
31+
32+
def test_get_federation_missing():
33+
assert get_federation_missing({}, resource_name="things") is None
34+
assert get_federation_missing(
35+
{
36+
"things": ["apple", "banana"],
37+
"federation:missing": ["veggies"],
38+
},
39+
resource_name="things",
40+
) == ["veggies"]
41+
42+
43+
@pytest.mark.parametrize(["auto_warn"], [[True], [False]])
44+
def test_get_federation_missing_auto_warn(auto_warn, caplog):
45+
assert get_federation_missing(
46+
{
47+
"things": ["apple", "banana"],
48+
"federation:missing": ["veggies"],
49+
},
50+
resource_name="things",
51+
auto_warn=auto_warn,
52+
) == ["veggies"]
53+
54+
if auto_warn:
55+
assert "Partial things: missing federation components: ['veggies']." in caplog.text
56+
else:
57+
assert caplog.text == ""

tests/rest/models/test_general.py

Lines changed: 128 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
import pytest
22

3-
from openeo.rest.models.general import CollectionListingResponse, Link
3+
from openeo.rest.models.general import (
4+
CollectionListingResponse,
5+
JobListingResponse,
6+
Link,
7+
LogsResponse,
8+
ProcessListingResponse,
9+
)
10+
from openeo.rest.models.logs import LogEntry
411

512

613
class TestLink:
@@ -60,3 +67,123 @@ def test_links(self):
6067
def test_federation_missing(self, data, expected):
6168
collections = CollectionListingResponse(data)
6269
assert collections.ext_federation_missing() == expected
70+
71+
72+
class TestProcessListingResponse:
73+
def test_basic(self):
74+
data = {"processes": [{"id": "ndvi"}, {"id": "s2mask"}]}
75+
processes = ProcessListingResponse(data)
76+
assert processes == [{"id": "ndvi"}, {"id": "s2mask"}]
77+
assert repr(processes) == "[{'id': 'ndvi'}, {'id': 's2mask'}]"
78+
79+
def test_links(self):
80+
data = {
81+
"processes": [{"id": "ndvi"}, {"id": "s2mask"}],
82+
"links": [
83+
{"rel": "self", "href": "https://openeo.test/processes"},
84+
{"rel": "next", "href": "https://openeo.test/processes?page=2"},
85+
],
86+
}
87+
processes = ProcessListingResponse(data)
88+
assert processes.links == [
89+
Link(rel="self", href="https://openeo.test/processes"),
90+
Link(rel="next", href="https://openeo.test/processes?page=2"),
91+
]
92+
93+
@pytest.mark.parametrize(
94+
["data", "expected"],
95+
[
96+
(
97+
{"processes": [{"id": "ndvi"}], "federation:missing": ["wow"]},
98+
["wow"],
99+
),
100+
(
101+
{"processes": [{"id": "ndvi"}]},
102+
None,
103+
),
104+
],
105+
)
106+
def test_federation_missing(self, data, expected):
107+
processes = ProcessListingResponse(data)
108+
assert processes.ext_federation_missing() == expected
109+
110+
111+
class TestJobListingResponse:
112+
def test_basic(self):
113+
data = {"jobs": [{"id": "job-01"}, {"id": "job-02"}]}
114+
jobs = JobListingResponse(data)
115+
assert jobs == [{"id": "job-01"}, {"id": "job-02"}]
116+
assert repr(jobs) == "[{'id': 'job-01'}, {'id': 'job-02'}]"
117+
118+
def test_links(self):
119+
data = {
120+
"jobs": [{"id": "job-01"}, {"id": "job-02"}],
121+
"links": [
122+
{"rel": "self", "href": "https://openeo.test/jobs"},
123+
{"rel": "next", "href": "https://openeo.test/jobs?page=2"},
124+
],
125+
}
126+
jobs = JobListingResponse(data)
127+
assert jobs.links == [
128+
Link(rel="self", href="https://openeo.test/jobs"),
129+
Link(rel="next", href="https://openeo.test/jobs?page=2"),
130+
]
131+
132+
@pytest.mark.parametrize(
133+
["data", "expected"],
134+
[
135+
(
136+
{"jobs": [{"id": "job-01"}], "federation:missing": ["wow"]},
137+
["wow"],
138+
),
139+
(
140+
{"jobs": [{"id": "job-01"}]},
141+
None,
142+
),
143+
],
144+
)
145+
def test_federation_missing(self, data, expected):
146+
jobs = JobListingResponse(data)
147+
assert jobs.ext_federation_missing() == expected
148+
149+
150+
class TestLogsResponse:
151+
def test_basic(self):
152+
data = {"logs": [{"id": "log-01", "level": "info", "message": "hello"}]}
153+
logs = LogsResponse(data)
154+
assert logs == [{"id": "log-01", "level": "info", "message": "hello"}]
155+
assert logs == [LogEntry(id="log-01", level="info", message="hello")]
156+
assert logs.logs == [{"id": "log-01", "level": "info", "message": "hello"}]
157+
assert logs.logs == [LogEntry(id="log-01", level="info", message="hello")]
158+
assert repr(logs) == "[{'id': 'log-01', 'level': 'info', 'message': 'hello'}]"
159+
160+
def test_links(self):
161+
data = {
162+
"logs": [{"id": "log-01", "level": "info", "message": "hello"}],
163+
"links": [
164+
{"rel": "self", "href": "https://openeo.test/logs"},
165+
{"rel": "next", "href": "https://openeo.test/logs?page=2"},
166+
],
167+
}
168+
logs = LogsResponse(data)
169+
assert logs.links == [
170+
Link(rel="self", href="https://openeo.test/logs"),
171+
Link(rel="next", href="https://openeo.test/logs?page=2"),
172+
]
173+
174+
@pytest.mark.parametrize(
175+
["data", "expected"],
176+
[
177+
(
178+
{"logs": [{"id": "log-01", "level": "info", "message": "hello"}], "federation:missing": ["wow"]},
179+
["wow"],
180+
),
181+
(
182+
{"logs": [{"id": "log-01", "level": "info", "message": "hello"}]},
183+
None,
184+
),
185+
],
186+
)
187+
def test_federation_missing(self, data, expected):
188+
logs = LogsResponse(data)
189+
assert logs.ext_federation_missing() == expected

0 commit comments

Comments
 (0)