|
1 | 1 | import hashlib
|
2 | 2 |
|
3 |
| -from django.contrib.auth.models import User |
| 3 | +from django.contrib.auth.models import AnonymousUser, User |
4 | 4 | from django.core.cache import cache
|
5 | 5 | from django.test import TestCase, override_settings
|
6 | 6 | from django_hosts.resolvers import reverse
|
7 | 7 |
|
| 8 | +from accounts.forms import DeleteProfileForm |
| 9 | +from foundation import models as foundationmodels |
8 | 10 | from tracdb.models import Revision, Ticket, TicketChange
|
9 | 11 | from tracdb.testutils import TracDBCreateDatabaseMixin
|
10 | 12 |
|
@@ -189,3 +191,50 @@ def test_profile_view_reversal(self):
|
189 | 191 | """
|
190 | 192 | for username in ["asdf", "@asdf", "asd-f", "as.df", "as+df"]:
|
191 | 193 | reverse("user_profile", host="www", args=[username])
|
| 194 | + |
| 195 | + |
| 196 | +class UserDeletionTestCase(TestCase): |
| 197 | + def create_user_and_form(self, bound=True, **userkwargs): |
| 198 | + userkwargs.setdefault("username", "test") |
| 199 | + userkwargs. setdefault( "email", "[email protected]") |
| 200 | + userkwargs.setdefault("password", "password") |
| 201 | + |
| 202 | + formkwargs = {"user": User.objects.create_user(**userkwargs)} |
| 203 | + if bound: |
| 204 | + formkwargs["data"] = {} |
| 205 | + |
| 206 | + return DeleteProfileForm(**formkwargs) |
| 207 | + |
| 208 | + def test_deletion(self): |
| 209 | + form = self.create_user_and_form() |
| 210 | + self.assertFormError(form, None, []) |
| 211 | + form.delete() |
| 212 | + self.assertQuerySetEqual(User.objects.all(), []) |
| 213 | + |
| 214 | + def test_anonymous_user_error(self): |
| 215 | + self.assertRaises(TypeError, DeleteProfileForm, user=AnonymousUser) |
| 216 | + |
| 217 | + def test_deletion_staff_forbidden(self): |
| 218 | + form = self.create_user_and_form(is_staff=True) |
| 219 | + self.assertFormError(form, None, ["Staff users cannot be deleted"]) |
| 220 | + |
| 221 | + def test_user_with_protected_data(self): |
| 222 | + form = self.create_user_and_form() |
| 223 | + form.user.boardmember_set.create( |
| 224 | + office=foundationmodels.Office.objects.create(name="test"), |
| 225 | + term=foundationmodels.Term.objects.create(year=2000), |
| 226 | + ) |
| 227 | + form.delete() |
| 228 | + self.assertFormError( |
| 229 | + form, None, ["User has protected data and cannot be deleted"] |
| 230 | + ) |
| 231 | + |
| 232 | + def test_form_delete_method_requires_valid_form(self): |
| 233 | + form = self.create_user_and_form(is_staff=True) |
| 234 | + self.assertRaises(form.InvalidFormError, form.delete) |
| 235 | + |
| 236 | + def test_view_deletion_also_logs_out(self): |
| 237 | + user = self.create_user_and_form().user |
| 238 | + self.client.force_login(user) |
| 239 | + self.client.post(reverse("delete_profile")) |
| 240 | + self.assertEqual(self.client.cookies["sessionid"].value, "") |
0 commit comments