Skip to content
This repository was archived by the owner on Apr 2, 2025. It is now read-only.

Commit 53afb66

Browse files
feat: rework test backend to make code smoother feat: use default feat: use include_query_params instead of parsing query param string ourselves
1 parent 90d0ebd commit 53afb66

File tree

4 files changed

+32
-37
lines changed

4 files changed

+32
-37
lines changed

src/stapi_fastapi/backends/root_backend.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
class RootBackend[T: OrderStatusPayload, U: OrderStatus](Protocol): # pragma: nocover
1616
async def get_orders(
17-
self, request: Request, next: str | None, limit: int | None
17+
self, request: Request, next: str | None, limit: int
1818
) -> ResultE[tuple[OrderCollection, str]]:
1919
"""
2020
Return a list of existing orders and pagination token if applicable

src/stapi_fastapi/routers/root_router.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ def get_products(self, request: Request) -> ProductsCollection:
160160
)
161161

162162
async def get_orders(
163-
self, request: Request, next: str | None = None, limit: int | None = None
163+
self, request: Request, next: str | None = None, limit: int = 10
164164
) -> OrderCollection:
165165
match await self.backend.get_orders(request, next, limit):
166166
case Success((collections, token)):
@@ -177,13 +177,7 @@ async def get_orders(
177177
)
178178
)
179179
if token: # pagination link if backend returns token
180-
query = request.url.components.query
181-
params = {
182-
param.split("=")[0]: param.split("=")[1]
183-
for param in query.split("&")
184-
}
185-
params["next"] = token
186-
updated_url = request.url.replace_query_params(**params)
180+
updated_url = request.url.include_query_params(next=token)
187181
collections.links.append(
188182
Link(href=str(updated_url), rel="next", type=TYPE_JSON)
189183
)

tests/application.py

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -44,33 +44,35 @@ def __init__(self, orders: InMemoryOrderDB) -> None:
4444
self._orders_db: InMemoryOrderDB = orders
4545

4646
async def get_orders(
47-
self, request: Request, next: str | None = None, limit: int | None = None
47+
self, request: Request, next: str | None, limit: int
4848
) -> ResultE[tuple[OrderCollection, str]]:
4949
"""
5050
Return orders from backend. Handle pagination/limit if applicable
5151
"""
52-
features = list(self._orders_db._orders.values())
53-
if limit and not next:
54-
return Success((OrderCollection(features=features[:limit]), ""))
55-
if next:
56-
57-
def token_processor(next: str) -> tuple[str, int]:
58-
"""process token to return new token and start loc"""
59-
return "new_token", 0
60-
61-
token, start = token_processor(next)
62-
if limit:
63-
if start + limit > len(features):
64-
features = features[start:]
65-
else:
66-
features = features[start:limit]
67-
return Success((OrderCollection(features=features), token))
68-
else: # token and no limit
69-
return Success((OrderCollection(features=features[start:]), ""))
70-
else:
71-
return Success(
72-
(OrderCollection(features=list(self._orders_db._orders.values())), "")
73-
)
52+
try:
53+
start = 0
54+
order_ids = sorted(self._orders_db._orders.keys())
55+
if not order_ids: # not data in db return empty
56+
return Success(
57+
(
58+
OrderCollection(
59+
features=list(self._orders_db._orders.values())
60+
),
61+
"",
62+
)
63+
)
64+
65+
if next:
66+
start = [i for i, x in enumerate(order_ids) if x == next][0]
67+
end = start + limit
68+
ids = order_ids[start:end]
69+
70+
feats = [self._orders_db._orders[order_id] for order_id in ids]
71+
next = self._orders_db._orders[order_ids[end]].id
72+
73+
return Success((OrderCollection(features=feats), next))
74+
except Exception as e:
75+
return Failure(e)
7476

7577
async def get_order(self, order_id: str, request: Request) -> ResultE[Maybe[Order]]:
7678
"""

tests/test_order.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ def create_second_order_allowed_payloads() -> list[OrderPayload]:
187187
]
188188

189189

190-
@pytest.mark.parametrize("product_id", ["test-spotlight"])
190+
@pytest.mark.parametrize("product_id", [pytest.param("test-spotlight", id="base test")])
191191
def test_order_pagination(
192192
product_id: str,
193193
product_backend: MockProductBackend,
@@ -196,7 +196,6 @@ def test_order_pagination(
196196
create_second_order_allowed_payloads: list[OrderPayload],
197197
) -> None:
198198
product_backend._allowed_payloads = create_order_allowed_payloads
199-
OLD_TOKEN = "a_token"
200199

201200
# check empty
202201
res = stapi_client.get("/orders")
@@ -220,9 +219,9 @@ def test_order_pagination(
220219
f"products/{product_id}/orders",
221220
json=create_second_order_allowed_payloads[0].model_dump(),
222221
)
223-
224222
# call all orders
225-
res = stapi_client.get("/orders", params={"next": OLD_TOKEN, "limit": 1})
223+
next = res.json()["id"]
224+
res = stapi_client.get("/orders", params={"next": next, "limit": 1})
226225
checker = res.json()
227226

228227
assert res.status_code == status.HTTP_200_OK
@@ -233,6 +232,6 @@ def test_order_pagination(
233232
assert checker["links"] != []
234233

235234
# check to make sure new token in link
236-
assert OLD_TOKEN not in checker["links"][0]["href"]
235+
assert next not in checker["links"][0]["href"]
237236

238237
assert len(checker["features"]) == 1

0 commit comments

Comments
 (0)