Skip to content

Commit d3acac0

Browse files
authored
Merge pull request #3207 from ResearchHub/update-peer-reviews
Update feed entries for comments associated with a review
2 parents 050123f + eddb4ae commit d3acac0

File tree

2 files changed

+140
-0
lines changed

2 files changed

+140
-0
lines changed

src/feed/signals/review_signals.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,14 @@ def _update_feed_entries(review):
5353
args=(entry.id,),
5454
priority=1,
5555
)
56+
57+
# Refresh the reviewed comment's feed entry (to include the latest review score)
58+
if review.content_type and review.object_id:
59+
comment_feed_entries = FeedEntry.objects.filter(
60+
content_type=review.content_type, object_id=review.object_id
61+
)
62+
for entry in comment_feed_entries:
63+
refresh_feed_entry_by_id.apply_async(
64+
args=(entry.id,),
65+
priority=1,
66+
)
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
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

Comments
 (0)