From 22408e9e484eae436faefea5b197d69893a2d81a Mon Sep 17 00:00:00 2001 From: Rui Alves Date: Sun, 24 Nov 2024 10:59:13 +0000 Subject: [PATCH] Added tests for review summary endpoint (multiple days with alerts in the last month) --- frigate/api/review.py | 3 +- frigate/test/http_api/test_http_review.py | 112 +++++++++++++++------- 2 files changed, 78 insertions(+), 37 deletions(-) diff --git a/frigate/api/review.py b/frigate/api/review.py index 21b468640..1caa7f8a5 100644 --- a/frigate/api/review.py +++ b/frigate/api/review.py @@ -230,6 +230,7 @@ def review_summary(params: ReviewSummaryQueryParams = Depends()): label_clause = reduce(operator.or_, label_clauses) clauses.append((label_clause)) + day_in_seconds = 60 * 60 * 24 last_month = ( ReviewSegment.select( fn.strftime( @@ -292,7 +293,7 @@ def review_summary(params: ReviewSummaryQueryParams = Depends()): ) .where(reduce(operator.and_, clauses)) .group_by( - (ReviewSegment.start_time + seconds_offset).cast("int") / (3600 * 24), + (ReviewSegment.start_time + seconds_offset).cast("int") / day_in_seconds, ) .order_by(ReviewSegment.start_time.desc()) ) diff --git a/frigate/test/http_api/test_http_review.py b/frigate/test/http_api/test_http_review.py index fc944d856..6239f6fa7 100644 --- a/frigate/test/http_api/test_http_review.py +++ b/frigate/test/http_api/test_http_review.py @@ -1,4 +1,4 @@ -import datetime +from datetime import datetime, timedelta from fastapi.testclient import TestClient @@ -18,7 +18,7 @@ class TestHttpReview(BaseTestHttp): # Does not return any data point since the end time (before parameter) is not passed and the review segment end_time is 2 seconds from now def test_get_review_no_filters_no_matches(self): - now = datetime.datetime.now().timestamp() + now = datetime.now().timestamp() with TestClient(self.app) as client: super().insert_mock_review_segment("123456.random", now, now + 2) @@ -28,7 +28,7 @@ class TestHttpReview(BaseTestHttp): assert len(reviews_in_response) == 0 def test_get_review_no_filters(self): - now = datetime.datetime.now().timestamp() + now = datetime.now().timestamp() with TestClient(self.app) as client: super().insert_mock_review_segment("123456.random", now - 2, now - 1) @@ -38,7 +38,7 @@ class TestHttpReview(BaseTestHttp): assert len(reviews_in_response) == 1 def test_get_review_with_time_filter_no_matches(self): - now = datetime.datetime.now().timestamp() + now = datetime.now().timestamp() with TestClient(self.app) as client: id = "123456.random" @@ -53,7 +53,7 @@ class TestHttpReview(BaseTestHttp): assert len(reviews_in_response) == 0 def test_get_review_with_time_filter(self): - now = datetime.datetime.now().timestamp() + now = datetime.now().timestamp() with TestClient(self.app) as client: id = "123456.random" @@ -69,7 +69,7 @@ class TestHttpReview(BaseTestHttp): assert reviews_in_response[0]["id"] == id def test_get_review_with_limit_filter(self): - now = datetime.datetime.now().timestamp() + now = datetime.now().timestamp() with TestClient(self.app) as client: id = "123456.random" @@ -88,7 +88,7 @@ class TestHttpReview(BaseTestHttp): assert reviews_in_response[0]["id"] == id2 def test_get_review_with_severity_filters_no_matches(self): - now = datetime.datetime.now().timestamp() + now = datetime.now().timestamp() with TestClient(self.app) as client: id = "123456.random" @@ -105,7 +105,7 @@ class TestHttpReview(BaseTestHttp): assert reviews_in_response[0]["id"] == id def test_get_review_with_severity_filters(self): - now = datetime.datetime.now().timestamp() + now = datetime.now().timestamp() with TestClient(self.app) as client: id = "123456.random" @@ -121,7 +121,7 @@ class TestHttpReview(BaseTestHttp): assert len(reviews_in_response) == 0 def test_get_review_with_all_filters(self): - now = datetime.datetime.now().timestamp() + now = datetime.now().timestamp() with TestClient(self.app) as client: id = "123456.random" @@ -158,21 +158,22 @@ class TestHttpReview(BaseTestHttp): review_summary_request = client.get("/review/summary", params=params) assert review_summary_request.status_code == 200 review_summary_response = review_summary_request.json() - today = datetime.date.today().strftime('%Y-%m-%d') # e.g. '2024-11-24' + # e.g. '2024-11-24' + today_formatted = datetime.date.today().strftime("%Y-%m-%d") expected_response = { - 'last24Hours': { - 'reviewed_alert': 0, - 'reviewed_detection': 0, - 'total_alert': 1, - 'total_detection': 0 + "last24Hours": { + "reviewed_alert": 0, + "reviewed_detection": 0, + "total_alert": 1, + "total_detection": 0, + }, + today_formatted: { + "day": today_formatted, + "reviewed_alert": 0, + "reviewed_detection": 0, + "total_alert": 1, + "total_detection": 0, }, - today: { - 'day': today, - 'reviewed_alert': 0, - 'reviewed_detection': 0, - 'total_alert': 1, - 'total_detection': 0 - } } self.assertEqual(review_summary_response, expected_response) @@ -182,20 +183,59 @@ class TestHttpReview(BaseTestHttp): review_summary_request = client.get("/review/summary") assert review_summary_request.status_code == 200 review_summary_response = review_summary_request.json() - today = datetime.date.today().strftime('%Y-%m-%d') # e.g. '2024-11-24' + # e.g. '2024-11-24' + today_formatted = datetime.date.today().strftime("%Y-%m-%d") expected_response = { - 'last24Hours': { - 'reviewed_alert': 0, - 'reviewed_detection': 0, - 'total_alert': 1, - 'total_detection': 0 + "last24Hours": { + "reviewed_alert": 0, + "reviewed_detection": 0, + "total_alert": 1, + "total_detection": 0, + }, + today_formatted: { + "day": today_formatted, + "reviewed_alert": 0, + "reviewed_detection": 0, + "total_alert": 1, + "total_detection": 0, }, - today: { - 'day': today, - 'reviewed_alert': 0, - 'reviewed_detection': 0, - 'total_alert': 1, - 'total_detection': 0 - } } - self.assertEqual(review_summary_response, expected_response) \ No newline at end of file + self.assertEqual(review_summary_response, expected_response) + + def test_get_review_summary_multiple_days(self): + now = datetime.now() + five_days_ago = datetime.today() - timedelta(days=5) + + with TestClient(self.app) as client: + super().insert_mock_review_segment("123456.random", now.timestamp() - 2, now.timestamp() - 1) + super().insert_mock_review_segment("654321.random", five_days_ago.timestamp(), five_days_ago.timestamp() + 1) + review_summary_request = client.get("/review/summary") + assert review_summary_request.status_code == 200 + review_summary_response = review_summary_request.json() + # e.g. '2024-11-24' + today_formatted = now.strftime("%Y-%m-%d") + # e.g. '2024-11-19' + five_days_ago_formatted = five_days_ago.strftime("%Y-%m-%d") + expected_response = { + "last24Hours": { + "reviewed_alert": 0, + "reviewed_detection": 0, + "total_alert": 1, + "total_detection": 0, + }, + today_formatted: { + "day": today_formatted, + "reviewed_alert": 0, + "reviewed_detection": 0, + "total_alert": 1, + "total_detection": 0, + }, + five_days_ago_formatted: { + "day": five_days_ago_formatted, + "reviewed_alert": 0, + "reviewed_detection": 0, + "total_alert": 1, + "total_detection": 0, + }, + } + self.assertEqual(review_summary_response, expected_response)