Browse Source

Improve patch_user_acl testing utility and get_user_status tests

rafalp 6 years ago
parent
commit
8e63ac7ae0

+ 30 - 9
misago/acl/test.py

@@ -6,25 +6,49 @@ from .useracl import get_user_acl
 __all__ = ["patch_user_acl"]
 __all__ = ["patch_user_acl"]
 
 
 
 
-class PatchUserACL:
+class patch_user_acl:
+    """Testing utility that patches get_user_acl results
+
+    Patch should be a dict or callable.
+    Can be used as decorator or context manager.
+    """
+    _global_patch = None
+    _user_patches = {}
+
+    def __init__(self, global_patch=None):
+        self._global_patch = global_patch
+
     def patch_user_acl(self, user, patch):
     def patch_user_acl(self, user, patch):
-        self.patches[user.id] = patch
+        self._user_patches[user.id] = patch
 
 
     def patched_get_user_acl(self, user, cache_versions):
     def patched_get_user_acl(self, user, cache_versions):
         user_acl = get_user_acl(user, cache_versions)
         user_acl = get_user_acl(user, cache_versions)
-        user_acl.update(self.patches.get(user.id, {}))
+        self.apply_acl_patches(user, user_acl)
         return user_acl
         return user_acl
 
 
+    def apply_acl_patches(self, user, user_acl):
+        if self._global_patch:
+            self.apply_acl_patch(user, user_acl, self._global_patch)
+        if user.id in self._user_patches:
+            user_acl_patch = self._user_patches[user.id]
+            self.apply_acl_patch(user, user_acl, user_acl_patch)
+
+    def apply_acl_patch(self, user, user_acl, acl_patch):
+        if callable(acl_patch):
+            acl_patch(user, user_acl)
+        else:
+            user_acl.update(acl_patch)
+
     def __enter__(self):
     def __enter__(self):
-        self.patches = {}
+        return self
 
 
     def __exit__(self, *_):
     def __exit__(self, *_):
-        self.patches = {}
+        self._user_patches = {}
 
 
     def __call__(self, f):
     def __call__(self, f):
         @wraps(f)
         @wraps(f)
         def inner(*args, **kwargs):
         def inner(*args, **kwargs):
