bookwyrm/bookwyrm/tests/views/test_edit_user.py

168 lines
6.5 KiB
Python
Raw Normal View History

2021-06-14 16:57:51 +00:00
""" test for app action functionality """
2021-06-14 18:15:00 +00:00
import json
2021-06-14 16:57:51 +00:00
import pathlib
from unittest.mock import patch
from PIL import Image
2021-09-28 17:21:12 +00:00
from tidylib import tidy_document
2021-06-14 16:57:51 +00:00
from django.contrib.auth.models import AnonymousUser
2021-06-14 18:15:00 +00:00
from django.contrib.sessions.middleware import SessionMiddleware
2021-06-14 16:57:51 +00:00
from django.core.files.base import ContentFile
from django.core.files.uploadedfile import SimpleUploadedFile
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import forms, models, views
2021-08-03 20:03:24 +00:00
@patch("bookwyrm.suggested_users.remove_user_task.delay")
2021-06-14 16:57:51 +00:00
class EditUserViews(TestCase):
"""view user and edit profile"""
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"
):
2021-08-03 17:25:53 +00:00
self.local_user = models.User.objects.create_user(
"mouse@local.com",
"mouse@mouse.mouse",
"password",
local=True,
localname="mouse",
)
self.rat = models.User.objects.create_user(
"rat@local.com", "rat@rat.rat", "password", local=True, localname="rat"
)
2021-06-18 16:28:24 +00:00
2021-08-06 00:47:28 +00:00
self.book = models.Edition.objects.create(
title="test", parent_work=models.Work.objects.create(title="test work")
)
2021-09-06 23:59:58 +00:00
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"), patch(
"bookwyrm.activitystreams.add_book_statuses_task.delay"
):
2021-08-03 20:03:24 +00:00
models.ShelfBook.objects.create(
book=self.book,
user=self.local_user,
shelf=self.local_user.shelf_set.first(),
)
2021-06-14 16:57:51 +00:00
2021-08-02 23:05:40 +00:00
models.SiteSettings.objects.create()
2021-06-14 16:57:51 +00:00
self.anonymous_user = AnonymousUser
self.anonymous_user.is_authenticated = False
2021-08-03 20:03:24 +00:00
def test_edit_user_page(self, _):
2021-06-14 16:57:51 +00:00
"""there are so many views, this just makes sure it LOADS"""
view = views.EditUser.as_view()
request = self.factory.get("")
request.user = self.local_user
result = view(request)
self.assertIsInstance(result, TemplateResponse)
2021-09-28 17:21:12 +00:00
html = result.render()
_, errors = tidy_document(html.content)
if errors:
raise Exception(errors)
2021-06-14 16:57:51 +00:00
self.assertEqual(result.status_code, 200)
2021-08-03 20:03:24 +00:00
def test_edit_user(self, _):
2021-06-14 16:57:51 +00:00
"""use a form to update a user"""
view = views.EditUser.as_view()
form = forms.EditUserForm(instance=self.local_user)
form.data["name"] = "New Name"
form.data["email"] = "wow@email.com"
2021-08-04 18:30:23 +00:00
form.data["default_post_privacy"] = "public"
2021-06-14 16:57:51 +00:00
form.data["preferred_timezone"] = "UTC"
request = self.factory.post("", form.data)
request.user = self.local_user
self.assertIsNone(self.local_user.name)
2021-08-02 23:05:40 +00:00
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.delay"
) as delay_mock:
view(request)
self.assertEqual(delay_mock.call_count, 1)
2021-06-14 16:57:51 +00:00
self.assertEqual(self.local_user.name, "New Name")
self.assertEqual(self.local_user.email, "wow@email.com")
2021-08-03 20:03:24 +00:00
def test_edit_user_avatar(self, _):
2021-06-14 16:57:51 +00:00
"""use a form to update a user"""
view = views.EditUser.as_view()
form = forms.EditUserForm(instance=self.local_user)
form.data["name"] = "New Name"
form.data["email"] = "wow@email.com"
2021-08-04 18:30:23 +00:00
form.data["default_post_privacy"] = "public"
2021-06-14 16:57:51 +00:00
form.data["preferred_timezone"] = "UTC"
image_file = pathlib.Path(__file__).parent.joinpath(
"../../static/images/no_cover.jpg"
)
2021-09-28 17:21:12 +00:00
# pylint: disable=consider-using-with
2021-06-14 16:57:51 +00:00
form.data["avatar"] = SimpleUploadedFile(
image_file, open(image_file, "rb").read(), content_type="image/jpeg"
)
request = self.factory.post("", form.data)
request.user = self.local_user
2021-08-02 23:05:40 +00:00
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.delay"
) as delay_mock:
view(request)
self.assertEqual(delay_mock.call_count, 1)
2021-06-14 16:57:51 +00:00
self.assertEqual(self.local_user.name, "New Name")
self.assertEqual(self.local_user.email, "wow@email.com")
self.assertIsNotNone(self.local_user.avatar)
self.assertEqual(self.local_user.avatar.width, 120)
self.assertEqual(self.local_user.avatar.height, 120)
2021-08-03 20:03:24 +00:00
def test_crop_avatar(self, _):
2021-06-14 16:57:51 +00:00
"""reduce that image size"""
image_file = pathlib.Path(__file__).parent.joinpath(
"../../static/images/no_cover.jpg"
)
image = Image.open(image_file)
2021-06-14 18:35:06 +00:00
result = views.edit_user.crop_avatar(image)
2021-06-14 16:57:51 +00:00
self.assertIsInstance(result, ContentFile)
image_result = Image.open(result)
self.assertEqual(image_result.size, (120, 120))
2021-06-14 18:15:00 +00:00
2021-08-03 20:03:24 +00:00
def test_delete_user_page(self, _):
2021-06-14 18:15:00 +00:00
"""there are so many views, this just makes sure it LOADS"""
view = views.DeleteUser.as_view()
request = self.factory.get("")
request.user = self.local_user
result = view(request)
self.assertIsInstance(result, TemplateResponse)
result.render()
self.assertEqual(result.status_code, 200)
2021-08-03 19:48:44 +00:00
@patch("bookwyrm.suggested_users.rerank_suggestions_task")
2021-08-03 20:03:24 +00:00
def test_delete_user(self, *_):
2021-06-14 18:15:00 +00:00
"""use a form to update a user"""
view = views.DeleteUser.as_view()
form = forms.DeleteUserForm()
form.data["password"] = "password"
request = self.factory.post("", form.data)
request.user = self.local_user
middleware = SessionMiddleware()
middleware.process_request(request)
request.session.save()
self.assertIsNone(self.local_user.name)
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.delay"
) as delay_mock:
view(request)
self.assertEqual(delay_mock.call_count, 1)
activity = json.loads(delay_mock.call_args[0][1])
self.assertEqual(activity["type"], "Delete")
self.assertEqual(activity["actor"], self.local_user.remote_id)
self.assertEqual(
activity["cc"][0], "https://www.w3.org/ns/activitystreams#Public"
)
2021-06-14 18:35:06 +00:00
self.local_user.refresh_from_db()
2021-06-14 18:15:00 +00:00
self.assertFalse(self.local_user.is_active)
2021-06-14 18:35:06 +00:00
self.assertEqual(self.local_user.deactivation_reason, "self_deletion")