from functools import wraps from unittest.mock import patch from .useracl import get_user_acl class PatchUserACL: def patch_user_acl(self, user, patch): self.patches[user.id] = patch def patched_get_user_acl(self, user, cache_versions): user_acl = get_user_acl(user, cache_versions) user_acl.update(self.patches.get(user.id, {})) return user_acl def __enter__(self): self.patches = {} def __exit__(self, *_): self.patches = {} def __call__(self, f): @wraps(f) def inner(*args, **kwargs): with self as context: with patch( "misago.acl.useracl.get_user_acl", side_effect=self.patched_get_user_acl, ): return f(*args, self.patch_user_acl, **kwargs) return inner patch_user_acl = PatchUserACL()