diff --git a/backend/db/crud_case.py b/backend/db/crud_case.py index a497cdda..a09b6ebf 100644 --- a/backend/db/crud_case.py +++ b/backend/db/crud_case.py @@ -1,5 +1,6 @@ from sqlalchemy.orm import Session -from sqlalchemy import and_ +from sqlalchemy import and_, cast +from sqlalchemy.dialects.postgresql import TEXT from typing import Optional, List from typing_extensions import TypedDict from fastapi import HTTPException, status @@ -126,7 +127,9 @@ def get_all_case( user_ids = [u.id for u in users] case = case.filter(Case.created_by.in_(user_ids)) if year: - case = case.filter(Case.year.ilike("%{}%".format(year))) + case = case.filter( + cast(Case.year, TEXT).ilike("%{}%".format(f"{year}".strip())) + ) count = case.count() case = case.order_by(Case.id.desc()).offset(skip).limit(limit).all() return PaginatedCaseData(count=count, data=case) diff --git a/backend/tests/test_023_case_filter.py b/backend/tests/test_023_case_filter.py index 2649dde4..37050c15 100644 --- a/backend/tests/test_023_case_filter.py +++ b/backend/tests/test_023_case_filter.py @@ -258,3 +258,50 @@ async def test_get_case_filtered_by_email( "total": 2, "total_page": 1, } + + @pytest.mark.asyncio + async def test_get_case_filtered_by_year( + self, app: FastAPI, session: Session, client: AsyncClient + ) -> None: + res = await client.get( + app.url_path_for("case:get_all"), + params={"year": "1992"}, + headers={"Authorization": f"Bearer {admin_account.token}"}, + ) + assert res.status_code == 404 + res = await client.get( + app.url_path_for("case:get_all"), + params={"year": "2023"}, + headers={"Authorization": f"Bearer {admin_account.token}"}, + ) + assert res.status_code == 200 + res = res.json() + assert res == { + "current": 1, + "data": [ + { + "id": 2, + "name": "Bali Coffee Production (Private)", + "country": "Bali", + "focus_commodity": 1, + "diversified_commodities_count": 1, + "year": 2023, + "created_at": res["data"][0]["created_at"], + "created_by": "super_admin@akvo.org", + "tags": [], + }, + { + "id": 1, + "name": "Bali Rice and Corn Production", + "country": "Bali", + "focus_commodity": 2, + "diversified_commodities_count": 2, + "year": 2023, + "created_at": res["data"][1]["created_at"], + "created_by": "super_admin@akvo.org", + "tags": [2, 1], + }, + ], + "total": 2, + "total_page": 1, + }