fix: Correctly apply API filter for "reviewed" (#21600)

This commit is contained in:
Dermot Duffy 2026-01-11 05:42:33 -08:00 committed by GitHub
parent d952a97bda
commit 7e5d98dbab
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 64 additions and 7 deletions

View File

@ -144,6 +144,8 @@ async def review(
(UserReviewStatus.has_been_reviewed == False)
| (UserReviewStatus.has_been_reviewed.is_null())
)
elif reviewed == 1:
review_query = review_query.where(UserReviewStatus.has_been_reviewed == True)
# Apply ordering and limit
review_query = (

View File

@ -171,8 +171,8 @@ class BaseTestHttp(unittest.TestCase):
def insert_mock_event(
self,
id: str,
start_time: float = datetime.datetime.now().timestamp(),
end_time: float = datetime.datetime.now().timestamp() + 20,
start_time: float | None = None,
end_time: float | None = None,
has_clip: bool = True,
top_score: int = 100,
score: int = 0,
@ -180,6 +180,11 @@ class BaseTestHttp(unittest.TestCase):
camera: str = "front_door",
) -> Event:
"""Inserts a basic event model with a given id."""
if start_time is None:
start_time = datetime.datetime.now().timestamp()
if end_time is None:
end_time = start_time + 20
return Event.insert(
id=id,
label="Mock",
@ -229,11 +234,16 @@ class BaseTestHttp(unittest.TestCase):
def insert_mock_recording(
self,
id: str,
start_time: float = datetime.datetime.now().timestamp(),
end_time: float = datetime.datetime.now().timestamp() + 20,
start_time: float | None = None,
end_time: float | None = None,
motion: int = 0,
) -> Event:
"""Inserts a recording model with a given id."""
if start_time is None:
start_time = datetime.datetime.now().timestamp()
if end_time is None:
end_time = start_time + 20
return Recordings.insert(
id=id,
path=id,

View File

@ -96,16 +96,17 @@ class TestHttpApp(BaseTestHttp):
assert len(events) == 0
def test_get_event_list_limit(self):
now = datetime.now().timestamp()
id = "123456.random"
id2 = "54321.random"
with AuthTestClient(self.app) as client:
super().insert_mock_event(id)
super().insert_mock_event(id, start_time=now + 1)
events = client.get("/events").json()
assert len(events) == 1
assert events[0]["id"] == id
super().insert_mock_event(id2)
super().insert_mock_event(id2, start_time=now)
events = client.get("/events").json()
assert len(events) == 2
@ -144,7 +145,7 @@ class TestHttpApp(BaseTestHttp):
assert events[0]["id"] == id2
assert events[1]["id"] == id
events = client.get("/events", params={"sort": "score_des"}).json()
events = client.get("/events", params={"sort": "score_desc"}).json()
assert len(events) == 2
assert events[0]["id"] == id
assert events[1]["id"] == id2

View File

@ -196,6 +196,50 @@ class TestHttpReview(BaseTestHttp):
assert len(response_json) == 1
assert response_json[0]["id"] == id
def test_get_review_with_reviewed_filter_unreviewed(self):
"""Test that reviewed=0 returns only 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 = {
"reviewed": 0,
"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) == 1
assert response_json[0]["id"] == id_unreviewed
def test_get_review_with_reviewed_filter_reviewed(self):
"""Test that reviewed=1 returns only reviewed 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 = {
"reviewed": 1,
"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) == 1
assert response_json[0]["id"] == id_reviewed
####################################################################################################################
################################### GET /review/summary Endpoint #################################################
####################################################################################################################