Как протестировать пользовательский декоратор Django с разными значениями?
У меня есть представление, основанное на функциях, вот такое:
@new_group_required("special_group", raise_exception=True)
def my_view(request):
<my code>
Я хотел бы проверить это, как если бы raise_exception
был установлен на False
, но я не могу понять через Google, как это сделать.
Некоторые люди рекомендуют использовать Mock
, но я довольно плохо знаком с Mock
и как я могу запустить my_view
, но изменить только атрибут этого декоратора.
Любая помощь будет принята с благодарностью!
Код декоратора выглядит следующим образом (очень похож на встроенный Permission
декоратор из Django):
def user_passes_test(
test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME
):
"""
Decorator for views that checks that the user passes the given test,
redirecting to the log-in page if necessary. The test should be a callable
that takes the user object and returns True if the user passes.
"""
def decorator(view_func):
@wraps(view_func)
def _wrapper_view(request, *args, **kwargs):
if test_func(request.user):
return view_func(request, *args, **kwargs)
path = request.build_absolute_uri()
resolved_login_url = resolve_url(login_url or settings.LOGIN_URL)
# If the login url is the same scheme and net location then just
# use the path as the "next" url.
login_scheme, login_netloc = urlparse(resolved_login_url)[:2]
current_scheme, current_netloc = urlparse(path)[:2]
if (not login_scheme or login_scheme == current_scheme) and (
not login_netloc or login_netloc == current_netloc
):
path = request.get_full_path()
from django.contrib.auth.views import redirect_to_login
return redirect_to_login(
path, resolved_login_url, redirect_field_name
)
return _wrapper_view
return decorator
def new_group_required(group, login_url=None, raise_exception=False):
"""
Decorator for views that checks whether a user has a particular group
enabled, redirecting to the log-in page if necessary.
If the raise_exception parameter is given the PermissionDenied exception
is raised.
"""
def check_groups(user):
if isinstance(group, str):
groups = (group,)
else:
groups = group
# First check if the user has the group (even anon users)
if user.has_groups(groups):
return True
# In case the 403 handler should be called raise the exception
if raise_exception:
raise PermissionDenied
# As the last resort, show the login form
return False
return user_passes_test(check_groups, login_url=login_url)
В настоящее время у меня есть подобный тест с User
, у которого нет Group
, и он проходит. Я просто пытаюсь проверить ситуацию, когда у пользователя нет Group
и убедиться, что он перенаправляет его на login_url
соответствующим образом, когда raise_exception
равно False.
def test_my_view_not_accessible_to_ungrouped_users(self):
self.client.force_login(user=self.user_without_group)
response = self.client.get("/my_app/my_view/")
self.assertEqual(response.status_code, 403)