Skip to content

Commit 35daa2b

Browse files
committed
šŸ› Fix pagination logic to use total from page_meta in multiple routes and update tests for last page pagination
1 parent f08f68e commit 35daa2b

File tree

5 files changed

+28
-11
lines changed

5 files changed

+28
-11
lines changed

ā€Žpackages/models-library/src/models_library/api_schemas_catalog/services.pyā€Ž

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,9 +177,7 @@ class ServiceSummary(CatalogOutputSchema):
177177
version: ServiceVersion
178178
name: str
179179
description: str
180-
181180
version_display: str | None = None
182-
183181
contact: LowerCaseEmailStr | None
184182

185183
@staticmethod
@@ -195,6 +193,14 @@ def _update_json_schema_extra(schema: JsonDict) -> None:
195193
"version_display": _EXAMPLE_SLEEPER["version_display"],
196194
"contact": _EXAMPLE_SLEEPER["contact"],
197195
},
196+
{
197+
"key": _EXAMPLE_SLEEPER["key"],
198+
"version": "100.0.0",
199+
"name": "sleeper",
200+
"description": "short description",
201+
"version_display": "HUGE Release",
202+
"contact": "[email protected]",
203+
},
198204
{
199205
"key": _EXAMPLE_FILEPICKER["key"],
200206
"version": _EXAMPLE_FILEPICKER["version"],

ā€Žpackages/pytest-simcore/src/pytest_simcore/helpers/catalog_rpc_server.pyā€Ž

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
)
2929
from models_library.services_types import ServiceKey, ServiceVersion
3030
from models_library.users import UserID
31-
from pydantic import NonNegativeInt, TypeAdapter, validate_call
31+
from pydantic import TypeAdapter, validate_call
3232
from pytest_mock import MockType
3333
from servicelib.rabbitmq._client_rpc import RabbitMQRPCClient
3434

@@ -52,7 +52,7 @@ async def list_services_paginated(
5252
product_name: ProductName,
5353
user_id: UserID,
5454
limit: PageLimitInt,
55-
offset: NonNegativeInt,
55+
offset: PageOffsetInt,
5656
filters: ServiceListFilters | None = None,
5757
):
5858
assert rpc_client
@@ -209,7 +209,7 @@ async def list_all_services_summaries_paginated(
209209
product_name: ProductName,
210210
user_id: UserID,
211211
limit: PageLimitInt,
212-
offset: NonNegativeInt,
212+
offset: PageOffsetInt,
213213
filters: ServiceListFilters | None = None,
214214
):
215215
assert rpc_client

ā€Žservices/api-server/src/simcore_service_api_server/api/routes/programs.pyā€Ž

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ async def list_programs(
6666

6767
return create_page(
6868
programs,
69-
total=len(programs),
69+
total=page_meta.total,
7070
params=page_params,
7171
)
7272

@@ -103,7 +103,7 @@ async def list_program_history(
103103

104104
return create_page(
105105
programs,
106-
total=len(programs),
106+
total=page_meta.total,
107107
params=page_params,
108108
)
109109

ā€Žservices/api-server/src/simcore_service_api_server/api/routes/solvers.pyā€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ async def list_solver_releases_paginated(
268268
page_params.offset = page_meta.offset
269269
return create_page(
270270
solvers,
271-
total=len(solvers),
271+
total=page_meta.total,
272272
params=page_params,
273273
)
274274

ā€Žservices/api-server/tests/unit/api_solvers/test_api_routers_solvers.pyā€Ž

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,15 +211,26 @@ async def test_solvers_page_pagination_last_page(
211211
assert response.status_code == status.HTTP_200_OK
212212
total_items = response.json()["total"]
213213

214+
assert (
215+
total_items > 1
216+
), "Total items in MOCK examples should be greater than 1 for pagination test since we need 'prev', 'self' and 'prev' links"
217+
last_item = total_items - 1
218+
page_size = 1
219+
214220
# Request the last page by using the total count as offset
215221
response = await client.get(
216-
f"/{API_VTAG}/solvers/page?offset={total_items-1}", auth=auth
222+
f"/{API_VTAG}/solvers/page?limit={page_size}&offset={last_item}", auth=auth
217223
)
218224
assert response.status_code == status.HTTP_200_OK
219225

220226
response_data = response.json()
221227
assert "links" in response_data, "Response should contain links section"
222228

223229
links = response_data["links"]
224-
assert links["next"] is None, "Next link should be None for the last page"
225-
assert links["prev"] is not None, "Prev link should be present for the last page"
230+
assert links["next"] is None, "Next link should be None for the last page (size=1)"
231+
assert (
232+
links["prev"] is not None
233+
), "Prev link should be present for the last page (size=1)"
234+
assert (
235+
links["last"] == links["self"]
236+
), "Last link should be the same as self link for the last page"

0 commit comments

Comments
Ā (0)