11import pytest
2+ from django .core import mail
23from rest_framework import status
34from rest_framework .test import APIClient
45
6+ from trcustoms .audit_logs .consts import ChangeType
7+ from trcustoms .audit_logs .models import AuditLog
58from trcustoms .levels .tests .factories import LevelFactory
69from trcustoms .reviews .models import Review
710from trcustoms .reviews .tests .factories import ReviewFactory
@@ -17,6 +20,7 @@ def test_review_deletion_updates_level_review_count(
1720
1821 response = staff_api_client .delete (
1922 f"/api/reviews/{ review .id } /" ,
23+ data = {"reason" : "Off-topic content." },
2024 format = "json" ,
2125 )
2226 level .refresh_from_db ()
@@ -45,6 +49,7 @@ def test_review_deletion_updates_position(
4549
4650 staff_api_client .delete (
4751 f"/api/reviews/{ review2 .id } /" ,
52+ data = {"reason" : "Duplicate review." },
4853 format = "json" ,
4954 )
5055 review1 .refresh_from_db ()
@@ -55,3 +60,64 @@ def test_review_deletion_updates_position(
5560 assert review1 .last_updated == review1_last_updated
5661 assert review3 .last_updated == review3_last_updated
5762 assert not Review .objects .filter (pk = review2 .pk ).exists ()
63+
64+
65+ @pytest .mark .django_db
66+ def test_review_deletion_requires_reason (
67+ staff_api_client : APIClient ,
68+ ) -> None :
69+ review = ReviewFactory ()
70+
71+ response = staff_api_client .delete (
72+ f"/api/reviews/{ review .id } /" ,
73+ data = {},
74+ format = "json" ,
75+ )
76+
77+ assert (
78+ response .status_code == status .HTTP_400_BAD_REQUEST
79+ ), response .content
80+ assert Review .objects .filter (pk = review .pk ).exists ()
81+
82+
83+ @pytest .mark .django_db
84+ def test_review_deletion_sends_reason_email (
85+ staff_api_client : APIClient ,
86+ ) -> None :
87+ review = ReviewFactory (
88+ author = UserFactory (email = "reviewer@example.com" , username = "reviewer" )
89+ )
90+
91+ response = staff_api_client .delete (
92+ f"/api/reviews/{ review .id } /" ,
93+ data = {"reason" : "Contains harassment." },
94+ format = "json" ,
95+ )
96+
97+ assert response .status_code == status .HTTP_204_NO_CONTENT , response .content
98+ assert len (mail .outbox ) == 1
99+ assert mail .outbox [0 ].subject == "[TRCustoms] Review removed"
100+ assert mail .outbox [0 ].to == ["reviewer@example.com" ]
101+ assert "Contains harassment." in mail .outbox [0 ].body
102+ assert review .level .name in mail .outbox [0 ].body
103+
104+
105+ @pytest .mark .django_db
106+ def test_review_deletion_creates_audit_log (
107+ staff_api_client : APIClient ,
108+ ) -> None :
109+ review = ReviewFactory ()
110+
111+ response = staff_api_client .delete (
112+ f"/api/reviews/{ review .id } /" ,
113+ data = {"reason" : "Spam." },
114+ format = "json" ,
115+ )
116+
117+ audit_log = AuditLog .objects .first ()
118+
119+ assert response .status_code == status .HTTP_204_NO_CONTENT , response .content
120+ assert audit_log
121+ assert audit_log .change_type == ChangeType .DELETE
122+ assert audit_log .object_id == str (review .id )
123+ assert audit_log .object_name == review .level .name
0 commit comments