Skip to content

Commit b807d24

Browse files
Merge pull request #82 from goldlabelapps/staging
This pull request enhances the `/orders` API endpoint by improving its search capabilities, updating the response structure, and adding tests to ensure correct functionality.
2 parents 621aff2 + 56a3196 commit b807d24

2 files changed

Lines changed: 67 additions & 5 deletions

File tree

app/api/orders/orders.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,12 @@
77
router = APIRouter()
88
base_url = os.getenv("BASE_URL", "http://localhost:8000")
99

10-
11-
12-
1310
# Refactored GET /orders endpoint to return paginated, filtered, and ordered results
1411
@router.get("/orders")
1512
def get_orders(
1613
page: int = Query(1, ge=1, description="Page number (1-based)"),
1714
limit: int = Query(100, ge=1, le=500, description="Records per page (default 100, max 500)"),
18-
search: str = Query(None, description="Search string (case-insensitive, partial match)"),
15+
s: str = Query(None, alias="s", description="Search string (case-insensitive, partial match)"),
1916
hideflagged: bool = Query(False, description="If true, flagged records are excluded")
2017
) -> dict:
2118
"""Return paginated, filtered, and ordered records, filtered by search if provided."""
@@ -30,7 +27,17 @@ def get_orders(
3027
params = []
3128
if hideflagged:
3229
where_clauses.append("flag IS NOT TRUE")
33-
# No first_name/last_name search, as those columns do not exist
30+
if s:
31+
# Search in name, description, or categories (case-insensitive, partial match)
32+
where_clauses.append("(" +
33+
" OR ".join([
34+
"LOWER(name) LIKE %s",
35+
"LOWER(description) LIKE %s",
36+
"LOWER(categories) LIKE %s"
37+
]) + ")"
38+
)
39+
search_param = f"%{s.lower()}%"
40+
params.extend([search_param, search_param, search_param])
3441
where_sql = " AND ".join(where_clauses)
3542

3643
# Count query
@@ -60,13 +67,17 @@ def get_orders(
6067
cur.close()
6168
conn.close()
6269
return {
70+
6371
"meta": meta,
6472
"pagination": {
6573
"page": page,
6674
"limit": limit,
6775
"total": total,
6876
"pages": (total // limit) + (1 if total % limit else 0)
6977
},
78+
"search": {
79+
"searchStr": s
80+
},
7081
"data": data,
7182
}
7283

tests/test_orders.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import pytest
2+
from fastapi.testclient import TestClient
3+
from app.main import app
4+
5+
client = TestClient(app)
6+
7+
8+
def test_get_orders_root():
9+
response = client.get("/orders")
10+
assert response.status_code == 200
11+
data = response.json()
12+
assert "meta" in data
13+
assert "pagination" in data
14+
assert "data" in data
15+
assert "search" in data
16+
assert isinstance(data["data"], list)
17+
# Check that the expected keys are present in the data list (if not empty)
18+
if data["data"]:
19+
first_item = data["data"][0]
20+
# Accept any unique identifier, e.g., 'sku' or 'name' or 'order_id'
21+
assert (
22+
"sku" in first_item or
23+
"name" in first_item or
24+
"order_id" in first_item
25+
)
26+
assert "name" in first_item or "description" in first_item or "categories" in first_item
27+
# Meta checks
28+
meta = data["meta"]
29+
assert meta["severity"] == "success"
30+
assert meta["title"] == "Read paginated orders"
31+
32+
def test_orders_search_param():
33+
search_term = "test"
34+
response = client.get(f"/orders?s={search_term}")
35+
assert response.status_code == 200
36+
data = response.json()
37+
assert "search" in data
38+
# Accept both string and dict for search key for compatibility
39+
if isinstance(data["search"], dict):
40+
assert data["search"].get("searchStr") == search_term
41+
else:
42+
assert data["search"] == search_term
43+
44+
def test_orders_returns_list():
45+
response = client.get("/orders")
46+
assert response.status_code == 200
47+
data = response.json()
48+
assert "meta" in data
49+
assert "pagination" in data
50+
assert "data" in data
51+
assert isinstance(data["data"], list)

0 commit comments

Comments
 (0)