Improves signal handling and updates inbox tests

This commit is contained in:
Mouse Reeve 2021-03-23 08:53:28 -07:00
parent 1cf4c0d5cc
commit f290e60b85
2 changed files with 90 additions and 25 deletions

View file

@ -187,22 +187,34 @@ def add_status_on_create(sender, instance, created, *args, **kwargs):
if not issubclass(sender, models.Status): if not issubclass(sender, models.Status):
return return
if not created and instance.deleted: if instance.deleted:
for stream in streams.values(): for stream in streams.values():
stream.remove_status(instance) stream.remove_status(instance)
return return
if not created:
return
# iterates through Home, Local, Federated # iterates through Home, Local, Federated
for stream in streams.values(): for stream in streams.values():
stream.add_status(instance) stream.add_status(instance)
@receiver(signals.post_delete, sender=models.Boost)
# pylint: disable=unused-argument
def remove_boost_on_delete(sender, instance, *args, **kwargs):
""" boosts are deleted """
# we're only interested in new statuses
for stream in streams.values():
stream.remove_status(instance)
@receiver(signals.post_save, sender=models.UserFollows) @receiver(signals.post_save, sender=models.UserFollows)
# pylint: disable=unused-argument # pylint: disable=unused-argument
def add_statuses_on_follow(sender, instance, created, *args, **kwargs): def add_statuses_on_follow(sender, instance, created, *args, **kwargs):
""" add a newly followed user's statuses to feeds """ """ add a newly followed user's statuses to feeds """
if not created: if not created or not instance.user_subject.local:
return # idk when this would ever happen though return
HomeStream().add_user_statuses(instance.user_subject, instance.user_object) HomeStream().add_user_statuses(instance.user_subject, instance.user_object)
@ -210,6 +222,8 @@ def add_statuses_on_follow(sender, instance, created, *args, **kwargs):
# pylint: disable=unused-argument # pylint: disable=unused-argument
def remove_statuses_on_unfollow(sender, instance, *args, **kwargs): def remove_statuses_on_unfollow(sender, instance, *args, **kwargs):
""" remove statuses from a feed on unfollow """ """ remove statuses from a feed on unfollow """
if not instance.user_subject.local:
return
HomeStream().remove_user_statuses(instance.user_subject, instance.user_object) HomeStream().remove_user_statuses(instance.user_subject, instance.user_object)
@ -218,12 +232,32 @@ def remove_statuses_on_unfollow(sender, instance, *args, **kwargs):
def remove_statuses_on_block(sender, instance, *args, **kwargs): def remove_statuses_on_block(sender, instance, *args, **kwargs):
""" remove statuses from all feeds on block """ """ remove statuses from all feeds on block """
# blocks apply ot all feeds # blocks apply ot all feeds
if instance.user_subject.local:
for stream in streams.values(): for stream in streams.values():
# and in both directions
stream.remove_user_statuses(instance.user_subject, instance.user_object) stream.remove_user_statuses(instance.user_subject, instance.user_object)
# and in both directions
if instance.user_object.local:
for stream in streams.values():
stream.remove_user_statuses(instance.user_object, instance.user_subject) stream.remove_user_statuses(instance.user_object, instance.user_subject)
@receiver(signals.post_delete, sender=models.UserBlocks)
# pylint: disable=unused-argument
def add_statuses_on_unblock(sender, instance, *args, **kwargs):
""" remove statuses from all feeds on block """
public_streams = [LocalStream(), FederatedStream()]
# add statuses back to streams with statuses from anyone
if instance.user_subject.local:
for stream in public_streams:
stream.add_user_statuses(instance.user_subject, instance.user_object)
# add statuses back to streams with statuses from anyone
if instance.user_object.local:
for stream in public_streams:
stream.add_user_statuses(instance.user_object, instance.user_subject)
@receiver(signals.post_save, sender=models.User) @receiver(signals.post_save, sender=models.User)
# pylint: disable=unused-argument # pylint: disable=unused-argument
def populate_feed_on_account_create(sender, instance, created, *args, **kwargs): def populate_feed_on_account_create(sender, instance, created, *args, **kwargs):

View file

