diff --git a/bookwyrm/tests/views/preferences/test_change_password.py b/bookwyrm/tests/views/preferences/test_change_password.py new file mode 100644 index 00000000..b72537c4 --- /dev/null +++ b/bookwyrm/tests/views/preferences/test_change_password.py @@ -0,0 +1,61 @@ +""" test for app action functionality """ +from unittest.mock import patch +from tidylib import tidy_document + +from django.template.response import TemplateResponse +from django.test import TestCase +from django.test.client import RequestFactory + +from bookwyrm import models, views + + +class ChangePasswordViews(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" + ): + self.local_user = models.User.objects.create_user( + "mouse@local.com", + "mouse@mouse.com", + "password", + local=True, + localname="mouse", + ) + models.SiteSettings.objects.create(id=1) + + def test_password_change_get(self): + """there are so many views, this just makes sure it LOADS""" + view = views.ChangePassword.as_view() + request = self.factory.get("") + request.user = self.local_user + + result = view(request) + self.assertIsInstance(result, TemplateResponse) + html = result.render() + _, errors = tidy_document(html.content) + if errors: + raise Exception(errors) + self.assertEqual(result.status_code, 200) + + def test_password_change(self): + """change password""" + view = views.ChangePassword.as_view() + password_hash = self.local_user.password + request = self.factory.post("", {"password": "hi", "confirm-password": "hi"}) + request.user = self.local_user + with patch("bookwyrm.views.password.login"): + view(request) + self.assertNotEqual(self.local_user.password, password_hash) + + def test_password_change_mismatch(self): + """change password""" + view = views.ChangePassword.as_view() + password_hash = self.local_user.password + request = self.factory.post("", {"password": "hi", "confirm-password": "hihi"}) + request.user = self.local_user + view(request) + self.assertEqual(self.local_user.password, password_hash) diff --git a/bookwyrm/tests/views/preferences/test_delete_user.py b/bookwyrm/tests/views/preferences/test_delete_user.py new file mode 100644 index 00000000..40a28d44 --- /dev/null +++ b/bookwyrm/tests/views/preferences/test_delete_user.py @@ -0,0 +1,89 @@ +""" test for app action functionality """ +import json +from unittest.mock import patch +from tidylib import tidy_document + +from django.contrib.sessions.middleware import SessionMiddleware +from django.template.response import TemplateResponse +from django.test import TestCase +from django.test.client import RequestFactory + +from bookwyrm import forms, models, views + + +@patch("bookwyrm.suggested_users.remove_user_task.delay") +class DeleteUserViews(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" + ): + 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" + ) + + self.book = models.Edition.objects.create( + title="test", parent_work=models.Work.objects.create(title="test work") + ) + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"), patch( + "bookwyrm.activitystreams.add_book_statuses_task.delay" + ): + models.ShelfBook.objects.create( + book=self.book, + user=self.local_user, + shelf=self.local_user.shelf_set.first(), + ) + + models.SiteSettings.objects.create() + + def test_delete_user_page(self, _): + """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) + html = result.render() + _, errors = tidy_document(html.content) + if errors: + raise Exception(errors) + self.assertEqual(result.status_code, 200) + + @patch("bookwyrm.suggested_users.rerank_suggestions_task") + def test_delete_user(self, *_): + """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" + ) + + self.local_user.refresh_from_db() + self.assertFalse(self.local_user.is_active) + self.assertEqual(self.local_user.deactivation_reason, "self_deletion") diff --git a/bookwyrm/tests/views/test_edit_user.py b/bookwyrm/tests/views/preferences/test_edit_user.py similarity index 67% rename from bookwyrm/tests/views/test_edit_user.py rename to bookwyrm/tests/views/preferences/test_edit_user.py index 749b78a0..99648bcc 100644 --- a/bookwyrm/tests/views/test_edit_user.py +++ b/bookwyrm/tests/views/preferences/test_edit_user.py @@ -1,12 +1,10 @@ """ test for app action functionality """ -import json import pathlib from unittest.mock import patch from PIL import Image from tidylib import tidy_document from django.contrib.auth.models import AnonymousUser -from django.contrib.sessions.middleware import SessionMiddleware from django.core.files.base import ContentFile from django.core.files.uploadedfile import SimpleUploadedFile from django.template.response import TemplateResponse @@ -122,62 +120,7 @@ class EditUserViews(TestCase): ) image = Image.open(image_file) - result = views.edit_user.crop_avatar(image) + result = views.preferences.edit_user.crop_avatar(image) self.assertIsInstance(result, ContentFile) image_result = Image.open(result) self.assertEqual(image_result.size, (120, 120)) - - def test_change_password_page(self, _): - """there are so many views, this just makes sure it LOADS""" - view = views.ChangePassword.as_view() - request = self.factory.get("") - request.user = self.local_user - result = view(request) - self.assertIsInstance(result, TemplateResponse) - html = result.render() - _, errors = tidy_document(html.content) - if errors: - raise Exception(errors) - self.assertEqual(result.status_code, 200) - - def test_delete_user_page(self, _): - """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) - html = result.render() - _, errors = tidy_document(html.content) - if errors: - raise Exception(errors) - self.assertEqual(result.status_code, 200) - - @patch("bookwyrm.suggested_users.rerank_suggestions_task") - def test_delete_user(self, *_): - """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" - ) - - self.local_user.refresh_from_db() - self.assertFalse(self.local_user.is_active) - self.assertEqual(self.local_user.deactivation_reason, "self_deletion") diff --git a/bookwyrm/tests/views/test_password.py b/bookwyrm/tests/views/test_password.py index 3a1b591d..47d8bb27 100644 --- a/bookwyrm/tests/views/test_password.py +++ b/bookwyrm/tests/views/test_password.py @@ -95,33 +95,3 @@ class PasswordViews(TestCase): resp = view(request, code.code) resp.render() self.assertTrue(models.PasswordReset.objects.exists()) - - def test_password_change_get(self): - """there are so many views, this just makes sure it LOADS""" - view = views.ChangePassword.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) - - def test_password_change(self): - """change password""" - view = views.ChangePassword.as_view() - password_hash = self.local_user.password - request = self.factory.post("", {"password": "hi", "confirm-password": "hi"}) - request.user = self.local_user - with patch("bookwyrm.views.password.login"): - view(request) - self.assertNotEqual(self.local_user.password, password_hash) - - def test_password_change_mismatch(self): - """change password""" - view = views.ChangePassword.as_view() - password_hash = self.local_user.password - request = self.factory.post("", {"password": "hi", "confirm-password": "hihi"}) - request.user = self.local_user - view(request) - self.assertEqual(self.local_user.password, password_hash)