Просмотр исходного кода

Convert user admin tests to pytest

rafalp 6 лет назад
Родитель
Сommit
20adc69d4c
1 измененных файлов с 337 добавлено и 411 удалено
  1. 337 411
      misago/users/admin/tests/test_users.py

+ 337 - 411
misago/users/admin/tests/test_users.py

@@ -1,18 +1,12 @@
 import pytest
 from django.contrib.auth import get_user_model
-from django.core import mail
 from django.urls import reverse
 
 from ....acl.models import Role
-from ....admin.test import AdminTestCase
-from ....categories.models import Category
 from ....legal.models import Agreement
 from ....legal.utils import save_user_agreement_acceptance
 from ....test import assert_contains
-from ....threads.test import post_thread, reply_thread
-from ...datadownloads import request_user_data_download
-from ...models import Ban, DataDownload, Rank
-from ...test import create_test_user
+from ...models import Rank
 from ...utils import hash_email
 
 User = get_user_model()
@@ -160,7 +154,7 @@ def test_edit_form_changes_user_username(admin_client, user):
     form_data = get_default_edit_form_data(user)
     form_data["username"] = "NewUsername"
 
-    response = admin_client.post(
+    admin_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
         data=form_data,
     )
@@ -174,7 +168,7 @@ def test_editing_user_username_creates_entry_in_username_history(admin_client, u
     form_data = get_default_edit_form_data(user)
     form_data["username"] = "NewUsername"
 
-    response = admin_client.post(
+    admin_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
         data=form_data,
     )
@@ -182,11 +176,24 @@ def test_editing_user_username_creates_entry_in_username_history(admin_client, u
     assert user.namechanges.exists()
 
 
+def test_not_editing_user_username_doesnt_create_entry_in_username_history(
+    admin_client, user
+):
+    form_data = get_default_edit_form_data(user)
+
+    admin_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
+        data=form_data,
+    )
+
+    assert not user.namechanges.exists()
+
+
 def test_edit_form_changes_user_email(admin_client, user):
     form_data = get_default_edit_form_data(user)
     form_data["email"] = "edited@example.com"
 
-    response = admin_client.post(
+    admin_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
         data=form_data,
     )
@@ -196,12 +203,113 @@ def test_edit_form_changes_user_email(admin_client, user):
     assert user.email_hash == hash_email("edited@example.com")
 
 
+def test_edit_form_doesnt_remove_current_user_password_if_new_password_is_omitted(
+    admin_client, user, user_password
+):
+    form_data = get_default_edit_form_data(user)
+
+    admin_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
+        data=form_data,
+    )
+
+    user.refresh_from_db()
+    assert user.check_password(user_password)
+
+
+def test_edit_form_displays_message_for_user_with_unusable_password(
+    admin_client, user, user_password
+):
+    user.set_password(None)
+    user.save()
+
+    response = admin_client.get(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
+    )
+
+    assert_contains(response, "alert-has-unusable-password")
+
+
+def test_edit_form_doesnt_set_password_for_user_with_unusable_password_if_none_is_given(
+    admin_client, user, user_password
+):
+    user.set_password(None)
+    user.save()
+
+    form_data = get_default_edit_form_data(user)
+
+    admin_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
+        data=form_data,
+    )
+
+    user.refresh_from_db()
+    assert not user.has_usable_password()
+
+
+def test_edit_form_sets_password_for_user_with_unusable_password(
+    admin_client, user, user_password
+):
+    user.set_password(None)
+    user.save()
+
+    form_data = get_default_edit_form_data(user)
+    form_data["new_password"] = user_password
+
+    admin_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
+        data=form_data,
+    )
+
+    user.refresh_from_db()
+    assert user.check_password(user_password)
+
+
+def test_edit_form_changes_user_password(admin_client, user):
+    form_data = get_default_edit_form_data(user)
+    form_data["new_password"] = "newpassword123"
+
+    admin_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
+        data=form_data,
+    )
+
+    user.refresh_from_db()
+    assert user.check_password("newpassword123")
+
+
+def test_edit_form_preserves_whitespace_in_new_user_password(admin_client, user):
+    form_data = get_default_edit_form_data(user)
+    form_data["new_password"] = "  newpassword123  "
+
+    admin_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
+        data=form_data,
+    )
+
+    user.refresh_from_db()
+    assert user.check_password("  newpassword123  ")
+
+
+def test_admin_editing_their_own_password_is_not_logged_out(admin_client, superuser):
+    form_data = get_default_edit_form_data(superuser)
+    form_data["new_password"] = "newpassword123"
+
+    admin_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": superuser.pk}),
+        data=form_data,
+    )
+
+    user = admin_client.get("/api/auth/")
+    assert user.json()["id"] == superuser.id
+
+
 def test_staff_user_cannot_degrade_superuser_to_staff_user(staff_client, superuser):
     form_data = get_default_edit_form_data(superuser)
     form_data["is_staff"] = "1"
     form_data.pop("is_superuser")
 