-            with self as context:
+            with self:
                 with patch(
                 with patch(
                     "misago.acl.useracl.get_user_acl",
                     "misago.acl.useracl.get_user_acl",
                     side_effect=self.patched_get_user_acl,
                     side_effect=self.patched_get_user_acl,
@@ -33,6 +57,3 @@ class PatchUserACL:
                     return f(*new_args, **kwargs)
                     return f(*new_args, **kwargs)
         
         
         return inner
         return inner
-
-
-patch_user_acl = PatchUserACL()

+ 71 - 0
misago/acl/tests/test_patching_user_acl.py

@@ -0,0 +1,71 @@
+from django.contrib.auth import get_user_model
+from django.test import TestCase
+
+from misago.acl import useracl
+from misago.acl.test import patch_user_acl
+
+User = get_user_model()
+
+cache_versions = {"acl": "abcdefgh"}
+
+
+def callable_acl_patch(user, user_acl):
+    user_acl["patched_for_user_id"] = user.id
+
+
+class PatchingUserACLInTestsTests(TestCase):
+    @patch_user_acl()
+    def test_decorator_adds_patching_function_to_test(self, patch_user_acl):
+        assert patch_user_acl
+
+    @patch_user_acl()
+    def test_patching_function_changes_user_permission_value(self, patch_user_acl):
+        user = User.objects.create_user("User", "user@example.com")
+        patch_user_acl(user, {"can_rename_users": 123})
+        user_acl = useracl.get_user_acl(user, cache_versions)
+        assert user_acl["can_rename_users"] == 123
+
+    @patch_user_acl()
+    def test_patching_function_adds_user_permission(self, patch_user_acl):
+        user = User.objects.create_user("User", "user@example.com")
+        patch_user_acl(user, {"new_user_permission": 123})
+        user_acl = useracl.get_user_acl(user, cache_versions)
+        assert user_acl["new_user_permission"] == 123
+
+    def test_acl_patches_are_removed_after_test(self):
+        user = User.objects.create_user("User", "user@example.com")
+
+        @patch_user_acl()
+        def test_function(patch_user_acl):
+            patch_user_acl(user, {"is_patched": True})
+            user_acl = useracl.get_user_acl(user, cache_versions)
+            assert user_acl["is_patched"]
+
+        user_acl = useracl.get_user_acl(user, cache_versions)
+        assert "is_patched" not in user_acl
+    
+    @patch_user_acl({"is_patched": True})
+    def test_decorator_given_global_patch_patches_all_users_acls(self, _):
+        user = User.objects.create_user("User", "user@example.com")
+        user_acl = useracl.get_user_acl(user, cache_versions)
+        assert user_acl["is_patched"]
+
+    @patch_user_acl(callable_acl_patch)
+    def test_callable_global_patch_is_called_with_user_and_user_acl(self, _):
+        user = User.objects.create_user("User", "user@example.com")
+        user_acl = useracl.get_user_acl(user, cache_versions)
+        assert user_acl["patched_for_user_id"] == user.id
+
+    @patch_user_acl({"is_patched": True})
+    def test_patching_function_overrides_global_patch(self, patch_user_acl):
+        user = User.objects.create_user("User", "user@example.com")
+        patch_user_acl(user, {"is_patched": 123})
+        user_acl = useracl.get_user_acl(user, cache_versions)
+        assert user_acl["is_patched"] == 123
+
+    @patch_user_acl()
+    def test_callable_user_patch_is_called_with_user_and_user_acl(self, patch_user_acl):
+        user = User.objects.create_user("User", "user@example.com")
+        patch_user_acl(user, callable_acl_patch)
+        user_acl = useracl.get_user_acl(user, cache_versions)
+        assert user_acl["patched_for_user_id"] == user.id

+ 0 - 42
misago/acl/tests/test_patching_user_acl_in_tests.py

@@ -1,42 +0,0 @@
-from django.contrib.auth import get_user_model
-from django.test import TestCase
-
-from misago.acl import useracl
-from misago.acl.test import patch_user_acl
-
-User = get_user_model()
-
-cache_versions = {"acl": "abcdefgh"}
-
-
-class PatchingUserACLInTestsTests(TestCase):
-    @patch_user_acl
-    def test_decorator_adds_patching_function_to_test(self, patch_user_acl):
-        assert patch_user_acl
-
-    @patch_user_acl
-    def test_patching_function_changes_user_permission_value(self, patch_user_acl):
-        user = User.objects.create_user("User", "user@example.com")
-        patch_user_acl(user, {"can_rename_users": 123})
-        user_acl = useracl.get_user_acl(user, cache_versions)
-        assert user_acl["can_rename_users"] == 123
-
-    @patch_user_acl
-    def test_patching_function_adds_user_permission(self, patch_user_acl):
-        user = User.objects.create_user("User", "user@example.com")
-        patch_user_acl(user, {"new_user_permission": 123})
-        user_acl = useracl.get_user_acl(user, cache_versions)
-        assert user_acl["new_user_permission"] == 123
-
-    def test_acl_patches_are_removed_after_test(self):
-        user = User.objects.create_user("User", "user@example.com")
-
-        @patch_user_acl
-        def test_function(patch_user_acl):
-            patch_user_acl(user, {"is_patched": True})
-            user_acl = useracl.get_user_acl(user, cache_versions)
-            assert user_acl["is_patched"]
-
-        user_acl = useracl.get_user_acl(user, cache_versions)
-        assert "is_patched" not in user_acl
-    

+ 45 - 0
misago/users/tests/test_getting_user_status.py

@@ -0,0 +1,45 @@
+from unittest.mock import Mock
+
+from django.contrib.auth import get_user_model
+
+from misago.users.online.utils import get_user_status
+from misago.users.testutils import AuthenticatedUserTestCase
+
+User = get_user_model()
+
+
+class GetUserStatusTests(AuthenticatedUserTestCase):
+    def setUp(self):
+        super().setUp()
+        self.other_user = User.objects.create_user('Tyrael', 't123@test.com', 'pass123')
+
+    def test_get_visible_user_status_returns_online(self):
+        request = Mock(
+            user=self.user,
+            user_acl={'can_see_hidden_users': False},
+            cache_versions={"bans": "abcdefgh"},
+        )
+        assert get_user_status(request, self.other_user)["is_online"]
+
+    def test_get_hidden_user_status_without_seeing_hidden_permission_returns_offline(self):
+        """get_user_status has no showstopper for hidden user"""
+        self.other_user.is_hiding_presence = True
+        self.other_user.save()
+
+        request = Mock(
+            user=self.user,
+            user_acl={'can_see_hidden_users': False},
+            cache_versions={"bans": "abcdefgh"},
+        )
+        assert get_user_status(request, self.other_user)["is_hidden"]
+
+    def test_get_hidden_user_status_with_seeing_hidden_permission_returns_online_hidden(self):
+        self.other_user.is_hiding_presence = True
+        self.other_user.save()
+
+        request = Mock(
+            user=self.user,
+            user_acl={'can_see_hidden_users': True},
+            cache_versions={"bans": "abcdefgh"},
+        )
+        assert get_user_status(request, self.other_user)["is_online_hidden"]