|
| 1 | +from django.contrib.contenttypes.models import ContentType |
| 2 | +from django.test import override_settings |
| 3 | +from django.utils import timezone |
| 4 | + |
| 5 | +from feed.models import FeedEntry |
| 6 | +from feed.serializers import serialize_feed_item |
| 7 | +from feed.tasks import create_feed_entry |
| 8 | +from paper.related_models.paper_model import Paper |
| 9 | +from researchhub_comment.constants.rh_comment_thread_types import PEER_REVIEW |
| 10 | +from researchhub_comment.related_models.rh_comment_model import RhCommentModel |
| 11 | +from researchhub_comment.related_models.rh_comment_thread_model import ( |
| 12 | + RhCommentThreadModel, |
| 13 | +) |
| 14 | +from review.models.review_model import Review |
| 15 | +from user.models import User |
| 16 | +from utils.test_helpers import AWSMockTestCase |
| 17 | + |
| 18 | + |
| 19 | +@override_settings(CELERY_TASK_ALWAYS_EAGER=True, CELERY_TASK_EAGER_PROPAGATES=True) |
| 20 | +class ReviewSignalsTests(AWSMockTestCase): |
| 21 | + |
| 22 | + def setUp(self): |
| 23 | + super().setUp() |
| 24 | + self.user = User.objects.create_user(username="reviewer") |
| 25 | + self.paper = Paper.objects.create(title="Test Paper") |
| 26 | + self.unified_document = self.paper.unified_document |
| 27 | + |
| 28 | + paper_ct = ContentType.objects.get_for_model(Paper) |
| 29 | + self.thread = RhCommentThreadModel.objects.create( |
| 30 | + thread_type=PEER_REVIEW, |
| 31 | + content_type=paper_ct, |
| 32 | + object_id=self.paper.id, |
| 33 | + created_by=self.user, |
| 34 | + ) |
| 35 | + self.comment = RhCommentModel.objects.create( |
| 36 | + comment_content_json={"ops": [{"insert": "review comment"}]}, |
| 37 | + comment_type=PEER_REVIEW, |
| 38 | + created_by=self.user, |
| 39 | + thread=self.thread, |
| 40 | + ) |
| 41 | + |
| 42 | + # Create the comment's feed entry (with review: null in cached content) |
| 43 | + comment_ct = ContentType.objects.get_for_model(RhCommentModel) |
| 44 | + self.comment_entry = create_feed_entry( |
| 45 | + item_id=self.comment.id, |
| 46 | + item_content_type_id=comment_ct.id, |
| 47 | + action=FeedEntry.PUBLISH, |
| 48 | + user_id=self.user.id, |
| 49 | + ) |
| 50 | + |
| 51 | + def test_comment_feed_entry_includes_review_after_review_created(self): |
| 52 | + """ |
| 53 | + Creating a review should refresh the comment's feed entry so its content |
| 54 | + includes the review score. |
| 55 | + """ |
| 56 | + # Arrange |
| 57 | + self.assertIsNone(self.comment_entry.content.get("review")) |
| 58 | + comment_ct = ContentType.objects.get_for_model(RhCommentModel) |
| 59 | + |
| 60 | + # Act |
| 61 | + Review.objects.create( |
| 62 | + score=4.0, |
| 63 | + created_by=self.user, |
| 64 | + content_type=comment_ct, |
| 65 | + object_id=self.comment.id, |
| 66 | + unified_document=self.unified_document, |
| 67 | + ) |
| 68 | + |
| 69 | + # Assert |
| 70 | + self.comment_entry.refresh_from_db() |
| 71 | + review_data = self.comment_entry.content.get("review") |
| 72 | + self.assertIsNotNone(review_data) |
| 73 | + self.assertEqual(review_data["score"], 4.0) |
| 74 | + |
| 75 | + def test_document_feed_entry_updates_reviews_after_review_created(self): |
| 76 | + """ |
| 77 | + Creating a review should refresh the document's feed entry so document-level |
| 78 | + review data stays current. |
| 79 | + """ |
| 80 | + # Arrange |
| 81 | + paper_ct = ContentType.objects.get_for_model(Paper) |
| 82 | + document_entry = FeedEntry.objects.create( |
| 83 | + content_type=paper_ct, |
| 84 | + object_id=self.paper.id, |
| 85 | + unified_document=self.unified_document, |
| 86 | + user=self.user, |
| 87 | + action=FeedEntry.PUBLISH, |
| 88 | + action_date=timezone.now(), |
| 89 | + content=serialize_feed_item(self.paper, paper_ct), |
| 90 | + metrics={}, |
| 91 | + ) |
| 92 | + self.assertEqual(document_entry.content.get("reviews"), []) |
| 93 | + comment_ct = ContentType.objects.get_for_model(RhCommentModel) |
| 94 | + |
| 95 | + # Act |
| 96 | + Review.objects.create( |
| 97 | + score=4.0, |
| 98 | + created_by=self.user, |
| 99 | + content_type=comment_ct, |
| 100 | + object_id=self.comment.id, |
| 101 | + unified_document=self.unified_document, |
| 102 | + ) |
| 103 | + |
| 104 | + # Assert |
| 105 | + document_entry.refresh_from_db() |
| 106 | + reviews = document_entry.content.get("reviews") |
| 107 | + self.assertEqual(len(reviews), 1) |
| 108 | + self.assertEqual(reviews[0]["score"], 4.0) |
| 109 | + |
| 110 | + def test_review_without_unified_document_does_not_refresh(self): |
| 111 | + """ |
| 112 | + Reviews without a unified document should not update any feed entries. |
| 113 | + """ |
| 114 | + # Arrange |
| 115 | + original_content = dict(self.comment_entry.content) |
| 116 | + comment_ct = ContentType.objects.get_for_model(RhCommentModel) |
| 117 | + |
| 118 | + # Act |
| 119 | + Review.objects.create( |
| 120 | + score=3.0, |
| 121 | + created_by=self.user, |
| 122 | + content_type=comment_ct, |
| 123 | + object_id=self.comment.id, |
| 124 | + unified_document=None, |
| 125 | + ) |
| 126 | + |
| 127 | + # Assert |
| 128 | + self.comment_entry.refresh_from_db() |
| 129 | + self.assertEqual(self.comment_entry.content, original_content) |
0 commit comments