Search code examples
djangotestingpermission-denied

Django Test - I'm not able to get PermissionDenied on Client() get


I'm not finding the way to get when the PermissionDenied error is raised.

This test try to catch a Permission Denied on a Django, it is expected just to accept staff user or return a 403 status_code

This is the code:

from django.contrib.auth.models import User
from django.core.exceptions import PermissionDenied
from django.test import Client, TestCase
from django.urls import reverse

from scrapers.models import Scraper

class PublicWebTestCase(TestCase):

    def setUp(self):
        # Every test needs a client.
        self.client = Client()
        # Create staff user (no staff)
        self.user = User.objects.create_user('juan', '[email protected]', 'juan')
        self.staff_user = User.objects.create_user(
            'victor',
            '[email protected]',
            'Vitor',
            is_staff=True
        )
        self.client.raise_request_exception = True
        # crear un scraper para que haya una vista de el
        self.scraper = Scraper.objects.create(
            name='My Scraper',
            folder="X",
        )
        self.page_url = reverse('scrapers-page')

    def test_scrapers_page_for_anon_user(self):
        """ Scrapers view as anonymous user """
        self.assertRaises(PermissionDenied, self.client.get, self.page_url)

And this is the result I get:

Found 1 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
Forbidden (Permission denied): /scrapers/
Traceback (most recent call last):
  File "/home/lugezz/Dev/lll/env/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
  File "/home/lugezz/Dev/lll/env/lib/python3.10/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/lugezz/Dev/lll/env/lib/python3.10/site-packages/django/views/generic/base.py", line 103, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/lugezz/Dev/lll/stud/scrapers/mixins.py", line 14, in dispatch
    raise PermissionDenied
django.core.exceptions.PermissionDenied
F
======================================================================
FAIL: test_scrapers_page_for_anon_user (core.tests.test_scrapers_page_privacy.PublicWebTestCase)
Scrapers view as anonymous user
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/lugezz/Dev/lll/stud/core/tests/test_scrapers_page_privacy.py", line 42, in test_scrapers_page_for_anon_user
    self.assertRaises(PermissionDenied, self.client.get, self.page_url)
AssertionError: PermissionDenied not raised by get

----------------------------------------------------------------------
Ran 1 test in 0.394s

FAILED (failures=1)

What am I missing?? Thanks in advance.


Solution

  • I had this same problem. The answer is that when the PermissionDenied() gets raised, the Django middleware catches it and turns that into a 403 Access Denied HTTP response. Change your test to something more like:

    response = self.client.get(self.page_url)
    self.assertEqual(403, response.status_code)