Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 16 additions & 5 deletions app/api/orders/orders.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,12 @@
router = APIRouter()
base_url = os.getenv("BASE_URL", "http://localhost:8000")




# Refactored GET /orders endpoint to return paginated, filtered, and ordered results
@router.get("/orders")
def get_orders(
page: int = Query(1, ge=1, description="Page number (1-based)"),
limit: int = Query(100, ge=1, le=500, description="Records per page (default 100, max 500)"),
search: str = Query(None, description="Search string (case-insensitive, partial match)"),
s: str = Query(None, alias="s", description="Search string (case-insensitive, partial match)"),
hideflagged: bool = Query(False, description="If true, flagged records are excluded")
) -> dict:
"""Return paginated, filtered, and ordered records, filtered by search if provided."""
Expand All @@ -30,7 +27,17 @@ def get_orders(
params = []
if hideflagged:
where_clauses.append("flag IS NOT TRUE")
# No first_name/last_name search, as those columns do not exist
if s:
# Search in name, description, or categories (case-insensitive, partial match)
where_clauses.append("(" +
" OR ".join([
"LOWER(name) LIKE %s",
"LOWER(description) LIKE %s",
"LOWER(categories) LIKE %s"
]) + ")"
)
search_param = f"%{s.lower()}%"
params.extend([search_param, search_param, search_param])
where_sql = " AND ".join(where_clauses)

# Count query
Expand Down Expand Up @@ -60,13 +67,17 @@ def get_orders(
cur.close()
conn.close()
return {

"meta": meta,
"pagination": {
"page": page,
"limit": limit,
"total": total,
"pages": (total // limit) + (1 if total % limit else 0)
},
"search": {
"searchStr": s
},
"data": data,
}

51 changes: 51 additions & 0 deletions tests/test_orders.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import pytest
from fastapi.testclient import TestClient
from app.main import app

client = TestClient(app)


def test_get_orders_root():
response = client.get("/orders")
assert response.status_code == 200
data = response.json()
assert "meta" in data
assert "pagination" in data
assert "data" in data
assert "search" in data
assert isinstance(data["data"], list)
# Check that the expected keys are present in the data list (if not empty)
if data["data"]:
first_item = data["data"][0]
# Accept any unique identifier, e.g., 'sku' or 'name' or 'order_id'
assert (
"sku" in first_item or
"name" in first_item or
"order_id" in first_item
)
assert "name" in first_item or "description" in first_item or "categories" in first_item
# Meta checks
meta = data["meta"]
assert meta["severity"] == "success"
assert meta["title"] == "Read paginated orders"

def test_orders_search_param():
search_term = "test"
response = client.get(f"/orders?s={search_term}")
assert response.status_code == 200
data = response.json()
assert "search" in data
# Accept both string and dict for search key for compatibility
if isinstance(data["search"], dict):
assert data["search"].get("searchStr") == search_term
else:
assert data["search"] == search_term

def test_orders_returns_list():
response = client.get("/orders")
assert response.status_code == 200
data = response.json()
assert "meta" in data
assert "pagination" in data
assert "data" in data
assert isinstance(data["data"], list)
Loading