From 6c80b128a40dcf0df47714dad49c59a70b3b2e43 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 12 Jan 2021 14:02:38 -0800 Subject: [PATCH] Adds status tests --- .../templates/snippets/create_status.html | 2 +- .../snippets/create_status_form.html | 6 +- bookwyrm/templates/snippets/reply_form.html | 2 +- bookwyrm/templatetags/bookwyrm_tags.py | 2 +- bookwyrm/tests/test_outgoing.py | 163 ------------ bookwyrm/tests/views/test_status.py | 242 ++++++++++++++++++ bookwyrm/views/status.py | 6 +- 7 files changed, 252 insertions(+), 171 deletions(-) create mode 100644 bookwyrm/tests/views/test_status.py diff --git a/bookwyrm/templates/snippets/create_status.html b/bookwyrm/templates/snippets/create_status.html index ac8c0b75..02239e2f 100644 --- a/bookwyrm/templates/snippets/create_status.html +++ b/bookwyrm/templates/snippets/create_status.html @@ -39,5 +39,5 @@
- {% include 'snippets/create_status_form.html' with type="quote" placeholder="An excerpt from '"|add:book.title|add:"'" %} + {% include 'snippets/create_status_form.html' with type="quotation" placeholder="An excerpt from '"|add:book.title|add:"'" %}
diff --git a/bookwyrm/templates/snippets/create_status_form.html b/bookwyrm/templates/snippets/create_status_form.html index c34aa348..e8540721 100644 --- a/bookwyrm/templates/snippets/create_status_form.html +++ b/bookwyrm/templates/snippets/create_status_form.html @@ -9,7 +9,7 @@ {% endif %}
- + {% if type == 'review' %}
@@ -29,14 +29,14 @@ {% include 'snippets/content_warning_field.html' %} - {% if type == 'quote' %} + {% if type == 'quotation' %} {% else %} {% endif %}
- {% if type == 'quote' %} + {% if type == 'quotation' %}
diff --git a/bookwyrm/templates/snippets/reply_form.html b/bookwyrm/templates/snippets/reply_form.html index bf1f0259..de938bcc 100644 --- a/bookwyrm/templates/snippets/reply_form.html +++ b/bookwyrm/templates/snippets/reply_form.html @@ -1,6 +1,6 @@ {% load bookwyrm_tags %} {% with status.id|uuid as uuid %} -
+
{% csrf_token %} diff --git a/bookwyrm/templatetags/bookwyrm_tags.py b/bookwyrm/templatetags/bookwyrm_tags.py index d774a079..c58f5c47 100644 --- a/bookwyrm/templatetags/bookwyrm_tags.py +++ b/bookwyrm/templatetags/bookwyrm_tags.py @@ -7,7 +7,7 @@ from django import template from django.utils import timezone from bookwyrm import models -from bookwyrm.outgoing import to_markdown +from bookwyrm.views.status import to_markdown register = template.Library() diff --git a/bookwyrm/tests/test_outgoing.py b/bookwyrm/tests/test_outgoing.py index 67599673..192db0dd 100644 --- a/bookwyrm/tests/test_outgoing.py +++ b/bookwyrm/tests/test_outgoing.py @@ -444,169 +444,6 @@ class Outgoing(TestCase): self.assertTrue(status.deleted) - def test_handle_status(self): - ''' create a status ''' - form = forms.CommentForm({ - 'content': 'hi', - 'user': self.local_user.id, - 'book': self.book.id, - 'privacy': 'public', - }) - with patch('bookwyrm.broadcast.broadcast_task.delay'): - outgoing.handle_status(self.local_user, form) - status = models.Comment.objects.get() - self.assertEqual(status.content, '

hi

') - self.assertEqual(status.user, self.local_user) - self.assertEqual(status.book, self.book) - - def test_handle_status_reply(self): - ''' create a status in reply to an existing status ''' - user = models.User.objects.create_user( - 'rat', 'rat@rat.com', 'password', local=True) - parent = models.Status.objects.create( - content='parent status', user=self.local_user) - form = forms.ReplyForm({ - 'content': 'hi', - 'user': user.id, - 'reply_parent': parent.id, - 'privacy': 'public', - }) - with patch('bookwyrm.broadcast.broadcast_task.delay'): - outgoing.handle_status(user, form) - status = models.Status.objects.get(user=user) - self.assertEqual(status.content, '

hi

') - self.assertEqual(status.user, user) - self.assertEqual( - models.Notification.objects.get().user, self.local_user) - - def test_handle_status_mentions(self): - ''' @mention a user in a post ''' - user = models.User.objects.create_user( - 'rat@%s' % DOMAIN, 'rat@rat.com', 'password', - local=True, localname='rat') - form = forms.CommentForm({ - 'content': 'hi @rat', - 'user': self.local_user.id, - 'book': self.book.id, - 'privacy': 'public', - }) - - with patch('bookwyrm.broadcast.broadcast_task.delay'): - outgoing.handle_status(self.local_user, form) - status = models.Status.objects.get() - self.assertEqual(list(status.mention_users.all()), [user]) - self.assertEqual(models.Notification.objects.get().user, user) - self.assertEqual( - status.content, - '

hi @rat

' % user.remote_id) - - def test_handle_status_reply_with_mentions(self): - ''' reply to a post with an @mention'ed user ''' - user = models.User.objects.create_user( - 'rat', 'rat@rat.com', 'password', - local=True, localname='rat') - form = forms.CommentForm({ - 'content': 'hi @rat@example.com', - 'user': self.local_user.id, - 'book': self.book.id, - 'privacy': 'public', - }) - - with patch('bookwyrm.broadcast.broadcast_task.delay'): - outgoing.handle_status(self.local_user, form) - status = models.Status.objects.get() - - form = forms.ReplyForm({ - 'content': 'right', - 'user': user, - 'privacy': 'public', - 'reply_parent': status.id - }) - with patch('bookwyrm.broadcast.broadcast_task.delay'): - outgoing.handle_status(user, form) - - reply = models.Status.replies(status).first() - self.assertEqual(reply.content, '

right

') - self.assertEqual(reply.user, user) - self.assertTrue(self.remote_user in reply.mention_users.all()) - self.assertTrue(self.local_user in reply.mention_users.all()) - - def test_find_mentions(self): - ''' detect and look up @ mentions of users ''' - user = models.User.objects.create_user( - 'nutria@%s' % DOMAIN, 'nutria@nutria.com', 'password', - local=True, localname='nutria') - self.assertEqual(user.username, 'nutria@%s' % DOMAIN) - - self.assertEqual( - list(outgoing.find_mentions('@nutria'))[0], - ('@nutria', user) - ) - self.assertEqual( - list(outgoing.find_mentions('leading text @nutria'))[0], - ('@nutria', user) - ) - self.assertEqual( - list(outgoing.find_mentions('leading @nutria trailing text'))[0], - ('@nutria', user) - ) - self.assertEqual( - list(outgoing.find_mentions('@rat@example.com'))[0], - ('@rat@example.com', self.remote_user) - ) - - multiple = list(outgoing.find_mentions('@nutria and @rat@example.com')) - self.assertEqual(multiple[0], ('@nutria', user)) - self.assertEqual(multiple[1], ('@rat@example.com', self.remote_user)) - - with patch('bookwyrm.outgoing.handle_remote_webfinger') as rw: - rw.return_value = self.local_user - self.assertEqual( - list(outgoing.find_mentions('@beep@beep.com'))[0], - ('@beep@beep.com', self.local_user) - ) - with patch('bookwyrm.outgoing.handle_remote_webfinger') as rw: - rw.return_value = None - self.assertEqual(list(outgoing.find_mentions('@beep@beep.com')), []) - - self.assertEqual( - list(outgoing.find_mentions('@nutria@%s' % DOMAIN))[0], - ('@nutria@%s' % DOMAIN, user) - ) - - def test_format_links(self): - ''' find and format urls into a tags ''' - url = 'http://www.fish.com/' - self.assertEqual( - outgoing.format_links(url), - 'www.fish.com/' % url) - self.assertEqual( - outgoing.format_links('(%s)' % url), - '(www.fish.com/)' % url) - url = 'https://archive.org/details/dli.granth.72113/page/n25/mode/2up' - self.assertEqual( - outgoing.format_links(url), - '' \ - 'archive.org/details/dli.granth.72113/page/n25/mode/2up' \ - % url) - url = 'https://openlibrary.org/search' \ - '?q=arkady+strugatsky&mode=everything' - self.assertEqual( - outgoing.format_links(url), - 'openlibrary.org/search' \ - '?q=arkady+strugatsky&mode=everything' % url) - - - def test_to_markdown(self): - ''' this is mostly handled in other places, but nonetheless ''' - text = '_hi_ and http://fish.com is rad' - result = outgoing.to_markdown(text) - self.assertEqual( - result, - '

hi and fish.com ' \ - 'is rad

') - - def test_handle_favorite(self): ''' create and broadcast faving a status ''' status = models.Status.objects.create( diff --git a/bookwyrm/tests/views/test_status.py b/bookwyrm/tests/views/test_status.py new file mode 100644 index 00000000..e3d46178 --- /dev/null +++ b/bookwyrm/tests/views/test_status.py @@ -0,0 +1,242 @@ +''' test for app action functionality ''' +from unittest.mock import patch +from django.template.response import TemplateResponse +from django.test import TestCase +from django.test.client import RequestFactory + +from bookwyrm import forms, models, views +from bookwyrm.activitypub import ActivitypubResponse +from bookwyrm.settings import DOMAIN + + +class StatusViews(TestCase): + ''' viewing and creating statuses ''' + def setUp(self): + ''' we need basic test data and mocks ''' + self.factory = RequestFactory() + self.local_user = models.User.objects.create_user( + 'mouse@local.com', 'mouse@mouse.mouse', 'password', + local=True, localname='mouse') + + + def test_status_page(self): + ''' there are so many views, this just makes sure it LOADS ''' + view = views.Status.as_view() + status = models.Status.objects.create( + content='hi', user=self.local_user) + request = self.factory.get('') + request.user = self.local_user + with patch('bookwyrm.views.is_api_request') as is_api: + is_api.return_value = False + result = view(request, 'mouse', status.id) + self.assertIsInstance(result, TemplateResponse) + self.assertEqual(result.template_name, 'status.html') + self.assertEqual(result.status_code, 200) + + with patch('bookwyrm.views.is_api_request') as is_api: + is_api.return_value = True + result = view(request, 'mouse', status.id) + self.assertIsInstance(result, ActivitypubResponse) + self.assertEqual(result.status_code, 200) + + + def test_replies_page(self): + ''' there are so many views, this just makes sure it LOADS ''' + view = views.Replies.as_view() + status = models.Status.objects.create( + content='hi', user=self.local_user) + request = self.factory.get('') + request.user = self.local_user + with patch('bookwyrm.views.status.is_api_request') as is_api: + is_api.return_value = False + result = view(request, 'mouse', status.id) + self.assertIsInstance(result, TemplateResponse) + self.assertEqual(result.template_name, 'status.html') + self.assertEqual(result.status_code, 200) + + with patch('bookwyrm.views.is_api_request') as is_api: + is_api.return_value = True + result = view(request, 'mouse', status.id) + self.assertIsInstance(result, ActivitypubResponse) + self.assertEqual(result.status_code, 200) + + + def test_handle_status(self): + ''' create a status ''' + view = views.CreateStatus.as_view() + form = forms.CommentForm({ + 'content': 'hi', + 'user': self.local_user.id, + 'book': self.book.id, + 'privacy': 'public', + }) + request = self.factory.get('', form.data) + request.user = self.local_user + with patch('bookwyrm.broadcast.broadcast_task.delay'): + view(request, 'comment') + status = models.Comment.objects.get() + self.assertEqual(status.content, '

hi

') + self.assertEqual(status.user, self.local_user) + self.assertEqual(status.book, self.book) + + def test_handle_status_reply(self): + ''' create a status in reply to an existing status ''' + view = views.CreateStatus.as_view() + user = models.User.objects.create_user( + 'rat', 'rat@rat.com', 'password', local=True) + parent = models.Status.objects.create( + content='parent status', user=self.local_user) + form = forms.ReplyForm({ + 'content': 'hi', + 'user': user.id, + 'reply_parent': parent.id, + 'privacy': 'public', + }) + request = self.factory.get('', form.data) + request.user = self.local_user + with patch('bookwyrm.broadcast.broadcast_task.delay'): + view(request, 'reply') + status = models.Status.objects.get(user=user) + self.assertEqual(status.content, '

hi

') + self.assertEqual(status.user, user) + self.assertEqual( + models.Notification.objects.get().user, self.local_user) + + def test_handle_status_mentions(self): + ''' @mention a user in a post ''' + view = views.CreateStatus.as_view() + user = models.User.objects.create_user( + 'rat@%s' % DOMAIN, 'rat@rat.com', 'password', + local=True, localname='rat') + form = forms.CommentForm({ + 'content': 'hi @rat', + 'user': self.local_user.id, + 'book': self.book.id, + 'privacy': 'public', + }) + request = self.factory.get('', form.data) + request.user = self.local_user + + with patch('bookwyrm.broadcast.broadcast_task.delay'): + view(request, 'comment') + status = models.Status.objects.get() + self.assertEqual(list(status.mention_users.all()), [user]) + self.assertEqual(models.Notification.objects.get().user, user) + self.assertEqual( + status.content, + '

hi @rat

' % user.remote_id) + + def test_handle_status_reply_with_mentions(self): + ''' reply to a post with an @mention'ed user ''' + view = views.CreateStatus.as_view() + user = models.User.objects.create_user( + 'rat', 'rat@rat.com', 'password', + local=True, localname='rat') + form = forms.CommentForm({ + 'content': 'hi @rat@example.com', + 'user': self.local_user.id, + 'book': self.book.id, + 'privacy': 'public', + }) + request = self.factory.get('', form.data) + request.user = self.local_user + + with patch('bookwyrm.broadcast.broadcast_task.delay'): + view(request, 'comment') + status = models.Status.objects.get() + + form = forms.ReplyForm({ + 'content': 'right', + 'user': user, + 'privacy': 'public', + 'reply_parent': status.id + }) + request = self.factory.get('', form.data) + request.user = self.local_user + with patch('bookwyrm.broadcast.broadcast_task.delay'): + view(request, 'comment') + + reply = models.Status.replies(status).first() + self.assertEqual(reply.content, '

right

') + self.assertEqual(reply.user, user) + self.assertTrue(self.remote_user in reply.mention_users.all()) + self.assertTrue(self.local_user in reply.mention_users.all()) + + def test_find_mentions(self): + ''' detect and look up @ mentions of users ''' + user = models.User.objects.create_user( + 'nutria@%s' % DOMAIN, 'nutria@nutria.com', 'password', + local=True, localname='nutria') + self.assertEqual(user.username, 'nutria@%s' % DOMAIN) + + self.assertEqual( + list(views.status.find_mentions('@nutria'))[0], + ('@nutria', user) + ) + self.assertEqual( + list(views.status.find_mentions('leading text @nutria'))[0], + ('@nutria', user) + ) + self.assertEqual( + list(views.status.find_mentions( + 'leading @nutria trailing text'))[0], + ('@nutria', user) + ) + self.assertEqual( + list(views.status.find_mentions( + '@rat@example.com'))[0], + ('@rat@example.com', self.remote_user) + ) + + multiple = list(views.status.find_mentions( + '@nutria and @rat@example.com')) + self.assertEqual(multiple[0], ('@nutria', user)) + self.assertEqual(multiple[1], ('@rat@example.com', self.remote_user)) + + with patch('bookwyrm.views.status.handle_remote_webfinger') as rw: + rw.return_value = self.local_user + self.assertEqual( + list(views.status.find_mentions('@beep@beep.com'))[0], + ('@beep@beep.com', self.local_user) + ) + with patch('bookwyrm.views.status.handle_remote_webfinger') as rw: + rw.return_value = None + self.assertEqual(list(views.status.find_mentions( + '@beep@beep.com')), []) + + self.assertEqual( + list(views.status.find_mentions('@nutria@%s' % DOMAIN))[0], + ('@nutria@%s' % DOMAIN, user) + ) + + def test_format_links(self): + ''' find and format urls into a tags ''' + url = 'http://www.fish.com/' + self.assertEqual( + views.status.format_links(url), + 'www.fish.com/' % url) + self.assertEqual( + views.status.format_links('(%s)' % url), + '(www.fish.com/)' % url) + url = 'https://archive.org/details/dli.granth.72113/page/n25/mode/2up' + self.assertEqual( + views.status.format_links(url), + '' \ + 'archive.org/details/dli.granth.72113/page/n25/mode/2up' \ + % url) + url = 'https://openlibrary.org/search' \ + '?q=arkady+strugatsky&mode=everything' + self.assertEqual( + views.status.format_links(url), + 'openlibrary.org/search' \ + '?q=arkady+strugatsky&mode=everything' % url) + + + def test_to_markdown(self): + ''' this is mostly handled in other places, but nonetheless ''' + text = '_hi_ and http://fish.com is rad' + result = views.status.to_markdown(text) + self.assertEqual( + result, + '

hi and fish.com ' \ + 'is rad

') diff --git a/bookwyrm/views/status.py b/bookwyrm/views/status.py index 98b082fd..60a1f814 100644 --- a/bookwyrm/views/status.py +++ b/bookwyrm/views/status.py @@ -54,9 +54,11 @@ class CreateStatus(View): ''' get posting ''' def post(self, request, status_type): ''' create status of whatever type ''' - if status_type not in models.status_models: + status_type = status_type[0].upper() + status_type[1:] + try: + form = getattr(forms, '%sForm' % status_type)(request.POST) + except AttributeError: return HttpResponseBadRequest() - form = forms.get_attr(status_type)(request.POST) if not form.is_valid(): return redirect(request.headers.get('Referer', '/'))