Skip to content

Commit 5a124d4

Browse files
authoredDec 15, 2024··
Merge pull request #177 from phguyss/items-per-page-with-default-page
fix: default page or items_per_page for when paginating using the get on list
2 parents dc831b1 + 625167e commit 5a124d4

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed
 

‎fastcrud/endpoint/endpoint_creator.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ async def endpoint(
352352
),
353353
filters: dict = Depends(dynamic_filters),
354354
):
355-
is_paginated = (page is not None) and (items_per_page is not None)
355+
is_paginated = (page is not None) or (items_per_page is not None)
356356
has_offset_limit = (offset is not None) and (limit is not None)
357357

358358
if is_paginated and has_offset_limit:
@@ -361,6 +361,10 @@ async def endpoint(
361361
)
362362

363363
if is_paginated:
364+
if not page:
365+
page = 1
366+
if not items_per_page:
367+
items_per_page = 10
364368
offset = compute_offset(page=page, items_per_page=items_per_page) # type: ignore
365369
limit = items_per_page
366370
crud_data = await self.crud.get_multi(

‎tests/sqlmodel/endpoint/test_get_paginated.py

+66
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,69 @@ async def test_read_items_with_pagination_and_filters(
8787

8888
for item in data["data"]:
8989
assert item["name"] == name
90+
91+
92+
@pytest.mark.asyncio
93+
async def test_read_items_with_only_items_per_page_on_pagination(
94+
client: TestClient, async_session, test_model, test_data
95+
):
96+
for data in test_data:
97+
new_item = test_model(**data)
98+
async_session.add(new_item)
99+
await async_session.commit()
100+
101+
items_per_page = 1
102+
103+
response = client.get(f"/test/get_multi?&itemsPerPage={items_per_page}")
104+
105+
assert response.status_code == 200
106+
107+
data = response.json()
108+
109+
assert "data" in data
110+
assert "total_count" in data
111+
assert "page" in data
112+
assert "items_per_page" in data
113+
assert "has_more" in data
114+
115+
assert len(data["data"]) > 0
116+
assert len(data["data"]) <= items_per_page
117+
118+
test_item = test_data[0]
119+
assert any(item["name"] == test_item["name"] for item in data["data"])
120+
121+
assert data["page"] == 1
122+
assert data["items_per_page"] == items_per_page
123+
124+
125+
@pytest.mark.asyncio
126+
async def test_read_items_with_only_page_on_pagination(
127+
client: TestClient, async_session, test_model, test_data
128+
):
129+
for data in test_data:
130+
new_item = test_model(**data)
131+
async_session.add(new_item)
132+
await async_session.commit()
133+
134+
page = 1
135+
136+
response = client.get(f"/test/get_multi?&page={page}")
137+
138+
assert response.status_code == 200
139+
140+
data = response.json()
141+
142+
assert "data" in data
143+
assert "total_count" in data
144+
assert "page" in data
145+
assert "items_per_page" in data
146+
assert "has_more" in data
147+
148+
assert len(data["data"]) > 0
149+
assert len(data["data"]) <= 10
150+
151+
test_item = test_data[0]
152+
assert any(item["name"] == test_item["name"] for item in data["data"])
153+
154+
assert data["page"] == page
155+
assert data["items_per_page"] == 10

0 commit comments

Comments
 (0)
Please sign in to comment.