Skip to content

Commit 4d6aee7

Browse files
authored
Add pagination to /bookmarks (#602)
* Fix issues with version marker * Add pagination to listing `bookmarks`
1 parent 921f130 commit 4d6aee7

File tree

6 files changed

+62
-11
lines changed

6 files changed

+62
-11
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ repos:
4040
hooks:
4141
- id: pytest-check
4242
name: pytest-check
43-
entry: pytest src/tests --versions ''
43+
entry: pytest src/tests --versions 'latest'
4444
language: system
4545
pass_filenames: false
4646
exclude: ".*.md"

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,4 @@ env_files = [
8484
".env", # Only used if running from docker container
8585
"tests/.env" # Only used if running from docker container
8686
]
87+
markers=["versions"]

src/routers/bookmark_router.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from database.model.bookmark.bookmark import Bookmark
99
from http import HTTPStatus
1010
from datetime import datetime
11+
12+
from dependencies.pagination import PaginationParams
1113
from routers.helper_functions import get_asset_type_by_abbreviation
1214
from versioning import Version
1315

@@ -33,11 +35,17 @@ def create(url_prefix: str = "", version: Version = Version.LATEST) -> APIRouter
3335
response_model=List[BookmarkRead],
3436
)
3537
def list_bookmarks(
36-
user: KeycloakUser = Depends(get_user_or_raise), session: Session = Depends(get_session)
38+
pagination: PaginationParams,
39+
user: KeycloakUser = Depends(get_user_or_raise),
40+
session: Session = Depends(get_session),
3741
) -> List[BookmarkRead]:
38-
return session.exec(
39-
select(Bookmark).where(Bookmark.user_identifier == user._subject_identifier)
40-
).all()
42+
stmt = (
43+
select(Bookmark)
44+
.where(Bookmark.user_identifier == user._subject_identifier)
45+
.offset(pagination.offset)
46+
.limit(pagination.limit)
47+
)
48+
return session.exec(stmt).all()
4149

4250
@router.post(
4351
path,

src/tests/conftest.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,10 @@ def pytest_generate_tests(metafunc):
1515
selected_versions = version_marker.args if version_marker else default_versions
1616

1717
# If version is set through the command line, only use that for testing.
18-
all_versions = list(Version)
19-
versions_to_include = metafunc.config.getoption("versions") or all_versions
18+
versions_to_include = list(Version)
19+
if cmd_line_versions := metafunc.config.getoption("versions"):
20+
versions_to_include = [Version(v) for v in cmd_line_versions]
2021
versions = set(selected_versions).intersection(set(versions_to_include))
21-
if not versions:
22-
pytest.skip(f"Test not defined for selection: {versions_to_include}")
23-
2422
metafunc.parametrize(
2523
"client", versions, indirect=True
2624
)

src/tests/test_bookmark_endpoints.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from http import HTTPStatus
22

3+
import pytest
34
from starlette.testclient import TestClient
45
from database.session import DbSession
56

@@ -10,6 +11,7 @@
1011
from datetime import datetime
1112
from database.model.agent.person import Person
1213
from database.model.agent.contact import Contact
14+
from versioning import Version
1315

1416

1517
def test_create_bookmark(
@@ -140,3 +142,45 @@ def test_delete_bookmark(
140142
)
141143
assert response.status_code == HTTPStatus.OK
142144
assert all(b["resource_identifier"] != identifier for b in response.json())
145+
146+
147+
@pytest.mark.versions(Version.V2, Version.LATEST)
148+
def test_get_bookmark_pagination(client: TestClient, publication_factory) -> None:
149+
PAGINATION_DEFAULT_LIMIT = 10
150+
publications = [publication_factory() for _ in range(PAGINATION_DEFAULT_LIMIT + 1)]
151+
with logged_in_user(ALICE):
152+
for pub in publications:
153+
register_asset(pub, owner=ALICE)
154+
response = client.post(
155+
f"/bookmarks?resource_identifier={pub.identifier}",
156+
headers={"Authorization": "fake token"},
157+
)
158+
assert response.status_code == HTTPStatus.OK
159+
160+
response = client.get(
161+
"/bookmarks",
162+
headers={"Authorization": "fake token"},
163+
)
164+
assert response.status_code == HTTPStatus.OK
165+
assert len(response.json()) == PAGINATION_DEFAULT_LIMIT
166+
167+
response = client.get(
168+
"/bookmarks?limit=100",
169+
headers={"Authorization": "fake token"},
170+
)
171+
assert response.status_code == HTTPStatus.OK
172+
assert len(response.json()) == PAGINATION_DEFAULT_LIMIT + 1
173+
174+
response = client.get(
175+
"/bookmarks?offset=10",
176+
headers={"Authorization": "fake token"},
177+
)
178+
assert response.status_code == HTTPStatus.OK
179+
assert len(response.json()) == 1
180+
181+
response = client.get(
182+
"/bookmarks?offset=8&limit=2",
183+
headers={"Authorization": "fake token"},
184+
)
185+
assert response.status_code == HTTPStatus.OK
186+
assert len(response.json()) == 2

src/tests/testutils/default_sqlalchemy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ def client(request, engine: Engine) -> TestClient:
152152
app = build_app(version="unittest")
153153
client = TestClient(
154154
app,
155-
base_url=f"http://localhost/{request.param.prefix}", # param is Version
155+
base_url=f"http://localhost{request.param.prefix}/", # param is Version
156156
)
157157
client.version = request.param
158158
yield client

0 commit comments

Comments
 (0)