From cb4c6100aa4b66ad2e364159be440b41143ddb4e Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 17 Aug 2021 11:47:10 -0700 Subject: [PATCH] Adds tests --- bookwyrm/tests/views/test_book.py | 43 --------- bookwyrm/tests/views/test_editions.py | 126 ++++++++++++++++++++++++++ bookwyrm/views/editions.py | 19 ++-- 3 files changed, 136 insertions(+), 52 deletions(-) create mode 100644 bookwyrm/tests/views/test_editions.py diff --git a/bookwyrm/tests/views/test_book.py b/bookwyrm/tests/views/test_book.py index c5d86a12..2cd50302 100644 --- a/bookwyrm/tests/views/test_book.py +++ b/bookwyrm/tests/views/test_book.py @@ -280,49 +280,6 @@ class BookViews(TestCase): self.assertEqual(book.authors.first().name, "Sappho") self.assertEqual(book.authors.first(), book.parent_work.authors.first()) - @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") - def test_switch_edition(self, _): - """updates user's relationships to a book""" - work = models.Work.objects.create(title="test work") - edition1 = models.Edition.objects.create(title="first ed", parent_work=work) - edition2 = models.Edition.objects.create(title="second ed", parent_work=work) - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - shelf = models.Shelf.objects.create(name="Test Shelf", user=self.local_user) - models.ShelfBook.objects.create( - book=edition1, - user=self.local_user, - shelf=shelf, - ) - models.ReadThrough.objects.create(user=self.local_user, book=edition1) - - self.assertEqual(models.ShelfBook.objects.get().book, edition1) - self.assertEqual(models.ReadThrough.objects.get().book, edition1) - request = self.factory.post("", {"edition": edition2.id}) - request.user = self.local_user - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - views.switch_edition(request) - - self.assertEqual(models.ShelfBook.objects.get().book, edition2) - self.assertEqual(models.ReadThrough.objects.get().book, edition2) - - def test_editions_page(self): - """there are so many views, this just makes sure it LOADS""" - view = views.Editions.as_view() - request = self.factory.get("") - with patch("bookwyrm.views.books.is_api_request") as is_api: - is_api.return_value = False - result = view(request, self.work.id) - self.assertIsInstance(result, TemplateResponse) - result.render() - self.assertEqual(result.status_code, 200) - - request = self.factory.get("") - with patch("bookwyrm.views.books.is_api_request") as is_api: - is_api.return_value = True - result = view(request, self.work.id) - self.assertIsInstance(result, ActivitypubResponse) - self.assertEqual(result.status_code, 200) - def test_upload_cover_file(self): """add a cover via file upload""" self.assertFalse(self.book.cover) diff --git a/bookwyrm/tests/views/test_editions.py b/bookwyrm/tests/views/test_editions.py new file mode 100644 index 00000000..1bd23ae1 --- /dev/null +++ b/bookwyrm/tests/views/test_editions.py @@ -0,0 +1,126 @@ +""" 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 models, views +from bookwyrm.activitypub import ActivitypubResponse + + +class BookViews(TestCase): + """books books books""" + + def setUp(self): + """we need basic test data and mocks""" + self.factory = RequestFactory() + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"): + self.local_user = models.User.objects.create_user( + "mouse@local.com", + "mouse@mouse.com", + "mouseword", + local=True, + localname="mouse", + remote_id="https://example.com/users/mouse", + ) + self.work = models.Work.objects.create(title="Test Work") + self.book = models.Edition.objects.create( + title="Example Edition", + remote_id="https://example.com/book/1", + parent_work=self.work, + physical_format="paperback", + ) + + models.SiteSettings.objects.create() + + def test_editions_page(self): + """there are so many views, this just makes sure it LOADS""" + view = views.Editions.as_view() + request = self.factory.get("") + with patch("bookwyrm.views.editions.is_api_request") as is_api: + is_api.return_value = False + result = view(request, self.work.id) + self.assertIsInstance(result, TemplateResponse) + result.render() + self.assertEqual(result.status_code, 200) + self.assertTrue("paperback" in result.context_data["formats"]) + + def test_editions_page_filtered(self): + """editions view with filters""" + models.Edition.objects.create( + title="Fish", + physical_format="okay", + parent_work=self.work, + ) + view = views.Editions.as_view() + request = self.factory.get("") + with patch("bookwyrm.views.editions.is_api_request") as is_api: + is_api.return_value = False + result = view(request, self.work.id) + self.assertIsInstance(result, TemplateResponse) + result.render() + self.assertEqual(result.status_code, 200) + self.assertEqual(len(result.context_data["editions"].object_list), 2) + self.assertEqual(len(result.context_data["formats"]), 2) + self.assertTrue("paperback" in result.context_data["formats"]) + self.assertTrue("okay" in result.context_data["formats"]) + + request = self.factory.get("", {"q": "fish"}) + with patch("bookwyrm.views.editions.is_api_request") as is_api: + is_api.return_value = False + result = view(request, self.work.id) + result.render() + self.assertEqual(result.status_code, 200) + self.assertEqual(len(result.context_data["editions"].object_list), 1) + + request = self.factory.get("", {"q": "okay"}) + with patch("bookwyrm.views.editions.is_api_request") as is_api: + is_api.return_value = False + result = view(request, self.work.id) + result.render() + self.assertEqual(result.status_code, 200) + self.assertEqual(len(result.context_data["editions"].object_list), 1) + + request = self.factory.get("", {"format": "okay"}) + with patch("bookwyrm.views.editions.is_api_request") as is_api: + is_api.return_value = False + result = view(request, self.work.id) + result.render() + self.assertEqual(result.status_code, 200) + self.assertEqual(len(result.context_data["editions"].object_list), 1) + + def test_editions_page_api(self): + """there are so many views, this just makes sure it LOADS""" + view = views.Editions.as_view() + request = self.factory.get("") + with patch("bookwyrm.views.editions.is_api_request") as is_api: + is_api.return_value = True + result = view(request, self.work.id) + self.assertIsInstance(result, ActivitypubResponse) + self.assertEqual(result.status_code, 200) + + @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") + def test_switch_edition(self, _): + """updates user's relationships to a book""" + work = models.Work.objects.create(title="test work") + edition1 = models.Edition.objects.create(title="first ed", parent_work=work) + edition2 = models.Edition.objects.create(title="second ed", parent_work=work) + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + shelf = models.Shelf.objects.create(name="Test Shelf", user=self.local_user) + models.ShelfBook.objects.create( + book=edition1, + user=self.local_user, + shelf=shelf, + ) + models.ReadThrough.objects.create(user=self.local_user, book=edition1) + + self.assertEqual(models.ShelfBook.objects.get().book, edition1) + self.assertEqual(models.ReadThrough.objects.get().book, edition1) + request = self.factory.post("", {"edition": edition2.id}) + request.user = self.local_user + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + views.switch_edition(request) + + self.assertEqual(models.ShelfBook.objects.get().book, edition2) + self.assertEqual(models.ReadThrough.objects.get().book, edition2) diff --git a/bookwyrm/views/editions.py b/bookwyrm/views/editions.py index b15e29b7..6b9bd384 100644 --- a/bookwyrm/views/editions.py +++ b/bookwyrm/views/editions.py @@ -34,8 +34,14 @@ class Editions(View): if request.GET.get("format"): filters["physical_format__iexact"] = request.GET.get("format") + editions = work.editions.order_by("-edition_rank") + languages = set( + sum([e for e in editions.values_list("languages", flat=True)], []) + ) + + editions = editions.filter(**filters) + query = request.GET.get("q") - search_filters = {} if query: searchable_array_fields = ["languages", "publishers"] searchable_fields = [ @@ -49,16 +55,11 @@ class Editions(View): search_filter_entries = [ {f"{f}__icontains": query} for f in searchable_fields ] + [{f"{f}__iexact": query} for f in searchable_array_fields] - search_filters = reduce( - operator.or_, (Q(**f) for f in search_filter_entries) + editions = editions.filter( + reduce(operator.or_, (Q(**f) for f in search_filter_entries)) ) - editions = work.editions.order_by("-edition_rank") - languages = set(sum([e.languages for e in editions], [])) - - paginated = Paginator( - editions.filter(**filters).filter(search_filters), PAGE_LENGTH - ) + paginated = Paginator(editions, PAGE_LENGTH) data = { "editions": paginated.get_page(request.GET.get("page")), "work": work,