How to test Django custom decorator with different values?

Viewed 14

I've got a function based view like this:

@new_group_required("special_group", raise_exception=True)
def my_view(request):
    <my code>

I'd like to test this as if the raise_exception was set to False but I can't seem to figure out through google how to do this.

Some people recommend using Mock but I'm pretty unfamiliar with Mock and how I can run my_view, but change just the attribute of that decorator.

Any help would be appreciated!

The decorator code looks like this (very similar to the built-in Permission decorator from 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)

I've currently got a test like this with a User that doesn't have a Group and it passes. I'm just trying to test the situation where a user doesn't have a Group and make sure it redirects them to the login_url appropriately when raise_exception is 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)
0 Answers
Related