|
19 | 19 | import django
|
20 | 20 | from django.test.utils import override_settings
|
21 | 21 | from mock import MagicMock, PropertyMock, patch
|
| 22 | +from geonode.base.models import ResourceBase |
| 23 | +from geonode.groups.models import GroupMember, GroupProfile |
22 | 24 | from geonode.tests.base import GeoNodeBaseTestSupport
|
23 | 25 |
|
24 | 26 | from django.core import mail
|
@@ -58,6 +60,7 @@ def setUp(self):
|
58 | 60 | self.permission_type = ("view", "download", "edit")
|
59 | 61 | self.groups = Group.objects.all()[:3]
|
60 | 62 | self.group_ids = ",".join(str(element.pk) for element in self.groups)
|
| 63 | + self.bar = GroupProfile.objects.get(slug="bar") |
61 | 64 |
|
62 | 65 | def test_redirect_on_get_request(self):
|
63 | 66 | """
|
@@ -786,3 +789,125 @@ def test_users_api_patch_username(self):
|
786 | 789 | # username cannot be updated
|
787 | 790 | self.assertEqual(response.status_code, 400)
|
788 | 791 | self.assertTrue("username cannot be updated" in response.json()["errors"])
|
| 792 | + |
| 793 | + @override_settings( |
| 794 | + USER_DELETION_RULES=["geonode.people.utils.user_has_resources", "geonode.people.utils.user_is_manager"] |
| 795 | + ) |
| 796 | + def test_valid_delete(self): |
| 797 | + # create a new user |
| 798 | + tim = get_user_model().objects.create(username="tim") |
| 799 | + |
| 800 | + admin = get_user_model().objects.get(username="admin") |
| 801 | + |
| 802 | + self.assertTrue(self.client.login(username="admin", password="admin")) |
| 803 | + |
| 804 | + # admin wants to delete tim |
| 805 | + # Admin is superuser or staff |
| 806 | + self.assertTrue(admin.is_superuser or admin.is_staff) |
| 807 | + # check that tim is not manager |
| 808 | + # nor has any resources |
| 809 | + self.assertFalse(ResourceBase.objects.filter(owner_id=tim.pk).exists()) |
| 810 | + self.assertFalse(GroupMember.objects.filter(user_id=tim.pk, role="manager").exists()) |
| 811 | + |
| 812 | + url = f"{reverse('users-list')}/{tim.pk}" |
| 813 | + response = self.client.delete(url, content_type="application/json") |
| 814 | + |
| 815 | + # admin is permitted to delete |
| 816 | + self.assertEqual(response.status_code, 200) |
| 817 | + # tim has been deleted |
| 818 | + self.assertEqual(get_user_model().objects.filter(username="tim").first(), None) |
| 819 | + |
| 820 | + @override_settings(USER_DELETION_RULES=[]) |
| 821 | + @patch("geonode.people.utils.user_deletion_modules", []) |
| 822 | + def test_delete_without_validators(self): |
| 823 | + |
| 824 | + norman = get_user_model().objects.get(username="norman") |
| 825 | + admin = get_user_model().objects.get(username="admin") |
| 826 | + |
| 827 | + self.assertTrue(self.client.login(username="admin", password="admin")) |
| 828 | + |
| 829 | + # admin wants to delete norman but norman is already promoted |
| 830 | + # Admin is superuser or staff |
| 831 | + self.assertTrue(admin.is_superuser or admin.is_staff) |
| 832 | + |
| 833 | + # Make sure norman is not a member |
| 834 | + self.assertFalse(self.bar.user_is_member(norman)) |
| 835 | + |
| 836 | + # Add norman to the self.bar group |
| 837 | + self.bar.join(norman) |
| 838 | + |
| 839 | + # Ensure norman is now a member |
| 840 | + self.assertTrue(self.bar.user_is_member(norman)) |
| 841 | + |
| 842 | + # promote norman to a manager |
| 843 | + self.bar.promote(norman) |
| 844 | + # Ensure norman is in the managers queryset |
| 845 | + self.assertTrue(norman in self.bar.get_managers()) |
| 846 | + |
| 847 | + url = f"{reverse('users-list')}/{norman.pk}" |
| 848 | + response = self.client.delete(url, content_type="application/json") |
| 849 | + |
| 850 | + # norman can be deleted because validator rules are not applied |
| 851 | + self.assertEqual(response.status_code, 200) |
| 852 | + self.assertEqual(get_user_model().objects.filter(username="norman").first(), None) |
| 853 | + |
| 854 | + @override_settings( |
| 855 | + USER_DELETION_RULES=["geonode.people.utils.user_has_resources", "geonode.people.utils.user_is_manager"] |
| 856 | + ) |
| 857 | + def test_delete_a_manger(self): |
| 858 | + norman = get_user_model().objects.get(username="norman") |
| 859 | + admin = get_user_model().objects.get(username="admin") |
| 860 | + |
| 861 | + self.assertTrue(self.client.login(username="admin", password="admin")) |
| 862 | + |
| 863 | + # admin wants to delete norman but norman is already promoted |
| 864 | + # Admin is superuser or staff |
| 865 | + self.assertTrue(admin.is_superuser or admin.is_staff) |
| 866 | + |
| 867 | + # Make sure norman is not a member |
| 868 | + self.assertFalse(self.bar.user_is_member(norman)) |
| 869 | + |
| 870 | + # Add norman to the self.bar group |
| 871 | + self.bar.join(norman) |
| 872 | + |
| 873 | + # Ensure norman is now a member |
| 874 | + self.assertTrue(self.bar.user_is_member(norman)) |
| 875 | + |
| 876 | + # promote norman to a manager |
| 877 | + self.bar.promote(norman) |
| 878 | + # Ensure norman is in the managers queryset |
| 879 | + self.assertTrue(norman in self.bar.get_managers()) |
| 880 | + |
| 881 | + url = f"{reverse('users-list')}/{norman.pk}" |
| 882 | + response = self.client.delete(url, content_type="application/json") |
| 883 | + |
| 884 | + # norman cant be deleted |
| 885 | + self.assertEqual(response.status_code, 403) |
| 886 | + self.assertNotEqual(get_user_model().objects.filter(username="norman").first(), None) |
| 887 | + # |
| 888 | + self.assertTrue("user_is_manager" in response.json()["errors"][0]) |
| 889 | + |
| 890 | + @override_settings(USER_DELETION_RULES=["geonode.people.utils.user_has_resources"]) |
| 891 | + def test_delete_a_user_with_resource(self): |
| 892 | + # create a new user |
| 893 | + bobby = get_user_model().objects.get(username="bobby") |
| 894 | + admin = get_user_model().objects.get(username="admin") |
| 895 | + |
| 896 | + self.assertTrue(self.client.login(username="admin", password="admin")) |
| 897 | + |
| 898 | + # admin wants to delete bobby |
| 899 | + # Admin is superuser or staff |
| 900 | + self.assertTrue(admin.is_superuser or admin.is_staff) |
| 901 | + # check that bobby is not manager |
| 902 | + # but he has resources already assigned |
| 903 | + self.assertTrue(ResourceBase.objects.filter(owner_id=bobby.pk).exists()) |
| 904 | + self.assertFalse(GroupMember.objects.filter(user_id=bobby.pk, role="manager").exists()) |
| 905 | + |
| 906 | + url = f"{reverse('users-list')}/{bobby.pk}" |
| 907 | + response = self.client.delete(url, content_type="application/json") |
| 908 | + |
| 909 | + # admin is permitted to delete |
| 910 | + self.assertEqual(response.status_code, 403) |
| 911 | + # bobby cant be deleted |
| 912 | + self.assertNotEqual(get_user_model().objects.filter(username="bobby").first(), None) |
| 913 | + self.assertTrue("user_has_resources" in response.json()["errors"][0]) |
0 commit comments