diff --git a/bookwyrm/templates/snippets/trimmed_text.html b/bookwyrm/templates/snippets/trimmed_text.html index 43fcb38e..b3207a92 100644 --- a/bookwyrm/templates/snippets/trimmed_text.html +++ b/bookwyrm/templates/snippets/trimmed_text.html @@ -2,7 +2,7 @@ {% with 0|uuid as uuid %} {% if full %} -{% with full|text_overflow as trimmed %} +{% with full|truncatewords_html:60 as trimmed %} {% if trimmed != full %}
diff --git a/bookwyrm/templatetags/bookwyrm_tags.py b/bookwyrm/templatetags/bookwyrm_tags.py index 8c77921c..deb90427 100644 --- a/bookwyrm/templatetags/bookwyrm_tags.py +++ b/bookwyrm/templatetags/bookwyrm_tags.py @@ -13,7 +13,7 @@ register = template.Library() @register.filter(name='dict_key') def dict_key(d, k): - '''Returns the given key from a dictionary.''' + ''' Returns the given key from a dictionary. ''' return d.get(k) or 0 @@ -117,21 +117,6 @@ def get_book_description(book): return book.description or book.parent_work.description -@register.filter(name='text_overflow') -def text_overflow(text): - ''' dont' let book descriptions run for ages ''' - if not text: - return '' - char_max = 400 - if text and len(text) < char_max: - return text - - trimmed = text[:char_max] - # go back to the last space - trimmed = ' '.join(trimmed.split(' ')[:-1]) - return trimmed + '...' - - @register.filter(name='uuid') def get_uuid(identifier): ''' for avoiding clashing ids when there are many forms ''' diff --git a/bookwyrm/tests/test_templatetags.py b/bookwyrm/tests/test_templatetags.py new file mode 100644 index 00000000..28f08424 --- /dev/null +++ b/bookwyrm/tests/test_templatetags.py @@ -0,0 +1,209 @@ +''' style fixes and lookups for templates ''' +import re +from unittest.mock import patch + +from dateutil.parser import parse +from django.test import TestCase +from django.utils import timezone + +from bookwyrm import models +from bookwyrm.templatetags import bookwyrm_tags + + +class TemplateTags(TestCase): + ''' lotta different things here ''' + def setUp(self): + ''' create some filler objects ''' + self.user = models.User.objects.create_user( + 'mouse', 'mouse@mouse.mouse', 'mouseword', local=True) + with patch('bookwyrm.models.user.set_remote_server.delay'): + self.remote_user = models.User.objects.create_user( + 'rat', 'rat@rat.rat', 'ratword', + remote_id='http://example.com/rat', local=False) + self.book = models.Edition.objects.create(title='Test Book') + + + def test_dict_key(self): + ''' just getting a value out of a dict ''' + test_dict = {'a': 1, 'b': 3} + self.assertEqual( + bookwyrm_tags.dict_key(test_dict, 'a'), 1) + self.assertEqual( + bookwyrm_tags.dict_key(test_dict, 'c'), 0) + + + def test_get_rating(self): + ''' get a user's most recent rating of a book ''' + models.Review.objects.create( + user=self.user, book=self.book, rating=3) + self.assertEqual( + bookwyrm_tags.get_rating(self.book, self.user), 3) + + + def test_get_rating_doesnt_exist(self): + ''' there is no rating available ''' + self.assertEqual( + bookwyrm_tags.get_rating(self.book, self.user), 0) + + + def test_get_user_identifer_local(self): + ''' fall back to the simplest uid available ''' + self.assertNotEqual(self.user.username, self.user.localname) + self.assertEqual( + bookwyrm_tags.get_user_identifier(self.user), 'mouse') + + def test_get_user_identifer_remote(self): + ''' for a remote user, should be their full username ''' + self.assertEqual( + bookwyrm_tags.get_user_identifier(self.remote_user), + 'rat@example.com') + + def test_get_notification_count(self): + ''' just countin' ''' + self.assertEqual(bookwyrm_tags.get_notification_count(self.user), 0) + + models.Notification.objects.create( + user=self.user, notification_type='FOLLOW') + models.Notification.objects.create( + user=self.user, notification_type='FOLLOW') + + models.Notification.objects.create( + user=self.remote_user, notification_type='FOLLOW') + + self.assertEqual(bookwyrm_tags.get_notification_count(self.user), 2) + + + def test_get_replies(self): + ''' direct replies to a status ''' + parent = models.Review.objects.create( + user=self.user, book=self.book) + first_child = models.Status.objects.create( + reply_parent=parent, user=self.user) + second_child = models.Status.objects.create( + reply_parent=parent, user=self.user) + third_child = models.Status.objects.create( + reply_parent=parent, user=self.user, deleted=True) + + replies = bookwyrm_tags.get_replies(parent) + self.assertEqual(len(replies), 2) + self.assertTrue(first_child in replies) + self.assertTrue(second_child in replies) + self.assertFalse(third_child in replies) + + + def test_get_parent(self): + ''' get the reply parent of a status ''' + parent = models.Review.objects.create( + user=self.user, book=self.book) + child = models.Status.objects.create( + reply_parent=parent, user=self.user) + + result = bookwyrm_tags.get_parent(child) + self.assertEqual(result, parent) + self.assertIsInstance(result, models.Review) + + + def test_get_user_liked(self): + ''' did a user like a status ''' + status = models.Review.objects.create( + user=self.remote_user, book=self.book) + + self.assertFalse(bookwyrm_tags.get_user_liked(self.user, status)) + models.Favorite.objects.create( + user=self.user, + status=status + ) + self.assertTrue(bookwyrm_tags.get_user_liked(self.user, status)) + + + def test_get_user_boosted(self): + ''' did a user boost a status ''' + status = models.Review.objects.create( + user=self.remote_user, book=self.book) + + self.assertFalse(bookwyrm_tags.get_user_boosted(self.user, status)) + models.Boost.objects.create( + user=self.user, + boosted_status=status + ) + self.assertTrue(bookwyrm_tags.get_user_boosted(self.user, status)) + + + def test_follow_request_exists(self): + ''' does a user want to follow ''' + self.assertFalse( + bookwyrm_tags.follow_request_exists(self.user, self.remote_user)) + + models.UserFollowRequest.objects.create( + user_subject=self.user, + user_object=self.remote_user) + + self.assertFalse( + bookwyrm_tags.follow_request_exists(self.user, self.remote_user)) + self.assertTrue( + bookwyrm_tags.follow_request_exists(self.remote_user, self.user)) + + + def test_get_boosted(self): + ''' load a boosted status ''' + status = models.Review.objects.create( + user=self.remote_user, book=self.book) + boost = models.Boost.objects.create( + user=self.user, + boosted_status=status + ) + boosted = bookwyrm_tags.get_boosted(boost) + self.assertIsInstance(boosted, models.Review) + self.assertEqual(boosted, status) + + + def test_get_edition_info(self): + ''' text slug about an edition ''' + self.assertEqual( + bookwyrm_tags.get_edition_info(self.book), '') + + self.book.physical_format = 'worm' + self.book.save() + self.assertEqual( + bookwyrm_tags.get_edition_info(self.book), 'worm') + + self.book.languages = ['English'] + self.book.save() + self.assertEqual( + bookwyrm_tags.get_edition_info(self.book), 'worm') + + self.book.languages = ['Glorbish', 'English'] + self.book.save() + self.assertEqual( + bookwyrm_tags.get_edition_info(self.book), + 'worm, Glorbish language') + + self.book.published_date = timezone.make_aware(parse('2020')) + self.book.save() + self.assertEqual( + bookwyrm_tags.get_edition_info(self.book), + 'worm, Glorbish language, 2020') + + + def test_get_book_description(self): + ''' grab it from the edition or the parent ''' + work = models.Work.objects.create(title='Test Work') + self.book.parent_work = work + self.book.save() + + self.assertIsNone(bookwyrm_tags.get_book_description(self.book)) + + work.description = 'hi' + work.save() + self.assertEqual(bookwyrm_tags.get_book_description(self.book), 'hi') + + self.book.description = 'hello' + self.book.save() + self.assertEqual(bookwyrm_tags.get_book_description(self.book), 'hello') + + + def test_get_uuid(self): + ''' uuid functionality ''' + uuid = bookwyrm_tags.get_uuid('hi') + print(uuid) + self.assertTrue(re.match(r'hi[A-Za-z0-9\-]', uuid))