fix tests

This commit is contained in:
Josh Hawkins 2025-03-13 15:06:26 -05:00
parent 0b4f1955d0
commit 2f8b8f7e7e
3 changed files with 65 additions and 53 deletions

View File

@ -409,7 +409,7 @@ async def set_multiple_reviewed(
review_segment=ReviewSegment.get(id=review_id), review_segment=ReviewSegment.get(id=review_id),
has_been_reviewed=True, has_been_reviewed=True,
) )
except IntegrityError: except (DoesNotExist, IntegrityError):
pass pass
return JSONResponse( return JSONResponse(

View File

@ -157,16 +157,14 @@ class BaseTestHttp(unittest.TestCase):
start_time: float = datetime.datetime.now().timestamp(), start_time: float = datetime.datetime.now().timestamp(),
end_time: float = datetime.datetime.now().timestamp() + 20, end_time: float = datetime.datetime.now().timestamp() + 20,
severity: SeverityEnum = SeverityEnum.alert, severity: SeverityEnum = SeverityEnum.alert,
has_been_reviewed: bool = False,
data: Json = {}, data: Json = {},
) -> Event: ) -> ReviewSegment:
"""Inserts a review segment model with a given id.""" """Inserts a review segment model with a given id."""
return ReviewSegment.insert( return ReviewSegment.insert(
id=id, id=id,
camera="front_door", camera="front_door",
start_time=start_time, start_time=start_time,
end_time=end_time, end_time=end_time,
has_been_reviewed=has_been_reviewed,
severity=severity, severity=severity,
thumb_path=False, thumb_path=False,
data=data, data=data,

View File

@ -1,16 +1,29 @@
from datetime import datetime, timedelta from datetime import datetime, timedelta
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from peewee import DoesNotExist
from frigate.models import Event, Recordings, ReviewSegment from frigate.api.auth import get_current_user
from frigate.models import Event, Recordings, ReviewSegment, UserReviewStatus
from frigate.review.types import SeverityEnum from frigate.review.types import SeverityEnum
from frigate.test.http_api.base_http_test import BaseTestHttp from frigate.test.http_api.base_http_test import BaseTestHttp
class TestHttpReview(BaseTestHttp): class TestHttpReview(BaseTestHttp):
def setUp(self): def setUp(self):
super().setUp([Event, Recordings, ReviewSegment]) super().setUp([Event, Recordings, ReviewSegment, UserReviewStatus])
self.app = super().create_app() self.app = super().create_app()
self.user_id = "admin"
# Mock get_current_user for all tests
async def mock_get_current_user():
return {"username": self.user_id, "role": "admin"}
self.app.dependency_overrides[get_current_user] = mock_get_current_user
def tearDown(self):
self.app.dependency_overrides.clear()
super().tearDown()
def _get_reviews(self, ids: list[str]): def _get_reviews(self, ids: list[str]):
return list( return list(
@ -24,6 +37,13 @@ class TestHttpReview(BaseTestHttp):
Recordings.select(Recordings.id).where(Recordings.id.in_(ids)).execute() Recordings.select(Recordings.id).where(Recordings.id.in_(ids)).execute()
) )
def _insert_user_review_status(self, review_id: str, reviewed: bool = True):
UserReviewStatus.create(
user_id=self.user_id,
review_segment=ReviewSegment.get(ReviewSegment.id == review_id),
has_been_reviewed=reviewed,
)
#################################################################################################################### ####################################################################################################################
################################### GET /review Endpoint ######################################################## ################################### GET /review Endpoint ########################################################
#################################################################################################################### ####################################################################################################################
@ -43,11 +63,14 @@ class TestHttpReview(BaseTestHttp):
now = datetime.now().timestamp() now = datetime.now().timestamp()
with TestClient(self.app) as client: with TestClient(self.app) as client:
super().insert_mock_review_segment("123456.random", now - 2, now - 1) id = "123456.random"
super().insert_mock_review_segment(id, now - 2, now - 1)
response = client.get("/review") response = client.get("/review")
assert response.status_code == 200 assert response.status_code == 200
response_json = response.json() response_json = response.json()
assert len(response_json) == 1 assert len(response_json) == 1
assert response_json[0]["id"] == id
assert response_json[0]["has_been_reviewed"] == False
def test_get_review_with_time_filter_no_matches(self): def test_get_review_with_time_filter_no_matches(self):
now = datetime.now().timestamp() now = datetime.now().timestamp()
@ -391,37 +414,27 @@ class TestHttpReview(BaseTestHttp):
with TestClient(self.app) as client: with TestClient(self.app) as client:
five_days_ago_ts = five_days_ago.timestamp() five_days_ago_ts = five_days_ago.timestamp()
for i in range(10): for i in range(10):
id = f"123456_{i}.random_alert_not_reviewed"
super().insert_mock_review_segment( super().insert_mock_review_segment(
f"123456_{i}.random_alert_not_reviewed", id, five_days_ago_ts, five_days_ago_ts, SeverityEnum.alert
five_days_ago_ts,
five_days_ago_ts,
SeverityEnum.alert,
False,
) )
for i in range(10): for i in range(10):
id = f"123456_{i}.random_alert_reviewed"
super().insert_mock_review_segment( super().insert_mock_review_segment(
f"123456_{i}.random_alert_reviewed", id, five_days_ago_ts, five_days_ago_ts, SeverityEnum.alert
five_days_ago_ts,
five_days_ago_ts,
SeverityEnum.alert,
True,
) )
self._insert_user_review_status(id, reviewed=True)
for i in range(10): for i in range(10):
id = f"123456_{i}.random_detection_not_reviewed"
super().insert_mock_review_segment( super().insert_mock_review_segment(
f"123456_{i}.random_detection_not_reviewed", id, five_days_ago_ts, five_days_ago_ts, SeverityEnum.detection
five_days_ago_ts,
five_days_ago_ts,
SeverityEnum.detection,
False,
) )
for i in range(5): for i in range(5):
id = f"123456_{i}.random_detection_reviewed"
super().insert_mock_review_segment( super().insert_mock_review_segment(
f"123456_{i}.random_detection_reviewed", id, five_days_ago_ts, five_days_ago_ts, SeverityEnum.detection
five_days_ago_ts,
five_days_ago_ts,
SeverityEnum.detection,
True,
) )
self._insert_user_review_status(id, reviewed=True)
response = client.get("/review/summary") response = client.get("/review/summary")
assert response.status_code == 200 assert response.status_code == 200
response_json = response.json() response_json = response.json()
@ -447,6 +460,7 @@ class TestHttpReview(BaseTestHttp):
#################################################################################################################### ####################################################################################################################
################################### POST reviews/viewed Endpoint ################################################ ################################### POST reviews/viewed Endpoint ################################################
#################################################################################################################### ####################################################################################################################
def test_post_reviews_viewed_no_body(self): def test_post_reviews_viewed_no_body(self):
with TestClient(self.app) as client: with TestClient(self.app) as client:
super().insert_mock_review_segment("123456.random") super().insert_mock_review_segment("123456.random")
@ -473,12 +487,11 @@ class TestHttpReview(BaseTestHttp):
assert response["success"] == True assert response["success"] == True
assert response["message"] == "Reviewed multiple items" assert response["message"] == "Reviewed multiple items"
# Verify that in DB the review segment was not changed # Verify that in DB the review segment was not changed
review_segment_in_db = ( with self.assertRaises(DoesNotExist):
ReviewSegment.select(ReviewSegment.has_been_reviewed) UserReviewStatus.get(
.where(ReviewSegment.id == id) UserReviewStatus.user_id == self.user_id,
.get() UserReviewStatus.review_segment == "1",
) )
assert review_segment_in_db.has_been_reviewed == False
def test_post_reviews_viewed(self): def test_post_reviews_viewed(self):
with TestClient(self.app) as client: with TestClient(self.app) as client:
@ -487,16 +500,15 @@ class TestHttpReview(BaseTestHttp):
body = {"ids": [id]} body = {"ids": [id]}
response = client.post("/reviews/viewed", json=body) response = client.post("/reviews/viewed", json=body)
assert response.status_code == 200 assert response.status_code == 200
response = response.json() response_json = response.json()
assert response["success"] == True assert response_json["success"] == True
assert response["message"] == "Reviewed multiple items" assert response_json["message"] == "Reviewed multiple items"
# Verify that in DB the review segment was changed # Verify UserReviewStatus was created
review_segment_in_db = ( user_review = UserReviewStatus.get(
ReviewSegment.select(ReviewSegment.has_been_reviewed) UserReviewStatus.user_id == self.user_id,
.where(ReviewSegment.id == id) UserReviewStatus.review_segment == id,
.get()
) )
assert review_segment_in_db.has_been_reviewed == True assert user_review.has_been_reviewed == True
#################################################################################################################### ####################################################################################################################
################################### POST reviews/delete Endpoint ################################################ ################################### POST reviews/delete Endpoint ################################################
@ -672,8 +684,7 @@ class TestHttpReview(BaseTestHttp):
"camera": "front_door", "camera": "front_door",
"start_time": now + 1, "start_time": now + 1,
"end_time": now + 2, "end_time": now + 2,
"has_been_reviewed": False, "severity": "alert",
"severity": SeverityEnum.alert,
"thumb_path": "False", "thumb_path": "False",
"data": {"detections": {"event_id": event_id}}, "data": {"detections": {"event_id": event_id}},
}, },
@ -708,8 +719,7 @@ class TestHttpReview(BaseTestHttp):
"camera": "front_door", "camera": "front_door",
"start_time": now + 1, "start_time": now + 1,
"end_time": now + 2, "end_time": now + 2,
"has_been_reviewed": False, "severity": "alert",
"severity": SeverityEnum.alert,
"thumb_path": "False", "thumb_path": "False",
"data": {}, "data": {},
}, },
@ -719,6 +729,7 @@ class TestHttpReview(BaseTestHttp):
#################################################################################################################### ####################################################################################################################
################################### DELETE /review/{review_id}/viewed Endpoint ################################## ################################### DELETE /review/{review_id}/viewed Endpoint ##################################
#################################################################################################################### ####################################################################################################################
def test_delete_review_viewed_review_not_found(self): def test_delete_review_viewed_review_not_found(self):
with TestClient(self.app) as client: with TestClient(self.app) as client:
review_id = "123456.random" review_id = "123456.random"
@ -735,11 +746,10 @@ class TestHttpReview(BaseTestHttp):
with TestClient(self.app) as client: with TestClient(self.app) as client:
review_id = "123456.review.random" review_id = "123456.review.random"
super().insert_mock_review_segment( super().insert_mock_review_segment(review_id, now + 1, now + 2)
review_id, now + 1, now + 2, has_been_reviewed=True self._insert_user_review_status(review_id, reviewed=True)
) # Verify its reviewed before
review_before = ReviewSegment.get(ReviewSegment.id == review_id) response = client.get(f"/review/{review_id}")
assert review_before.has_been_reviewed == True
response = client.delete(f"/review/{review_id}/viewed") response = client.delete(f"/review/{review_id}/viewed")
assert response.status_code == 200 assert response.status_code == 200
@ -749,5 +759,9 @@ class TestHttpReview(BaseTestHttp):
response_json, response_json,
) )
review_after = ReviewSegment.get(ReviewSegment.id == review_id) # Verify its unreviewed after
assert review_after.has_been_reviewed == False with self.assertRaises(DoesNotExist):
UserReviewStatus.get(
UserReviewStatus.user_id == self.user_id,
UserReviewStatus.review_segment == review_id,
)