Skip to content

Commit d7925d7

Browse files
committed
Issue #404/#481 test_connection streamlining
- Use `dummy_backend` fixture for more compact setup - Separate TestExecuteFromJsonResources and TestExecuteWithValidation
1 parent 720483e commit d7925d7

File tree

3 files changed

+254
-228
lines changed

3 files changed

+254
-228
lines changed

openeo/rest/_testing.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import json
12
import re
23
from typing import Optional, Union
34

@@ -11,16 +12,33 @@ class DummyBackend:
1112
and allows inspection of posted process graphs
1213
"""
1314

15+
__slots__ = (
16+
"connection",
17+
"sync_requests",
18+
"batch_jobs",
19+
"validation_requests",
20+
"next_result",
21+
"next_validation_errors",
22+
)
23+
1424
# Default result (can serve both as JSON or binary data)
1525
DEFAULT_RESULT = b'{"what?": "Result data"}'
1626

1727
def __init__(self, requests_mock, connection: Connection):
1828
self.connection = connection
1929
self.sync_requests = []
2030
self.batch_jobs = {}
31+
self.validation_requests = []
2132
self.next_result = self.DEFAULT_RESULT
22-
requests_mock.post(connection.build_url("/result"), content=self._handle_post_result)
23-
requests_mock.post(connection.build_url("/jobs"), content=self._handle_post_jobs)
33+
self.next_validation_errors = []
34+
requests_mock.post(
35+
connection.build_url("/result"),
36+
content=self._handle_post_result,
37+
)
38+
requests_mock.post(
39+
connection.build_url("/jobs"),
40+
content=self._handle_post_jobs,
41+
)
2442
requests_mock.post(
2543
re.compile(connection.build_url(r"/jobs/(job-\d+)/results$")), content=self._handle_post_job_results
2644
)
@@ -32,12 +50,19 @@ def __init__(self, requests_mock, connection: Connection):
3250
re.compile(connection.build_url("/jobs/(.*?)/results/result.data$")),
3351
content=self._handle_get_job_result_asset,
3452
)
53+
requests_mock.post(connection.build_url("/validation"), json=self._handle_post_validation)
3554

3655
def _handle_post_result(self, request, context):
3756
"""handler of `POST /result` (synchronous execute)"""
3857
pg = request.json()["process"]["process_graph"]
3958
self.sync_requests.append(pg)
40-
return self.next_result
59+
result = self.next_result
60+
if isinstance(result, (dict, list)):
61+
result = json.dumps(result).encode("utf-8")
62+
elif isinstance(result, str):
63+
result = result.encode("utf-8")
64+
assert isinstance(result, bytes)
65+
return result
4166

4267
def _handle_post_jobs(self, request, context):
4368
"""handler of `POST /jobs` (create batch job)"""
@@ -83,6 +108,12 @@ def _handle_get_job_result_asset(self, request, context):
83108
assert self.batch_jobs[job_id]["status"] == "finished"
84109
return self.next_result
85110

111+
def _handle_post_validation(self, request, context):
112+
"""Handler of `POST /validation` (validate process graph)."""
113+
pg = request.json()["process_graph"]
114+
self.validation_requests.append(pg)
115+
return {"errors": self.next_validation_errors}
116+
86117
def get_sync_pg(self) -> dict:
87118
"""Get one and only synchronous process graph"""
88119
assert len(self.sync_requests) == 1

tests/rest/conftest.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import contextlib
22
import re
33
import typing
4-
from typing import List, Optional
54
from unittest import mock
65

76
import pytest
87
import time_machine
98

10-
import openeo
119
from openeo.rest._testing import DummyBackend, build_capabilities
1210
from openeo.rest.connection import Connection
1311

@@ -73,26 +71,32 @@ def assert_oidc_device_code_flow(url: str = "https://oidc.test/dc", elapsed: flo
7371

7472

7573
@pytest.fixture
76-
def con100(requests_mock):
77-
requests_mock.get(API_URL, json={"api_version": "1.0.0"})
74+
def api_capabilities() -> dict:
75+
"""Fixture to be overridden for customizing the capabilities doc used by connection fixtures."""
76+
return {}
77+
78+
79+
@pytest.fixture
80+
def connection(api_version, requests_mock, api_capabilities) -> Connection:
81+
requests_mock.get(API_URL, json=build_capabilities(api_version=api_version, **api_capabilities))
7882
con = Connection(API_URL)
7983
return con
8084

8185

8286
@pytest.fixture
83-
def con120(requests_mock):
84-
requests_mock.get(API_URL, json={"api_version": "1.2.0"})
87+
def con100(requests_mock, api_capabilities):
88+
requests_mock.get(API_URL, json=build_capabilities(api_version="1.0.0", **api_capabilities))
8589
con = Connection(API_URL)
8690
return con
8791

8892

8993
@pytest.fixture
90-
def dummy_backend(requests_mock, con100) -> DummyBackend:
91-
yield DummyBackend(requests_mock=requests_mock, connection=con100)
94+
def con120(requests_mock, api_capabilities):
95+
requests_mock.get(API_URL, json=build_capabilities(api_version="1.2.0", **api_capabilities))
96+
con = Connection(API_URL)
97+
return con
9298

9399

94100
@pytest.fixture
95-
def connection_with_pgvalidation(api_version, requests_mock) -> Connection:
96-
"""Connection fixture to a backend that supports validation of the process graph."""
97-
requests_mock.get(API_URL, json=build_capabilities(api_version=api_version, validation=True))
98-
return openeo.connect(API_URL)
101+
def dummy_backend(requests_mock, con100) -> DummyBackend:
102+
yield DummyBackend(requests_mock=requests_mock, connection=con100)

0 commit comments

Comments
 (0)