From 48f002727aea18701a1d80378bf07509aa489f6d Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 30 Dec 2020 13:59:51 -0800 Subject: [PATCH 1/2] small change and test to get_user_from_username --- bookwyrm/tests/test_views.py | 12 ++++++++++++ bookwyrm/views.py | 8 ++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/bookwyrm/tests/test_views.py b/bookwyrm/tests/test_views.py index ba4531f6..2c4353b7 100644 --- a/bookwyrm/tests/test_views.py +++ b/bookwyrm/tests/test_views.py @@ -23,6 +23,18 @@ class Views(TestCase): connector_file='self_connector', local=True ) + self.local_user = models.User.objects.create_user( + 'mouse', 'mouse@mouse.mouse', 'password', local=True) + + + def test_get_user_from_username(self): + ''' works for either localname or username ''' + self.assertEqual( + views.get_user_from_username('mouse'), self.local_user) + self.assertEqual( + views.get_user_from_username('mouse@%s' % DOMAIN), self.local_user) + with self.assertRaises(models.User.DoesNotExist): + views.get_user_from_username('mojfse@example.com') def test_search_json_response(self): diff --git a/bookwyrm/views.py b/bookwyrm/views.py index 946c061b..df08ab18 100644 --- a/bookwyrm/views.py +++ b/bookwyrm/views.py @@ -13,7 +13,7 @@ from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_GET from bookwyrm import outgoing -from bookwyrm.activitypub import ActivityEncoder, ActivitypubResponse +from bookwyrm.activitypub import ActivitypubResponse from bookwyrm import forms, models, books_manager from bookwyrm import goodreads_import from bookwyrm.settings import PAGE_LENGTH @@ -23,11 +23,11 @@ from bookwyrm.utils import regex def get_user_from_username(username): ''' helper function to resolve a localname or a username to a user ''' + # raises DoesNotExist if user is now found try: - user = models.User.objects.get(localname=username) + return models.User.objects.get(localname=username) except models.User.DoesNotExist: - user = models.User.objects.get(username=username) - return user + return models.User.objects.get(username=username) def is_api_request(request): From 4e413a3779435c901751bfdb3880611faa23ea8a Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 30 Dec 2020 14:57:57 -0800 Subject: [PATCH 2/2] Adds tests for generating feeds --- bookwyrm/tests/test_views.py | 85 ++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/bookwyrm/tests/test_views.py b/bookwyrm/tests/test_views.py index 2c4353b7..1dff049a 100644 --- a/bookwyrm/tests/test_views.py +++ b/bookwyrm/tests/test_views.py @@ -25,6 +25,14 @@ class Views(TestCase): ) self.local_user = models.User.objects.create_user( 'mouse', 'mouse@mouse.mouse', 'password', local=True) + 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', + ) def test_get_user_from_username(self): @@ -37,6 +45,83 @@ class Views(TestCase): views.get_user_from_username('mojfse@example.com') + def test_is_api_request(self): + ''' should it return html or json ''' + request = self.factory.get('/path') + request.headers = {'Accept': 'application/json'} + self.assertTrue(views.is_api_request(request)) + + request = self.factory.get('/path.json') + request.headers = {'Accept': 'Praise'} + self.assertTrue(views.is_api_request(request)) + + request = self.factory.get('/path') + request.headers = {'Accept': 'Praise'} + self.assertFalse(views.is_api_request(request)) + + + def test_get_activity_feed(self): + ''' loads statuses ''' + rat = models.User.objects.create_user( + 'rat', 'rat@rat.rat', 'password', local=True) + + public_status = models.Comment.objects.create( + content='public status', book=self.book, user=self.local_user) + direct_status = models.Status.objects.create( + content='direct', user=self.local_user, privacy='direct') + + rat_public = models.Status.objects.create( + content='blah blah', user=rat) + rat_unlisted = models.Status.objects.create( + content='blah blah', user=rat, privacy='unlisted') + remote_status = models.Status.objects.create( + content='blah blah', user=self.remote_user) + followers_status = models.Status.objects.create( + content='blah', user=rat, privacy='followers') + rat_mention = models.Status.objects.create( + content='blah blah blah', user=rat, privacy='followers') + rat_mention.mention_users.set([self.local_user]) + + statuses = views.get_activity_feed(self.local_user, 'home') + self.assertEqual(len(statuses), 2) + self.assertEqual(statuses[1], public_status) + self.assertEqual(statuses[0], rat_mention) + + statuses = views.get_activity_feed( + self.local_user, 'home', model=models.Comment) + self.assertEqual(len(statuses), 1) + self.assertEqual(statuses[0], public_status) + + statuses = views.get_activity_feed(self.local_user, 'local') + self.assertEqual(len(statuses), 2) + self.assertEqual(statuses[1], public_status) + self.assertEqual(statuses[0], rat_public) + + statuses = views.get_activity_feed(self.local_user, 'direct') + self.assertEqual(len(statuses), 1) + self.assertEqual(statuses[0], direct_status) + + statuses = views.get_activity_feed(self.local_user, 'federated') + self.assertEqual(len(statuses), 3) + self.assertEqual(statuses[2], public_status) + self.assertEqual(statuses[1], rat_public) + self.assertEqual(statuses[0], remote_status) + + statuses = views.get_activity_feed(self.local_user, 'friends') + self.assertEqual(len(statuses), 2) + self.assertEqual(statuses[1], public_status) + self.assertEqual(statuses[0], rat_mention) + + rat.followers.add(self.local_user) + statuses = views.get_activity_feed(self.local_user, 'friends') + self.assertEqual(len(statuses), 5) + self.assertEqual(statuses[4], public_status) + self.assertEqual(statuses[3], rat_public) + self.assertEqual(statuses[2], rat_unlisted) + self.assertEqual(statuses[1], followers_status) + self.assertEqual(statuses[0], rat_mention) + + def test_search_json_response(self): ''' searches local data only and returns book data in json format ''' # we need a connector for this, sorry