Skip to content

Commit 37fb440

Browse files
authored
Fix issue with links.LimiOffsetPage revalidation (#799)
1 parent bdcf526 commit 37fb440

File tree

2 files changed

+44
-10
lines changed

2 files changed

+44
-10
lines changed

fastapi_pagination/links/limit_offset.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
__all__ = ["LimitOffsetPage"]
44

55
from math import floor
6-
from typing import Any, Generic, TypeVar
6+
from typing import Any, Generic, MutableMapping, TypeVar
77

88
from ..limit_offset import LimitOffsetPage as BasePage
99
from .bases import Links, create_links, validation_decorator
@@ -16,6 +16,9 @@ class LimitOffsetPage(BasePage[T], Generic[T]):
1616

1717
@validation_decorator
1818
def __root_validator__(cls, value: Any) -> Any:
19+
if not isinstance(value, MutableMapping):
20+
return value
21+
1922
if "links" not in value:
2023
offset, limit, total = [value[k] for k in ("offset", "limit", "total")]
2124

tests/test_links.py

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,23 @@ async def route_2():
2323
return paginate([])
2424

2525

26-
class MySchema(BaseModel):
26+
class MySchemaPage(BaseModel):
2727
page: Page[Any]
2828

2929

30+
class MySchemaLimitOffset(BaseModel):
31+
page: LimitOffsetPage[Any]
32+
33+
3034
@app.get(
31-
"/revalidate",
32-
dependencies=[Depends(pagination_ctx(Page))],
33-
response_model=MySchema,
35+
"/revalidate/default",
36+
dependencies=[Depends(pagination_ctx(Page[int]))],
37+
response_model=MySchemaPage,
38+
)
39+
@app.get(
40+
"/revalidate/limit-offset",
41+
dependencies=[Depends(pagination_ctx(LimitOffsetPage[int]))],
42+
response_model=MySchemaLimitOffset,
3443
)
3544
async def route_3():
3645
page = paginate([*range(10)])
@@ -124,8 +133,9 @@ def test_links(self, prev, next, first, last):
124133
}
125134

126135

127-
def test_revalidation():
128-
response = client.get("/revalidate")
136+
def test_revalidation_default():
137+
response = client.get("/revalidate/default")
138+
print(response.json())
129139

130140
assert response.status_code == status.HTTP_200_OK
131141
assert response.json() == {
@@ -136,9 +146,30 @@ def test_revalidation():
136146
"size": 50,
137147
"pages": 1,
138148
"links": {
139-
"first": "/revalidate?page=1",
140-
"last": "/revalidate?page=1",
141-
"self": "/revalidate",
149+
"first": "/revalidate/default?page=1",
150+
"last": "/revalidate/default?page=1",
151+
"self": "/revalidate/default",
152+
"next": None,
153+
"prev": None,
154+
},
155+
},
156+
}
157+
158+
159+
def test_revalidation_limit_offset():
160+
response = client.get("/revalidate/limit-offset")
161+
162+
assert response.status_code == status.HTTP_200_OK
163+
assert response.json() == {
164+
"page": {
165+
"items": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
166+
"total": 10,
167+
"limit": 50,
168+
"offset": 0,
169+
"links": {
170+
"first": "/revalidate/limit-offset?offset=0",
171+
"last": "/revalidate/limit-offset?offset=0",
172+
"self": "/revalidate/limit-offset",
142173
"next": None,
143174
"prev": None,
144175
},

0 commit comments

Comments
 (0)