Skip to content

Commit 5c2d570

Browse files
committed
test pagination iterator
1 parent d8ef798 commit 5c2d570

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

clients/python/test/test_osparc/conftest.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,26 @@ def cfg(faker: Faker) -> osparc.Configuration:
2020
@pytest.fixture
2121
def api_client(cfg: osparc.Configuration) -> osparc.ApiClient:
2222
return osparc.ApiClient(configuration=cfg)
23+
24+
25+
@pytest.fixture
26+
def page_file(faker: Faker) -> osparc.PageFile:
27+
items = []
28+
for _ in range(5):
29+
items.append(
30+
osparc.File(
31+
id=faker.uuid4(),
32+
filename=faker.file_name(),
33+
content_type=None,
34+
checksum=faker.sha256(),
35+
e_tag=faker.sha256(),
36+
)
37+
)
38+
39+
return osparc.PageFile(
40+
items=items,
41+
total=faker.pyint(min_value=1, max_value=10) * len(items),
42+
limit=len(items),
43+
offset=faker.pyint(min_value=0),
44+
links=osparc.Links(next=faker.url()),
45+
)

clients/python/test/test_osparc/test_basic.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88
import osparc._settings
99
import pydantic
1010
import pytest
11+
import respx
12+
from faker import Faker
13+
import httpx
14+
from urllib.parse import urlparse
15+
from osparc._utils import PaginationIterator
16+
from functools import partial
1117

1218
_CLIENTS_PYTHON_DIR: Path = Path(__file__).parent.parent.parent
1319

@@ -87,3 +93,39 @@ def test_parent_project_validation(faker, valid: bool):
8793
os.environ["OSPARC_NODE_ID"] = f"{faker.text()}"
8894
with pytest.raises(pydantic.ValidationError):
8995
_ = osparc._settings.ParentProjectInfo()
96+
97+
98+
def test_pagination_iterator(
99+
faker: Faker, page_file: osparc.PageFile, api_client: osparc.ApiClient
100+
):
101+
next_page_url = urlparse(page_file.links.next)
102+
_base_url = f"{next_page_url.scheme}://{next_page_url.netloc}"
103+
_auth = httpx.BasicAuth(
104+
username=api_client.configuration.username,
105+
password=api_client.configuration.password,
106+
)
107+
108+
def _sideeffect(all_items: List, request: httpx.Request):
109+
if len(all_items) > faker.pyint(min_value=10):
110+
page_file.links.next = None
111+
all_items += page_file.items
112+
return httpx.Response(status_code=200, json=page_file.to_dict())
113+
114+
with respx.mock(
115+
base_url=_base_url,
116+
assert_all_called=True,
117+
) as respx_mock:
118+
server_items: List[osparc.File] = page_file.items
119+
respx_mock.get(urlparse(page_file.links.next).path).mock(
120+
side_effect=partial(_sideeffect, server_items)
121+
)
122+
123+
pagination_iterator = PaginationIterator(
124+
lambda: page_file, api_client=api_client, base_url=_base_url, auth=_auth
125+
)
126+
client_items = [item for item in pagination_iterator]
127+
assert len(server_items) > 0
128+
assert all(si == ci for si, ci in zip(server_items, client_items))
129+
130+
first_client_item = next(pagination_iterator)
131+
assert first_client_item == server_items[0]

0 commit comments

Comments
 (0)