mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-05-06 05:27:44 +03:00
fix tests
This commit is contained in:
parent
0b4f1955d0
commit
2f8b8f7e7e
@ -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(
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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 it’s 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 it’s 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,
|
||||||
|
)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user