Merge pull request #1527 from bookwyrm-social/book-file-links
Book file links
This commit is contained in:
41
bookwyrm/tests/models/test_link.py
Normal file
41
bookwyrm/tests/models/test_link.py
Normal file
@ -0,0 +1,41 @@
|
||||
""" testing models """
|
||||
from unittest.mock import patch
|
||||
from django.test import TestCase
|
||||
|
||||
from bookwyrm import models
|
||||
|
||||
|
||||
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
|
||||
class Link(TestCase):
|
||||
"""some activitypub oddness ahead"""
|
||||
|
||||
def setUp(self):
|
||||
"""look, a list"""
|
||||
with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
|
||||
"bookwyrm.activitystreams.populate_stream_task.delay"
|
||||
), patch("bookwyrm.lists_stream.populate_lists_task.delay"):
|
||||
self.local_user = models.User.objects.create_user(
|
||||
"mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
|
||||
)
|
||||
work = models.Work.objects.create(title="hello")
|
||||
self.book = models.Edition.objects.create(title="hi", parent_work=work)
|
||||
|
||||
def test_create_domain(self, _):
|
||||
"""generated default name"""
|
||||
domain = models.LinkDomain.objects.create(domain="beep.com")
|
||||
self.assertEqual(domain.name, "beep.com")
|
||||
self.assertEqual(domain.status, "pending")
|
||||
|
||||
def test_create_link_new_domain(self, _):
|
||||
"""generates link and sets domain"""
|
||||
link = models.Link.objects.create(url="https://www.hello.com/hi-there")
|
||||
self.assertEqual(link.domain.domain, "www.hello.com")
|
||||
self.assertEqual(link.name, "www.hello.com")
|
||||
|
||||
def test_create_link_existing_domain(self, _):
|
||||
"""generate link with a known domain"""
|
||||
domain = models.LinkDomain.objects.create(domain="www.hello.com", name="Hi")
|
||||
|
||||
link = models.Link.objects.create(url="https://www.hello.com/hi-there")
|
||||
self.assertEqual(link.domain, domain)
|
||||
self.assertEqual(link.name, "Hi")
|
80
bookwyrm/tests/views/admin/test_link_domains.py
Normal file
80
bookwyrm/tests/views/admin/test_link_domains.py
Normal file
@ -0,0 +1,80 @@
|
||||
""" 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.tests.validate_html import validate_html
|
||||
|
||||
|
||||
class LinkDomainViews(TestCase):
|
||||
"""every response to a get request, html or json"""
|
||||
|
||||
def setUp(self):
|
||||
"""we need basic test data and mocks"""
|
||||
self.factory = RequestFactory()
|
||||
with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
|
||||
"bookwyrm.activitystreams.populate_stream_task.delay"
|
||||
), patch("bookwyrm.lists_stream.populate_lists_task.delay"):
|
||||
self.local_user = models.User.objects.create_user(
|
||||
"mouse@local.com",
|
||||
"mouse@mouse.mouse",
|
||||
"password",
|
||||
local=True,
|
||||
localname="mouse",
|
||||
)
|
||||
self.book = models.Edition.objects.create(title="hello")
|
||||
models.FileLink.objects.create(
|
||||
book=self.book,
|
||||
url="https://beep.com/book/1",
|
||||
added_by=self.local_user,
|
||||
)
|
||||
|
||||
models.SiteSettings.objects.create()
|
||||
|
||||
def test_domain_page_get(self):
|
||||
"""there are so many views, this just makes sure it LOADS"""
|
||||
view = views.LinkDomain.as_view()
|
||||
request = self.factory.get("")
|
||||
request.user = self.local_user
|
||||
request.user.is_superuser = True
|
||||
|
||||
result = view(request, "pending")
|
||||
|
||||
self.assertIsInstance(result, TemplateResponse)
|
||||
validate_html(result.render())
|
||||
self.assertEqual(result.status_code, 200)
|
||||
|
||||
def test_domain_page_post(self):
|
||||
"""there are so many views, this just makes sure it LOADS"""
|
||||
domain = models.LinkDomain.objects.get(domain="beep.com")
|
||||
self.assertEqual(domain.name, "beep.com")
|
||||
|
||||
view = views.LinkDomain.as_view()
|
||||
request = self.factory.post("", {"name": "ugh"})
|
||||
request.user = self.local_user
|
||||
request.user.is_superuser = True
|
||||
|
||||
result = view(request, "pending", domain.id)
|
||||
self.assertEqual(result.status_code, 302)
|
||||
|
||||
domain.refresh_from_db()
|
||||
self.assertEqual(domain.name, "ugh")
|
||||
|
||||
def test_domain_page_set_status(self):
|
||||
"""there are so many views, this just makes sure it LOADS"""
|
||||
domain = models.LinkDomain.objects.get(domain="beep.com")
|
||||
self.assertEqual(domain.status, "pending")
|
||||
|
||||
view = views.update_domain_status
|
||||
request = self.factory.post("")
|
||||
request.user = self.local_user
|
||||
request.user.is_superuser = True
|
||||
|
||||
result = view(request, domain.id, "approved")
|
||||
self.assertEqual(result.status_code, 302)
|
||||
|
||||
domain.refresh_from_db()
|
||||
self.assertEqual(domain.status, "approved")
|
@ -37,7 +37,7 @@ class ReportViews(TestCase):
|
||||
|
||||
def test_reports_page(self):
|
||||
"""there are so many views, this just makes sure it LOADS"""
|
||||
view = views.Reports.as_view()
|
||||
view = views.ReportsAdmin.as_view()
|
||||
request = self.factory.get("")
|
||||
request.user = self.local_user
|
||||
request.user.is_superuser = True
|
||||
@ -49,7 +49,7 @@ class ReportViews(TestCase):
|
||||
|
||||
def test_reports_page_with_data(self):
|
||||
"""there are so many views, this just makes sure it LOADS"""
|
||||
view = views.Reports.as_view()
|
||||
view = views.ReportsAdmin.as_view()
|
||||
request = self.factory.get("")
|
||||
request.user = self.local_user
|
||||
request.user.is_superuser = True
|
||||
@ -62,7 +62,7 @@ class ReportViews(TestCase):
|
||||
|
||||
def test_report_page(self):
|
||||
"""there are so many views, this just makes sure it LOADS"""
|
||||
view = views.Report.as_view()
|
||||
view = views.ReportAdmin.as_view()
|
||||
request = self.factory.get("")
|
||||
request.user = self.local_user
|
||||
request.user.is_superuser = True
|
||||
@ -76,7 +76,7 @@ class ReportViews(TestCase):
|
||||
|
||||
def test_report_comment(self):
|
||||
"""comment on a report"""
|
||||
view = views.Report.as_view()
|
||||
view = views.ReportAdmin.as_view()
|
||||
request = self.factory.post("", {"note": "hi"})
|
||||
request.user = self.local_user
|
||||
request.user.is_superuser = True
|
||||
@ -97,7 +97,7 @@ class ReportViews(TestCase):
|
||||
request = self.factory.post("", form.data)
|
||||
request.user = self.local_user
|
||||
|
||||
views.make_report(request)
|
||||
views.Report.as_view()(request)
|
||||
|
||||
report = models.Report.objects.get()
|
||||
self.assertEqual(report.reporter, self.local_user)
|
||||
|
89
bookwyrm/tests/views/books/test_links.py
Normal file
89
bookwyrm/tests/views/books/test_links.py
Normal file
@ -0,0 +1,89 @@
|
||||
""" test for app action functionality """
|
||||
import json
|
||||
from unittest.mock import patch
|
||||
|
||||
from django.contrib.auth.models import Group, Permission
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
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.tests.validate_html import validate_html
|
||||
|
||||
|
||||
class LinkViews(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"), patch(
|
||||
"bookwyrm.activitystreams.populate_stream_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",
|
||||
)
|
||||
group = Group.objects.create(name="editor")
|
||||
group.permissions.add(
|
||||
Permission.objects.create(
|
||||
name="edit_book",
|
||||
codename="edit_book",
|
||||
content_type=ContentType.objects.get_for_model(models.User),
|
||||
).id
|
||||
)
|
||||
self.local_user.groups.add(group)
|
||||
|
||||
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,
|
||||
)
|
||||
|
||||
models.SiteSettings.objects.create()
|
||||
|
||||
def test_add_link_page(self):
|
||||
"""there are so many views, this just makes sure it LOADS"""
|
||||
view = views.AddFileLink.as_view()
|
||||
request = self.factory.get("")
|
||||
request.user = self.local_user
|
||||
result = view(request, self.book.id)
|
||||
self.assertIsInstance(result, TemplateResponse)
|
||||
validate_html(result.render())
|
||||
|
||||
self.assertEqual(result.status_code, 200)
|
||||
|
||||
def test_add_link_post(self, *_):
|
||||
"""there are so many views, this just makes sure it LOADS"""
|
||||
view = views.AddFileLink.as_view()
|
||||
form = forms.FileLinkForm()
|
||||
form.data["url"] = "https://www.example.com"
|
||||
form.data["filetype"] = "HTML"
|
||||
form.data["book"] = self.book.id
|
||||
form.data["added_by"] = self.local_user.id
|
||||
|
||||
request = self.factory.post("", form.data)
|
||||
request.user = self.local_user
|
||||
with patch(
|
||||
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
|
||||
) as mock:
|
||||
view(request, self.book.id)
|
||||
self.assertEqual(mock.call_count, 1)
|
||||
|
||||
activity = json.loads(mock.call_args[1]["args"][1])
|
||||
self.assertEqual(activity["type"], "Update")
|
||||
self.assertEqual(activity["object"]["type"], "Edition")
|
||||
|
||||
link = models.FileLink.objects.get()
|
||||
self.assertEqual(link.name, "www.example.com")
|
||||
self.assertEqual(link.url, "https://www.example.com")
|
||||
self.assertEqual(link.filetype, "HTML")
|
||||
|
||||
self.book.refresh_from_db()
|
||||
self.assertEqual(self.book.file_links.first(), link)
|
@ -6,6 +6,7 @@ from unittest.mock import patch
|
||||
from django.test import TestCase
|
||||
|
||||
from bookwyrm import models, views
|
||||
from bookwyrm.activitypub.base_activity import set_related_field
|
||||
|
||||
|
||||
# pylint: disable=too-many-public-methods
|
||||
@ -147,6 +148,48 @@ class InboxUpdate(TestCase):
|
||||
self.assertEqual(book.title, "Piranesi")
|
||||
self.assertEqual(book.last_edited_by, self.remote_user)
|
||||
|
||||
def test_update_edition_links(self):
|
||||
"""add links to edition"""
|
||||
datafile = pathlib.Path(__file__).parent.joinpath("../../data/bw_edition.json")
|
||||
bookdata = json.loads(datafile.read_bytes())
|
||||
del bookdata["authors"]
|
||||
# pylint: disable=line-too-long
|
||||
link_data = {
|
||||
"href": "https://openlibrary.org/books/OL11645413M/Queen_Victoria/daisy",
|
||||
"mediaType": "Daisy",
|
||||
"attributedTo": self.remote_user.remote_id,
|
||||
}
|
||||
bookdata["fileLinks"] = [link_data]
|
||||
|
||||
models.Work.objects.create(
|
||||
title="Test Work", remote_id="https://bookwyrm.social/book/5988"
|
||||
)
|
||||
book = models.Edition.objects.create(
|
||||
title="Test Book", remote_id="https://bookwyrm.social/book/5989"
|
||||
)
|
||||
self.assertFalse(book.file_links.exists())
|
||||
|
||||
with patch(
|
||||
"bookwyrm.activitypub.base_activity.set_related_field.delay"
|
||||
) as mock:
|
||||
views.inbox.activity_task(
|
||||
{
|
||||
"type": "Update",
|
||||
"to": [],
|
||||
"cc": [],
|
||||
"actor": "hi",
|
||||
"id": "sdkjf",
|
||||
"object": bookdata,
|
||||
}
|
||||
)
|
||||
args = mock.call_args[0]
|
||||
self.assertEqual(args[0], "FileLink")
|
||||
self.assertEqual(args[1], "Edition")
|
||||
self.assertEqual(args[2], "book")
|
||||
self.assertEqual(args[3], book.remote_id)
|
||||
self.assertEqual(args[4], link_data)
|
||||
# idk how to test that related name works, because of the transaction
|
||||
|
||||
def test_update_work(self):
|
||||
"""update an existing edition"""
|
||||
datafile = pathlib.Path(__file__).parent.joinpath("../../data/bw_work.json")
|
||||
|
Reference in New Issue
Block a user