diff --git a/bookwyrm/tests/models/test_list.py b/bookwyrm/tests/models/test_list.py index de6957b57..f7e64c6f2 100644 --- a/bookwyrm/tests/models/test_list.py +++ b/bookwyrm/tests/models/test_list.py @@ -7,6 +7,7 @@ from bookwyrm import models, settings @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") +@patch("bookwyrm.lists_stream.remove_list_task.delay") class List(TestCase): """some activitypub oddness ahead""" @@ -21,25 +22,15 @@ class List(TestCase): work = models.Work.objects.create(title="hello") self.book = models.Edition.objects.create(title="hi", parent_work=work) - def test_remote_id(self, _): + def test_remote_id(self, *_): """shelves use custom remote ids""" - with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" - ), patch("bookwyrm.lists_stream.remove_list_task.delay"): - book_list = models.List.objects.create( - name="Test List", user=self.local_user - ) + book_list = models.List.objects.create(name="Test List", user=self.local_user) expected_id = f"https://{settings.DOMAIN}/list/{book_list.id}" self.assertEqual(book_list.get_remote_id(), expected_id) - def test_to_activity(self, _): + def test_to_activity(self, *_): """jsonify it""" - with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" - ), patch("bookwyrm.lists_stream.remove_list_task.delay"): - book_list = models.List.objects.create( - name="Test List", user=self.local_user - ) + book_list = models.List.objects.create(name="Test List", user=self.local_user) activity_json = book_list.to_activity() self.assertIsInstance(activity_json, dict) self.assertEqual(activity_json["id"], book_list.remote_id) @@ -48,14 +39,11 @@ class List(TestCase): self.assertEqual(activity_json["name"], "Test List") self.assertEqual(activity_json["owner"], self.local_user.remote_id) - def test_list_item(self, _): + def test_list_item(self, *_): """a list entry""" - with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" - ), patch("bookwyrm.lists_stream.remove_list_task.delay"): - book_list = models.List.objects.create( - name="Test List", user=self.local_user, privacy="unlisted" - ) + book_list = models.List.objects.create( + name="Test List", user=self.local_user, privacy="unlisted" + ) item = models.ListItem.objects.create( book_list=book_list, @@ -68,14 +56,9 @@ class List(TestCase): self.assertEqual(item.privacy, "unlisted") self.assertEqual(item.recipients, []) - def test_list_item_pending(self, _): + def test_list_item_pending(self, *_): """a list entry""" - with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" - ), patch("bookwyrm.lists_stream.remove_list_task.delay"): - book_list = models.List.objects.create( - name="Test List", user=self.local_user - ) + book_list = models.List.objects.create(name="Test List", user=self.local_user) item = models.ListItem.objects.create( book_list=book_list, @@ -90,13 +73,8 @@ class List(TestCase): self.assertEqual(item.privacy, "direct") self.assertEqual(item.recipients, []) - def test_embed_key(self, _): + def test_embed_key(self, *_): """embed_key should never be empty""" - with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" - ), patch("bookwyrm.lists_stream.remove_list_task.delay"): - book_list = models.List.objects.create( - name="Test List", user=self.local_user - ) + book_list = models.List.objects.create(name="Test List", user=self.local_user) self.assertIsInstance(book_list.embed_key, UUID) diff --git a/bookwyrm/tests/models/test_notification.py b/bookwyrm/tests/models/test_notification.py new file mode 100644 index 000000000..0c16741e1 --- /dev/null +++ b/bookwyrm/tests/models/test_notification.py @@ -0,0 +1,139 @@ +""" testing models """ +from unittest.mock import patch +from django.test import TestCase +from bookwyrm import models + + +class Notification(TestCase): + """let people know things""" + + def setUp(self): # pylint: disable=invalid-name + """useful things for creating a notification""" + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): + self.local_user = models.User.objects.create_user( + "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse" + ) + self.another_user = models.User.objects.create_user( + "rat", "rat@rat.rat", "ratword", local=True, localname="rat" + ) + with patch("bookwyrm.models.user.set_remote_server.delay"): + self.remote_user = models.User.objects.create_user( + "rat", + "rat@rat.com", + "ratword", + local=False, + remote_id="https://example.com/users/rat", + inbox="https://example.com/users/rat/inbox", + outbox="https://example.com/users/rat/outbox", + ) + self.work = models.Work.objects.create(title="Test Work") + self.book = models.Edition.objects.create( + title="Test Book", + isbn_13="1234567890123", + remote_id="https://example.com/book/1", + parent_work=self.work, + ) + self.another_book = models.Edition.objects.create( + title="Second Test Book", + parent_work=models.Work.objects.create(title="Test Work"), + ) + + def test_notification(self): + """New notifications are unread""" + notification = models.Notification.objects.create( + user=self.local_user, notification_type=models.Notification.FAVORITE + ) + self.assertFalse(notification.read) + + def test_notify(self): + """Create a notification""" + models.Notification.notify( + self.local_user, + self.remote_user, + notification_type=models.Notification.FAVORITE, + ) + self.assertTrue(models.Notification.objects.exists()) + + def test_notify_grouping(self): + """Bundle notifications""" + models.Notification.notify( + self.local_user, + self.remote_user, + notification_type=models.Notification.FAVORITE, + ) + self.assertEqual(models.Notification.objects.count(), 1) + notification = models.Notification.objects.get() + self.assertEqual(notification.related_users.count(), 1) + + models.Notification.notify( + self.local_user, + self.another_user, + notification_type=models.Notification.FAVORITE, + ) + self.assertEqual(models.Notification.objects.count(), 1) + notification.refresh_from_db() + self.assertEqual(notification.related_users.count(), 2) + + def test_notify_remote(self): + """Don't create notifications for remote users""" + models.Notification.notify( + self.remote_user, + self.local_user, + notification_type=models.Notification.FAVORITE, + ) + self.assertFalse(models.Notification.objects.exists()) + + def test_notify_self(self): + """Don't create notifications for yourself""" + models.Notification.notify( + self.local_user, + self.local_user, + notification_type=models.Notification.FAVORITE, + ) + self.assertFalse(models.Notification.objects.exists()) + + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") + @patch("bookwyrm.lists_stream.remove_list_task.delay") + def test_notify_list_item_own_list(self, *_): + """Don't add list item notification for your own list""" + test_list = models.List.objects.create(user=self.local_user, name="hi") + + models.ListItem.objects.create( + user=self.local_user, book=self.book, book_list=test_list, order=1 + ) + self.assertFalse(models.Notification.objects.exists()) + + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") + @patch("bookwyrm.lists_stream.remove_list_task.delay") + def test_notify_list_item_remote(self, *_): + """Don't add list item notification for a remote user""" + test_list = models.List.objects.create(user=self.remote_user, name="hi") + + models.ListItem.objects.create( + user=self.local_user, book=self.book, book_list=test_list, order=1 + ) + self.assertFalse(models.Notification.objects.exists()) + + @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") + @patch("bookwyrm.lists_stream.remove_list_task.delay") + def test_notify_list_item(self, *_): + """Add list item notification""" + test_list = models.List.objects.create(user=self.local_user, name="hi") + list_item = models.ListItem.objects.create( + user=self.remote_user, book=self.book, book_list=test_list, order=2 + ) + notification = models.Notification.objects.get() + self.assertEqual(notification.related_users.count(), 1) + self.assertEqual(notification.related_users.first(), self.remote_user) + self.assertEqual(notification.related_list_items.count(), 1) + self.assertEqual(notification.related_list_items.first(), list_item) + + models.ListItem.objects.create( + user=self.remote_user, book=self.another_book, book_list=test_list, order=3 + ) + notification = models.Notification.objects.get() + self.assertEqual(notification.related_users.count(), 1) + self.assertEqual(notification.related_users.first(), self.remote_user) + self.assertEqual(notification.related_list_items.count(), 2) diff --git a/bookwyrm/tests/models/test_status_model.py b/bookwyrm/tests/models/test_status_model.py index 2f1e8670f..aae34b0a5 100644 --- a/bookwyrm/tests/models/test_status_model.py +++ b/bookwyrm/tests/models/test_status_model.py @@ -394,18 +394,6 @@ class Status(TestCase): self.assertEqual(activity["type"], "Announce") self.assertEqual(activity, boost.to_activity(pure=True)) - def test_notification(self, *_): - """a simple model""" - notification = models.Notification.objects.create( - user=self.local_user, notification_type="FAVORITE" - ) - self.assertFalse(notification.read) - - with self.assertRaises(IntegrityError): - models.Notification.objects.create( - user=self.local_user, notification_type="GLORB" - ) - # pylint: disable=unused-argument def test_create_broadcast(self, one, two, broadcast_mock, *_): """should send out two verions of a status on create"""