-    response = staff_client.post(
+    staff_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": superuser.pk}),
         data=form_data,
     )
@@ -216,7 +324,7 @@ def test_staff_user_cannot_degrade_superuser_to_regular_user(staff_client, super
     form_data.pop("is_staff")
     form_data.pop("is_superuser")
 
-    response = staff_client.post(
+    staff_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": superuser.pk}),
         data=form_data,
     )
@@ -233,7 +341,7 @@ def test_staff_user_cannot_promote_other_staff_user_to_superuser(
     form_data["is_staff"] = "1"
     form_data["is_superuser"] = "1"
 
-    response = staff_client.post(
+    staff_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": other_staffuser.pk}),
         data=form_data,
     )
@@ -247,7 +355,7 @@ def test_staff_user_cannot_promote_regular_user_to_staff(staff_client, user):
     form_data = get_default_edit_form_data(user)
     form_data["is_staff"] = "1"
 
-    response = staff_client.post(
+    staff_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
         data=form_data,
     )
@@ -260,7 +368,7 @@ def test_staff_user_cannot_promote_regular_user_to_superuser(staff_client, user)
     form_data = get_default_edit_form_data(user)
     form_data["is_superuser"] = "1"
 
-    response = staff_client.post(
+    staff_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
         data=form_data,
     )
@@ -273,7 +381,7 @@ def test_staff_user_cannot_promote_themselves_to_superuser(staff_client, staffus
     form_data = get_default_edit_form_data(staffuser)
     form_data["is_superuser"] = "1"
 
-    response = staff_client.post(
+    staff_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": staffuser.pk}),
         data=form_data,
     )
@@ -286,7 +394,7 @@ def test_staff_user_cannot_degrade_themselves_to_regular_user(staff_client, staf
     form_data = get_default_edit_form_data(staffuser)
     form_data.pop("is_staff")
 
-    response = staff_client.post(
+    staff_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": staffuser.pk}),
         data=form_data,
     )
@@ -299,7 +407,7 @@ def test_superuser_cannot_degrade_themselves_to_staff_user(admin_client, superus
     form_data = get_default_edit_form_data(superuser)
     form_data.pop("is_superuser")
 
-    response = admin_client.post(
+    admin_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": superuser.pk}),
         data=form_data,
     )
@@ -313,7 +421,7 @@ def test_superuser_cannot_degrade_themselves_to_regular_user(admin_client, super
     form_data.pop("is_staff")
     form_data.pop("is_superuser")
 
-    response = admin_client.post(
+    admin_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": superuser.pk}),
         data=form_data,
     )
@@ -329,7 +437,7 @@ def test_superuser_can_degrade_other_superuser_to_staff_user(
     form_data = get_default_edit_form_data(other_superuser)
     form_data.pop("is_superuser")
 
-    response = admin_client.post(
+    admin_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": other_superuser.pk}),
         data=form_data,
     )
@@ -346,7 +454,7 @@ def test_superuser_can_degrade_other_superuser_to_regular_user(
     form_data.pop("is_staff")
     form_data.pop("is_superuser")
 
-    response = admin_client.post(
+    admin_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": other_superuser.pk}),
         data=form_data,
     )
@@ -360,7 +468,7 @@ def test_superuser_can_promote_to_staff_user_to_superuser(admin_client, staffuse
     form_data = get_default_edit_form_data(staffuser)
     form_data["is_superuser"] = "1"
 
-    response = admin_client.post(
+    admin_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": staffuser.pk}),
         data=form_data,
     )
@@ -374,7 +482,7 @@ def test_superuser_can_promote_to_regular_user_to_staff_user(admin_client, user)
     form_data = get_default_edit_form_data(user)
     form_data["is_staff"] = "1"
 
-    response = admin_client.post(
+    admin_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
         data=form_data,
     )
@@ -389,7 +497,7 @@ def test_superuser_can_promote_to_regular_user_to_superuser(admin_client, user):
     form_data["is_staff"] = "1"
     form_data["is_superuser"] = "1"
 
-    response = admin_client.post(
+    admin_client.post(
         reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
         data=form_data,
     )
@@ -399,390 +507,208 @@ def test_superuser_can_promote_to_regular_user_to_superuser(admin_client, user):
     assert user.is_superuser
 
 
-class UserAdminTests(AdminTestCase):
-    def test_edit_view(self):
-        """edit user view changes account"""
-        test_user = create_test_user("User", "user@example.com")
-        test_link = reverse(
-            "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
-        )
-
-        response = self.client.get(test_link)
-        self.assertEqual(response.status_code, 200)
-
-        response = self.client.post(
-            test_link,
-            data={
-                "username": "NewUsername",
-                "rank": str(test_user.rank_id),
-                "roles": str(test_user.roles.all()[0].pk),
-                "email": "edited@example.com",
-                "new_password": "newpass123",
-                "staff_level": "0",
-                "signature": "Hello world!",
-                "is_signature_locked": "1",
-                "is_hiding_presence": "0",
-                "limits_private_thread_invites_to": "0",
-                "signature_lock_staff_message": "Staff message",
-                "signature_lock_user_message": "User message",
-                "subscribe_to_started_threads": "2",
-                "subscribe_to_replied_threads": "2",
-            },
-        )
-        self.assertEqual(response.status_code, 302)
-
-        updated_user = User.objects.get(pk=test_user.pk)
-        self.assertTrue(updated_user.check_password("newpass123"))
-        self.assertEqual(updated_user.username, "NewUsername")
-        self.assertEqual(updated_user.slug, "newusername")
-
-        User.objects.get_by_username("NewUsername")
-        User.objects.get_by_email("edited@example.com")
-
-    def test_edit_dont_change_username(self):
-        """
-        If username wasn't changed, don't touch user's username, slug or history
-
-        This is regression test for issue #640
-        """
-        test_user = create_test_user("User", "user@example.com")
-        test_link = reverse(
-            "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
-        )
-
-        response = self.client.get(test_link)
-        self.assertEqual(response.status_code, 200)
-
-        response = self.client.post(
-            test_link,
-            data={
-                "username": "User",
-                "rank": str(test_user.rank_id),
-                "roles": str(test_user.roles.all()[0].pk),
-                "email": "edited@example.com",
-                "signature": "Hello world!",
-                "is_signature_locked": "1",
-                "is_hiding_presence": "0",
-                "limits_private_thread_invites_to": "0",
-                "signature_lock_staff_message": "Staff message",
-                "signature_lock_user_message": "User message",
-                "subscribe_to_started_threads": "2",
-                "subscribe_to_replied_threads": "2",
-            },
-        )
-        self.assertEqual(response.status_code, 302)
-
-        updated_user = User.objects.get(pk=test_user.pk)
-        self.assertEqual(updated_user.username, "User")
-        self.assertEqual(updated_user.slug, "user")
-        self.assertEqual(updated_user.namechanges.count(), 0)
-
-    def test_edit_change_password_whitespaces(self):
-        """edit user view changes account password to include whitespaces"""
-        test_user = create_test_user("User", "user@example.com")
-        test_link = reverse(
-            "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
-        )
-
-        response = self.client.get(test_link)
-        self.assertEqual(response.status_code, 200)
-
-        response = self.client.post(
-            test_link,
-            data={
-                "username": "NewUsername",
-                "rank": str(test_user.rank_id),
-                "roles": str(test_user.roles.all()[0].pk),
-                "email": "edited@example.com",
-                "new_password": " newpass123 ",
-                "staff_level": "0",
-                "signature": "Hello world!",
-                "is_signature_locked": "1",
-                "is_hiding_presence": "0",
-                "limits_private_thread_invites_to": "0",
-                "signature_lock_staff_message": "Staff message",
-                "signature_lock_user_message": "User message",
-                "subscribe_to_started_threads": "2",
-                "subscribe_to_replied_threads": "2",
-            },
-        )
-        self.assertEqual(response.status_code, 302)
-
-        updated_user = User.objects.get(pk=test_user.pk)
-        self.assertTrue(updated_user.check_password(" newpass123 "))
-        self.assertEqual(updated_user.username, "NewUsername")
-        self.assertEqual(updated_user.slug, "newusername")
-
-        User.objects.get_by_username("NewUsername")
-        User.objects.get_by_email("edited@example.com")
-
-    def test_edit_disable_user(self):
-        """edit user view allows admin to disable non admin"""
-        self.user.is_superuser = False
-        self.user.save()
-
-        test_user = create_test_user("User", "user@example.com")
-        test_link = reverse(
-            "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
-        )
-
-        response = self.client.get(test_link)
-        self.assertContains(response, 'id="id_is_active_1"')
-        self.assertContains(response, 'id="id_is_active_staff_message"')
-
-        response = self.client.post(
-            test_link,
-            data={
-                "username": "NewUsername",
-                "rank": str(test_user.rank_id),
-                "roles": str(test_user.roles.all()[0].pk),
-                "email": "edited@example.com",
-                "is_staff": "0",
-                "is_superuser": "0",
-                "signature": "Hello world!",
-                "is_signature_locked": "1",
-                "is_hiding_presence": "0",
-                "limits_private_thread_invites_to": "0",
-                "signature_lock_staff_message": "Staff message",
-                "signature_lock_user_message": "User message",
-                "subscribe_to_started_threads": "2",
-                "subscribe_to_replied_threads": "2",
-                "is_active": "0",
-                "is_active_staff_message": "Disabled in test!",
-            },
-        )
-        self.assertEqual(response.status_code, 302)
-
-        updated_user = User.objects.get(pk=test_user.pk)
-        self.assertFalse(updated_user.is_active)
-        self.assertEqual(updated_user.is_active_staff_message, "Disabled in test!")
-
-    def test_edit_superuser_disable_admin(self):
-        """edit user view allows admin to disable non admin"""
-        self.user.is_superuser = True
-        self.user.save()
-
-        test_user = create_test_user("User", "user@example.com")
-
-        test_user.is_staff = True
-        test_user.save()
-
-        test_link = reverse(
-            "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
-        )
-
-        response = self.client.get(test_link)
-        self.assertContains(response, 'id="id_is_active_1"')
-        self.assertContains(response, 'id="id_is_active_staff_message"')
-
-        response = self.client.post(
-            test_link,
-            data={
-                "username": "NewUsername",
-                "rank": str(test_user.rank_id),
-                "roles": str(test_user.roles.all()[0].pk),
-                "email": "edited@example.com",
-                "is_staff": "1",
-                "is_superuser": "0",
-                "signature": "Hello world!",
-                "is_signature_locked": "1",
-                "is_hiding_presence": "0",
-                "limits_private_thread_invites_to": "0",
-                "signature_lock_staff_message": "Staff message",
-                "signature_lock_user_message": "User message",
-                "subscribe_to_started_threads": "2",
-                "subscribe_to_replied_threads": "2",
-                "is_active": "0",
-                "is_active_staff_message": "Disabled in test!",
-            },
-        )
-        self.assertEqual(response.status_code, 302)
-
-        updated_user = User.objects.get(pk=test_user.pk)
-        self.assertFalse(updated_user.is_active)
-        self.assertEqual(updated_user.is_active_staff_message, "Disabled in test!")
-
-    def test_edit_admin_cant_disable_admin(self):
-        """edit user view disallows admin to disable admin"""
-        self.user.is_superuser = False
-        self.user.save()
-
-        test_user = create_test_user("User", "user@example.com")
-
-        test_user.is_staff = True
-        test_user.save()
-
-        test_link = reverse(
-            "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
-        )
-
-        response = self.client.get(test_link)
-        self.assertNotContains(response, 'id="id_is_active_1"')
-        self.assertNotContains(response, 'id="id_is_active_staff_message"')
-
-        response = self.client.post(
-            test_link,
-            data={
-                "username": "NewUsername",
-                "rank": str(test_user.rank_id),
-                "roles": str(test_user.roles.all()[0].pk),
-                "email": "edited@example.com",
-                "is_staff": "1",
-                "is_superuser": "0",
-                "signature": "Hello world!",
-                "is_signature_locked": "1",
-                "is_hiding_presence": "0",
-                "limits_private_thread_invites_to": "0",
-                "signature_lock_staff_message": "Staff message",
-                "signature_lock_user_message": "User message",
-                "subscribe_to_started_threads": "2",
-                "subscribe_to_replied_threads": "2",
-                "is_active": "0",
-                "is_active_staff_message": "Disabled in test!",
-            },
-        )
-        self.assertEqual(response.status_code, 302)
-
-        updated_user = User.objects.get(pk=test_user.pk)
-        self.assertTrue(updated_user.is_active)
-        self.assertFalse(updated_user.is_active_staff_message)
-
-    def test_edit_is_deleting_account_cant_reactivate(self):
-        """users deleting own accounts can't be reactivated"""
-        test_user = create_test_user("User", "user@example.com")
-        test_user.mark_for_delete()
-
-        test_link = reverse(
-            "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
-        )
-
-        response = self.client.get(test_link)
-        self.assertNotContains(response, 'id="id_is_active_1"')
-        self.assertNotContains(response, 'id="id_is_active_staff_message"')
-
-        response = self.client.post(
-            test_link,
-            data={
-                "username": "NewUsername",
-                "rank": str(test_user.rank_id),
-                "roles": str(test_user.roles.all()[0].pk),
-                "email": "edited@example.com",
-                "is_staff": "1",
-                "is_superuser": "0",
-                "signature": "Hello world!",
-                "is_signature_locked": "1",
-                "is_hiding_presence": "0",
-                "limits_private_thread_invites_to": "0",
-                "signature_lock_staff_message": "Staff message",
-                "signature_lock_user_message": "User message",
-                "subscribe_to_started_threads": "2",
-                "subscribe_to_replied_threads": "2",
-                "is_active": "1",
-            },
-        )
-        self.assertEqual(response.status_code, 302)
-
-        updated_user = User.objects.get(pk=test_user.pk)
-        self.assertFalse(updated_user.is_active)
-        self.assertTrue(updated_user.is_deleting_account)
-
-    def test_edit_unusable_password(self):
-        """admin edit form handles unusable passwords and lets setting new password"""
-        test_user = create_test_user("User", "user@example.com")
-        self.assertFalse(test_user.has_usable_password())
-
-        test_link = reverse(
-            "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
-        )
-
-        response = self.client.get(test_link)
-        self.assertContains(response, "alert-has-unusable-password")
-
-        response = self.client.post(
-            test_link,
-            data={
-                "username": "NewUsername",
-                "rank": str(test_user.rank_id),
-                "roles": str(test_user.roles.all()[0].pk),
-                "email": "edited@example.com",
-                "new_password": "pass123",
-                "is_staff": "1",
-                "is_superuser": "0",
-                "signature": "Hello world!",
-                "is_signature_locked": "1",
-                "is_hiding_presence": "0",
-                "limits_private_thread_invites_to": "0",
-                "signature_lock_staff_message": "Staff message",
-                "signature_lock_user_message": "User message",
-                "subscribe_to_started_threads": "2",
-                "subscribe_to_replied_threads": "2",
-                "is_active": "1",
-            },
-        )
-        self.assertEqual(response.status_code, 302)
-
-        updated_user = User.objects.get(pk=test_user.pk)
-        self.assertTrue(updated_user.has_usable_password())
-
-    def test_edit_keep_unusable_password(self):
-        """
-        admin edit form handles unusable passwords and lets admin leave them unchanged
-        """
-        test_user = create_test_user("User", "user@example.com")
-        self.assertFalse(test_user.has_usable_password())
-
-        test_link = reverse(
-            "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
-        )
-
-        response = self.client.get(test_link)
-        self.assertContains(response, "alert-has-unusable-password")
-
-        response = self.client.post(
-            test_link,
-            data={
-                "username": "NewUsername",
-                "rank": str(test_user.rank_id),
-                "roles": str(test_user.roles.all()[0].pk),
-                "email": "edited@example.com",
-                "is_staff": "1",
-                "is_superuser": "0",
-                "signature": "Hello world!",
-                "is_signature_locked": "1",
-                "is_hiding_presence": "0",
-                "limits_private_thread_invites_to": "0",
-                "signature_lock_staff_message": "Staff message",
-                "signature_lock_user_message": "User message",
-                "subscribe_to_started_threads": "2",
-                "subscribe_to_replied_threads": "2",
-                "is_active": "1",
-            },
-        )
-        self.assertEqual(response.status_code, 302)
-
-        updated_user = User.objects.get(pk=test_user.pk)
-        self.assertFalse(updated_user.has_usable_password())
-
-    def test_edit_agreements_list(self):
-        """edit view displays list of user's agreements"""
-        test_user = create_test_user("User", "user@example.com")
-        test_link = reverse(
-            "misago:admin:users:accounts:edit", kwargs={"pk": test_user.pk}
-        )
-
-        agreement = Agreement.objects.create(
-            type=Agreement.TYPE_TOS,
-            title="Test agreement!",
-            text="Lorem ipsum!",
-            is_active=True,
-        )
-
-        response = self.client.get(test_link)
-        self.assertEqual(response.status_code, 200)
-        self.assertNotContains(response, agreement.title)
-
-        save_user_agreement_acceptance(test_user, agreement, commit=True)
-
-        response = self.client.get(test_link)
-        self.assertEqual(response.status_code, 200)
-        self.assertContains(response, agreement.title)
+def test_superuser_can_disable_other_superuser_account(admin_client, other_superuser):
+    form_data = get_default_edit_form_data(other_superuser)
+    form_data["is_active"] = "0"
+    form_data["is_active_staff_message"] = "Test message"
+
+    admin_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": other_superuser.pk}),
+        data=form_data,
+    )
+
+    other_superuser.refresh_from_db()
+    assert not other_superuser.is_active
+    assert other_superuser.is_active_staff_message == "Test message"
+
+
+def test_superuser_can_reactivate_other_superuser_account(
+    admin_client, other_superuser
+):
+    other_superuser.is_active = False
+    other_superuser.save()
+
+    form_data = get_default_edit_form_data(other_superuser)
+    form_data["is_active"] = "1"
+
+    admin_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": other_superuser.pk}),
+        data=form_data,
+    )
+
+    other_superuser.refresh_from_db()
+    assert other_superuser.is_active
+
+
+def test_superuser_can_disable_staff_user_account(admin_client, staffuser):
+    form_data = get_default_edit_form_data(staffuser)
+    form_data["is_active"] = "0"
+    form_data["is_active_staff_message"] = "Test message"
+
+    admin_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": staffuser.pk}),
+        data=form_data,
+    )
+
+    staffuser.refresh_from_db()
+    assert not staffuser.is_active
+    assert staffuser.is_active_staff_message == "Test message"
+
+
+def test_superuser_can_reactivate_staff_user_account(admin_client, staffuser):
+    staffuser.is_active = False
+    staffuser.save()
+
+    form_data = get_default_edit_form_data(staffuser)
+    form_data["is_active"] = "1"
+
+    admin_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": staffuser.pk}),
+        data=form_data,
+    )
+
+    staffuser.refresh_from_db()
+    assert staffuser.is_active
+
+
+def test_superuser_can_disable_regular_user_account(admin_client, user):
+    form_data = get_default_edit_form_data(user)
+    form_data["is_active"] = "0"
+    form_data["is_active_staff_message"] = "Test message"
+
+    admin_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
+        data=form_data,
+    )
+
+    user.refresh_from_db()
+    assert not user.is_active
+    assert user.is_active_staff_message == "Test message"
+
+
+def test_superuser_can_reactivate_regular_user_account(admin_client, user):
+    user.is_active = False
+    user.save()
+
+    form_data = get_default_edit_form_data(user)
+    form_data["is_active"] = "1"
+
+    admin_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
+        data=form_data,
+    )
+
+    user.refresh_from_db()
+    assert user.is_active
+
+
+def test_staff_user_can_disable_regular_user_account(staff_client, user):
+    form_data = get_default_edit_form_data(user)
+    form_data["is_active"] = "0"
+
+    staff_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
+        data=form_data,
+    )
+
+    user.refresh_from_db()
+    assert not user.is_active
+
+
+def test_staff_user_can_reactivate_regular_user_account(staff_client, user):
+    user.is_active = False
+    user.save()
+
+    form_data = get_default_edit_form_data(user)
+    form_data["is_active"] = "1"
+
+    staff_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
+        data=form_data,
+    )
+
+    user.refresh_from_db()
+    assert user.is_active
+
+
+def test_superuser_cant_disable_their_own_account(admin_client, superuser):
+    form_data = get_default_edit_form_data(superuser)
+    form_data["is_active"] = "0"
+
+    admin_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": superuser.pk}),
+        data=form_data,
+    )
+
+    superuser.refresh_from_db()
+    assert superuser.is_active
+
+
+def test_staff_user_cant_disable_their_own_account(staff_client, staffuser):
+    form_data = get_default_edit_form_data(staffuser)
+    form_data["is_active"] = "0"
+
+    staff_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": staffuser.pk}),
+        data=form_data,
+    )
+
+    staffuser.refresh_from_db()
+    assert staffuser.is_active
+
+
+def test_staff_user_cant_disable_superuser_account(staff_client, superuser):
+    form_data = get_default_edit_form_data(superuser)
+    form_data["is_active"] = "0"
+
+    staff_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": superuser.pk}),
+        data=form_data,
+    )
+
+    superuser.refresh_from_db()
+    assert superuser.is_active
+
+
+def test_staff_user_cant_disable_other_staff_user_account(staff_client, other_staffuser):
+    form_data = get_default_edit_form_data(other_staffuser)
+    form_data["is_active"] = "0"
+
+    staff_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": other_staffuser.pk}),
+        data=form_data,
+    )
+
+    other_staffuser.refresh_from_db()
+    assert other_staffuser.is_active
+
+
+def test_user_deleting_their_account_cant_be_reactivated(admin_client, user):
+    user.mark_for_delete()
+
+    form_data = get_default_edit_form_data(user)
+    form_data["is_active"] = "1"
+
+    admin_client.post(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
+        data=form_data,
+    )
+
+    user.refresh_from_db()
+    assert not user.is_active
+
+
+def test_user_agreements_are_displayed_on_edit_form(admin_client, user):
+    agreement = Agreement.objects.create(
+        type=Agreement.TYPE_TOS,
+        title="Test agreement!",
+        text="Lorem ipsum!",
+        is_active=True,
+    )
+
+    save_user_agreement_acceptance(user, agreement, commit=True)
+
+    response = admin_client.get(
+        reverse("misago:admin:users:accounts:edit", kwargs={"pk": user.pk}),
+    )
+    assert_contains(response, agreement.title)