fix: 'reviewed' filter should be tristate

This commit is contained in:
dermotduffy 2026-01-19 14:33:50 -08:00
parent 0a8f499640
commit 328906401a
2 changed files with 31 additions and 8 deletions

View File

@ -138,14 +138,15 @@ async def review(
.where(reduce(operator.and_, clauses)) .where(reduce(operator.and_, clauses))
) )
# Filter unreviewed items without subquery # Filter by reviewed status (None = all, 0 = unreviewed only, 1 = reviewed only)
if reviewed == 0: if reviewed is not None:
review_query = review_query.where( if reviewed == 0:
(UserReviewStatus.has_been_reviewed == False) review_query = review_query.where(
| (UserReviewStatus.has_been_reviewed.is_null()) (UserReviewStatus.has_been_reviewed == False)
) | (UserReviewStatus.has_been_reviewed.is_null())
elif reviewed == 1: )
review_query = review_query.where(UserReviewStatus.has_been_reviewed == True) elif reviewed == 1:
review_query = review_query.where(UserReviewStatus.has_been_reviewed == True)
# Apply ordering and limit # Apply ordering and limit
review_query = ( review_query = (

View File

@ -240,6 +240,28 @@ class TestHttpReview(BaseTestHttp):
assert len(response_json) == 1 assert len(response_json) == 1
assert response_json[0]["id"] == id_reviewed assert response_json[0]["id"] == id_reviewed
def test_get_review_with_no_reviewed_filter(self):
"""Test that omitting 'reviewed' parameter returns both reviewed and unreviewed items."""
now = datetime.now().timestamp()
with AuthTestClient(self.app) as client:
id_unreviewed = "123456.unreviewed"
id_reviewed = "123456.reviewed"
super().insert_mock_review_segment(id_unreviewed, now, now + 2)
super().insert_mock_review_segment(id_reviewed, now, now + 2)
self._insert_user_review_status(id_reviewed, reviewed=True)
params = {
"after": now - 1,
"before": now + 3,
}
response = client.get("/review", params=params)
assert response.status_code == 200
response_json = response.json()
assert len(response_json) == 2
returned_ids = {item["id"] for item in response_json}
assert returned_ids == {id_unreviewed, id_reviewed}
#################################################################################################################### ####################################################################################################################
################################### GET /review/summary Endpoint ################################################# ################################### GET /review/summary Endpoint #################################################
#################################################################################################################### ####################################################################################################################