@ -38,6 +38,7 @@ class Inbox(TestCase):
outbox="https://example.com/users/rat/outbox", outbox="https://example.com/users/rat/outbox",
) )
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
with patch("bookwyrm.activitystreams.ActivityStream.add_status"):
self.status = models.Status.objects.create( self.status = models.Status.objects.create(
user=self.local_user, user=self.local_user,
content="Test status", content="Test status",
@ -139,7 +140,9 @@ class Inbox(TestCase):
activity = self.create_json activity = self.create_json
activity["object"] = status_data activity["object"] = status_data
with patch("bookwyrm.activitystreams.ActivityStream.add_status") as redis_mock:
views.inbox.activity_task(activity) views.inbox.activity_task(activity)
self.assertTrue(redis_mock.called)
status = models.Quotation.objects.get() status = models.Quotation.objects.get()
self.assertEqual( self.assertEqual(
@ -166,7 +169,9 @@ class Inbox(TestCase):
activity = self.create_json activity = self.create_json
activity["object"] = status_data activity["object"] = status_data
with patch("bookwyrm.activitystreams.ActivityStream.add_status") as redis_mock:
views.inbox.activity_task(activity) views.inbox.activity_task(activity)
self.assertTrue(redis_mock.called)
status = models.Status.objects.last() status = models.Status.objects.last()
self.assertEqual(status.content, "test content in note") self.assertEqual(status.content, "test content in note")
self.assertEqual(status.mention_users.first(), self.local_user) self.assertEqual(status.mention_users.first(), self.local_user)
@ -187,7 +192,9 @@ class Inbox(TestCase):
activity = self.create_json activity = self.create_json
activity["object"] = status_data activity["object"] = status_data
with patch("bookwyrm.activitystreams.ActivityStream.add_status") as redis_mock:
views.inbox.activity_task(activity) views.inbox.activity_task(activity)
self.assertTrue(redis_mock.called)
status = models.Status.objects.last() status = models.Status.objects.last()
self.assertEqual(status.content, "test content in note") self.assertEqual(status.content, "test content in note")
self.assertEqual(status.reply_parent, self.status) self.assertEqual(status.reply_parent, self.status)
@ -218,7 +225,7 @@ class Inbox(TestCase):
self.assertEqual(book_list.description, "summary text") self.assertEqual(book_list.description, "summary text")
self.assertEqual(book_list.remote_id, "https://example.com/list/22") self.assertEqual(book_list.remote_id, "https://example.com/list/22")
def test_handle_follow_x(self): def test_handle_follow(self):
""" remote user wants to follow local user """ """ remote user wants to follow local user """
activity = { activity = {
"@context": "https://www.w3.org/ns/activitystreams", "@context": "https://www.w3.org/ns/activitystreams",
@ -436,7 +443,11 @@ class Inbox(TestCase):
"actor": self.remote_user.remote_id, "actor": self.remote_user.remote_id,
"object": {"id": self.status.remote_id, "type": "Tombstone"}, "object": {"id": self.status.remote_id, "type": "Tombstone"},
} }
with patch(
"bookwyrm.activitystreams.ActivityStream.remove_status"
) as redis_mock:
views.inbox.activity_task(activity) views.inbox.activity_task(activity)
self.assertTrue(redis_mock.called)
# deletion doens't remove the status, it turns it into a tombstone # deletion doens't remove the status, it turns it into a tombstone
status = models.Status.objects.get() status = models.Status.objects.get()
self.assertTrue(status.deleted) self.assertTrue(status.deleted)
@ -465,7 +476,11 @@ class Inbox(TestCase):
"actor": self.remote_user.remote_id, "actor": self.remote_user.remote_id,
"object": {"id": self.status.remote_id, "type": "Tombstone"}, "object": {"id": self.status.remote_id, "type": "Tombstone"},
} }
with patch(
"bookwyrm.activitystreams.ActivityStream.remove_status"
) as redis_mock:
views.inbox.activity_task(activity) views.inbox.activity_task(activity)
self.assertTrue(redis_mock.called)
# deletion doens't remove the status, it turns it into a tombstone # deletion doens't remove the status, it turns it into a tombstone
status = models.Status.objects.get() status = models.Status.objects.get()
self.assertTrue(status.deleted) self.assertTrue(status.deleted)
@ -535,7 +550,8 @@ class Inbox(TestCase):
views.inbox.activity_task(activity) views.inbox.activity_task(activity)
self.assertEqual(models.Favorite.objects.count(), 0) self.assertEqual(models.Favorite.objects.count(), 0)
def test_handle_boost(self): @patch("bookwyrm.activitystreams.ActivityStream.add_status")
def test_handle_boost(self, _):
""" boost a status """ """ boost a status """
self.assertEqual(models.Notification.objects.count(), 0) self.assertEqual(models.Notification.objects.count(), 0)
activity = { activity = {
@ -560,6 +576,7 @@ class Inbox(TestCase):
content="hi", content="hi",
user=self.remote_user, user=self.remote_user,
) )
with patch("bookwyrm.activitystreams.ActivityStream.add_status"):
status.save(broadcast=False) status.save(broadcast=False)
activity = { activity = {
"type": "Announce", "type": "Announce",
@ -575,6 +592,7 @@ class Inbox(TestCase):
def test_handle_unboost(self): def test_handle_unboost(self):
""" undo a boost """ """ undo a boost """
with patch("bookwyrm.activitystreams.ActivityStream.add_status"):
boost = models.Boost.objects.create( boost = models.Boost.objects.create(
boosted_status=self.status, user=self.remote_user boosted_status=self.status, user=self.remote_user
) )
@ -591,7 +609,11 @@ class Inbox(TestCase):
"object": self.status.remote_id, "object": self.status.remote_id,
}, },
} }
with patch(
"bookwyrm.activitystreams.ActivityStream.remove_status"
) as redis_mock:
views.inbox.activity_task(activity) views.inbox.activity_task(activity)
self.assertTrue(redis_mock.called)
def test_handle_unboost_unknown_boost(self): def test_handle_unboost_unknown_boost(self):
""" undo a boost """ """ undo a boost """
@ -863,6 +885,11 @@ class Inbox(TestCase):
"object": "https://example.com/user/mouse", "object": "https://example.com/user/mouse",
} }
with patch(
"bookwyrm.activitystreams.ActivityStream.remove_user_statuses"
) as redis_mock:
views.inbox.activity_task(activity)
self.assertTrue(redis_mock.called)
views.inbox.activity_task(activity) views.inbox.activity_task(activity)
block = models.UserBlocks.objects.get() block = models.UserBlocks.objects.get()
self.assertEqual(block.user_subject, self.remote_user) self.assertEqual(block.user_subject, self.remote_user)
@ -896,5 +923,9 @@ class Inbox(TestCase):
"object": "https://example.com/user/mouse", "object": "https://example.com/user/mouse",
}, },
} }
with patch(
"bookwyrm.activitystreams.ActivityStream.add_user_statuses"
) as redis_mock:
views.inbox.activity_task(activity) views.inbox.activity_task(activity)
self.assertTrue(redis_mock.called)
self.assertFalse(models.UserBlocks.objects.exists()) self.assertFalse(models.UserBlocks.objects.exists())