Adds more tests

This commit is contained in:
Mouse Reeve 2024-08-27 13:49:15 -07:00
parent aee089fcca
commit 6b622bac3e
4 changed files with 132 additions and 17 deletions

View file

@ -51,6 +51,11 @@ class BookViews(TestCase):
remote_id="https://example.com/book/1", remote_id="https://example.com/book/1",
parent_work=cls.work, parent_work=cls.work,
) )
cls.another_book = models.Edition.objects.create(
title="Another Example Edition",
remote_id="https://example.com/book/1",
parent_work=models.Work.objects.create(title="Another Work"),
)
models.SiteSettings.objects.create() models.SiteSettings.objects.create()
@ -134,6 +139,43 @@ class BookViews(TestCase):
self.assertEqual(result.status_code, 200) self.assertEqual(result.status_code, 200)
self.assertEqual(result.context_data["statuses"].object_list[0], quote) self.assertEqual(result.context_data["statuses"].object_list[0], quote)
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
def test_book_page_suggestions(self, *_):
"""there are so many views, this just makes sure it LOADS"""
view = views.Book.as_view()
suggestion_list = models.SuggestionList.objects.create(suggests_for=self.work)
request = self.factory.get("")
request.user = self.local_user
with patch("bookwyrm.views.books.books.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.book.id, user_statuses="review")
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
self.assertEqual(result.context_data["suggestion_list"], suggestion_list)
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
def test_book_page_suggestions_with_items(self, *_):
"""there are so many views, this just makes sure it LOADS"""
view = views.Book.as_view()
suggestion_list = models.SuggestionList.objects.create(suggests_for=self.work)
models.SuggestionListItem.objects.create(
book_list=suggestion_list, user=self.local_user, book=self.another_book
)
request = self.factory.get("")
request.user = self.local_user
with patch("bookwyrm.views.books.books.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.book.id, user_statuses="review")
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
self.assertEqual(result.context_data["suggestion_list"], suggestion_list)
def test_book_page_invalid_id(self): def test_book_page_invalid_id(self):
"""there are so many views, this just makes sure it LOADS""" """there are so many views, this just makes sure it LOADS"""
view = views.Book.as_view() view = views.Book.as_view()

View file

@ -1,6 +1,7 @@
""" test for app action functionality """ """ test for app action functionality """
from unittest.mock import patch from unittest.mock import patch
from django.core.exceptions import PermissionDenied
from django.test import TestCase from django.test import TestCase
from django.test.client import RequestFactory from django.test.client import RequestFactory
@ -28,6 +29,14 @@ class BookViews(TestCase):
localname="mouse", localname="mouse",
remote_id="https://example.com/users/mouse", remote_id="https://example.com/users/mouse",
) )
cls.another_user = models.User.objects.create_user(
"rat@local.com",
"rat@rat.com",
"ratword",
local=True,
localname="rat",
remote_id="https://example.com/users/rat",
)
cls.work = models.Work.objects.create(title="Test Work") cls.work = models.Work.objects.create(title="Test Work")
cls.book = models.Edition.objects.create( cls.book = models.Edition.objects.create(
title="Example Edition", title="Example Edition",
@ -48,7 +57,7 @@ class BookViews(TestCase):
def test_suggestion_list_get(self, *_): def test_suggestion_list_get(self, *_):
"""start a suggestion list for a book""" """start a suggestion list for a book"""
models.SuggestionList.objects.create(suggests_for=self.book) models.SuggestionList.objects.create(suggests_for=self.work)
view = views.SuggestionList.as_view() view = views.SuggestionList.as_view()
request = self.factory.get("") request = self.factory.get("")
request.user = self.local_user request.user = self.local_user
@ -58,7 +67,7 @@ class BookViews(TestCase):
def test_suggestion_list_get_json(self, *_): def test_suggestion_list_get_json(self, *_):
"""start a suggestion list for a book""" """start a suggestion list for a book"""
models.SuggestionList.objects.create(suggests_for=self.book) models.SuggestionList.objects.create(suggests_for=self.work)
view = views.SuggestionList.as_view() view = views.SuggestionList.as_view()
request = self.factory.get("") request = self.factory.get("")
request.user = self.local_user request.user = self.local_user
@ -70,40 +79,106 @@ class BookViews(TestCase):
def test_suggestion_create(self, *_): def test_suggestion_create(self, *_):
"""start a suggestion list for a book""" """start a suggestion list for a book"""
self.assertFalse(hasattr(self.book, "suggestion_list")) self.assertFalse(hasattr(self.work, "suggestion_list"))
view = views.SuggestionList.as_view() view = views.SuggestionList.as_view()
form = forms.SuggestionListForm() form = forms.SuggestionListForm()
form.data["suggests_for"] = self.book.id form.data["suggests_for"] = self.work.id
request = self.factory.post("", form.data) request = self.factory.post("", form.data)
request.user = self.local_user request.user = self.local_user
view(request, self.book.id) view(request, self.book.id)
self.book.refresh_from_db() self.work.refresh_from_db()
self.assertTrue(hasattr(self.book, "suggestion_list")) self.assertTrue(hasattr(self.work, "suggestion_list"))
suggestion_list = self.book.suggestion_list suggestion_list = self.work.suggestion_list
self.assertEqual(suggestion_list.suggests_for, self.book) self.assertEqual(suggestion_list.suggests_for, self.work)
self.assertEqual(suggestion_list.privacy, "public") self.assertEqual(suggestion_list.privacy, "public")
self.assertEqual(suggestion_list.user, get_representative()) self.assertEqual(suggestion_list.user, get_representative())
def test_book_add_suggestion(self, *_): def test_book_add_suggestion(self, *_):
"""Add a book to the recommendation list""" """Add a book to the recommendation list"""
suggestion_list = models.SuggestionList.objects.create(suggests_for=self.book) suggestion_list = models.SuggestionList.objects.create(suggests_for=self.work)
view = views.book_add_suggestion view = views.book_add_suggestion
form = forms.SuggestionListItemForm() form = forms.SuggestionListItemForm()
form.data["user"] = self.local_user.id form.data["user"] = self.local_user.id
form.data["book"] = self.another_book.id form.data["book"] = self.another_book.id
form.data["book_list"] = suggestion_list.id form.data["book_list"] = suggestion_list.id
form.data["notes"] = "hello" form.data["notes"] = "hello"
request = self.factory.post("", form.data) request = self.factory.post("", form.data)
request.user = self.local_user request.user = self.local_user
view(request, self.book.id) view(request, self.work.id)
self.assertEqual(suggestion_list.suggestionlistitem_set.count(), 1) self.assertEqual(suggestion_list.suggestionlistitem_set.count(), 1)
item = suggestion_list.suggestionlistitem_set.first() item = suggestion_list.suggestionlistitem_set.first()
self.assertEqual(item.book, self.another_book) self.assertEqual(item.book, self.another_book)
self.assertEqual(item.user, self.local_user) self.assertEqual(item.user, self.local_user)
self.assertEqual(item.notes, "hello") self.assertEqual(item.notes, "hello")
def test_book_remove_suggestion(self, *_):
"""Remove a book from the recommendation list"""
suggestion_list = models.SuggestionList.objects.create(suggests_for=self.work)
item = models.SuggestionListItem.objects.create(
book_list=suggestion_list, user=self.local_user, book=self.another_book
)
self.assertEqual(suggestion_list.suggestionlistitem_set.count(), 1)
view = views.book_remove_suggestion
request = self.factory.post("", {"item": item.id})
request.user = self.local_user
view(request, self.work.id)
self.assertEqual(suggestion_list.suggestionlistitem_set.count(), 0)
def test_book_remove_suggestion_without_permission(self, *_):
"""Remove a book from the recommendation list"""
suggestion_list = models.SuggestionList.objects.create(suggests_for=self.work)
item = models.SuggestionListItem.objects.create(
book_list=suggestion_list, user=self.local_user, book=self.another_book
)
self.assertEqual(suggestion_list.suggestionlistitem_set.count(), 1)
view = views.book_remove_suggestion
request = self.factory.post("", {"item": item.id})
request.user = self.another_user
with self.assertRaises(PermissionDenied):
view(request, self.work.id)
self.assertEqual(suggestion_list.suggestionlistitem_set.count(), 1)
def test_endorse_suggestion(self, *_):
"""Endorse a suggestion"""
suggestion_list = models.SuggestionList.objects.create(suggests_for=self.work)
item = models.SuggestionListItem.objects.create(
book_list=suggestion_list, user=self.local_user, book=self.another_book
)
self.assertEqual(item.endorsement.count(), 0)
view = views.endorse_suggestion
request = self.factory.post("")
request.user = self.another_user
view(request, self.work.id, item.id)
self.assertEqual(item.endorsement.count(), 1)
def test_endorse_suggestion_by_self(self, *_):
"""Endorse a suggestion error handling"""
suggestion_list = models.SuggestionList.objects.create(suggests_for=self.work)
item = models.SuggestionListItem.objects.create(
book_list=suggestion_list, user=self.local_user, book=self.another_book
)
self.assertEqual(item.endorsement.count(), 0)
view = views.endorse_suggestion
request = self.factory.post("")
request.user = self.local_user
view(request, self.work.id, item.id)
# no impact
self.assertEqual(item.endorsement.count(), 0)

View file

@ -137,10 +137,10 @@ class Book(View):
"quotation_count": book.quotation_set.filter(**filters).count(), "quotation_count": book.quotation_set.filter(**filters).count(),
} }
if hasattr(book.parent_work, "suggestion_list"): if hasattr(book.parent_work, "suggestion_list"):
suggestion_list = book.parent_work.suggestion_list data["suggestion_list"] = book.parent_work.suggestion_list
data["suggestion_list"] = suggestion_list
data["items"] = ( data["items"] = (
suggestion_list.suggestionlistitem_set.prefetch_related( data["suggestion_list"]
.suggestionlistitem_set.prefetch_related(
"user", "book", "book__authors", "endorsement" "user", "book", "book__authors", "endorsement"
) )
.annotate(endorsement_count=Count("endorsement")) .annotate(endorsement_count=Count("endorsement"))
@ -148,7 +148,7 @@ class Book(View):
) )
data["suggested_books"] = get_list_suggestions( data["suggested_books"] = get_list_suggestions(
suggestion_list, data["suggestion_list"],
request.user, request.user,
query=request.GET.get("suggestion_query", ""), query=request.GET.get("suggestion_query", ""),
ignore_book=book.parent_work, ignore_book=book.parent_work,

View file

@ -95,7 +95,6 @@ class SuggestionList(View):
@login_required @login_required
@require_POST @require_POST
@transaction.atomic
def book_add_suggestion(request, book_id): def book_add_suggestion(request, book_id):
"""put a book on the suggestion list""" """put a book on the suggestion list"""
_ = get_object_or_404( _ = get_object_or_404(
@ -106,8 +105,7 @@ def book_add_suggestion(request, book_id):
if not form.is_valid(): if not form.is_valid():
return Book().get(request, book_id, add_failed=True) return Book().get(request, book_id, add_failed=True)
item = form.save(request, commit=False) form.save(request)
item.save()
return redirect_to_referer(request) return redirect_to_referer(request)