0

異なるユーザーのすべてのページへのアクセスをテストするテストクラスがあります。

これらのアクセスは、私の各ビューのデコレータによって定義されます。

views.py:

@login_required
def afficher(request):
    ...
    ...

@creation_permission_required
def ajouter(request):
    ...
    ...

これらのデコレータのいくつかは私が定義しています。

decorators.py:

def creation_permission_required(function):
    @wraps(function)
    @login_required
    def decorateur(request, *k, **a):
        user = get_object_or_404(User, username__iexact=request.user.username)
        if user.is_superuser or user.get_profile().creation:
            return function(request, *k, **a)
        else:
            return HttpResponseRedirect(reverse("non_autorise"))# <--- PROBLEM
    return decorateur
    return function

それらをテストするときは、status_code属性を使用して、ユーザーがページにアクセスできるかどうかを確認します

test.py:

c = Client()
c.login(username='aucun', password='aucun')
for url in self.url_aucun:
    r = c.get(reverse(url['url'], args=url['args']))
    self.assertEqual(r.status_code, 200)
for url in self.url_creation:
    r = c.get(reverse(url['url'], args=url['args']))
    self.assertEqual(r.status_code, 302)      # <--- SECOND PROBLEM 

ユーザーがページにアクセスする権限を持っていない場合、ページは403エラー(禁止)を返す必要があります。302ではなく403をテストするにはどうすればよいですか?

編集:HttpResponseForbidden(reverse( "non_autorise"))を使用しようとしましたが、コンテンツを取得できませんでした。そこで、HttpResponseRedirectの正確なコピーである独自のHttpResponseを作成しようとしましたが、別のstatus_code(403)を使用してもコンテンツが取得されませんでした...

decorators.py:

class HttpResponseTest(HttpResponse):
    def __init__(self, redirect_to):
        super(HttpResponseTest, self).__init__()
        self['Location'] = iri_to_uri(redirect_to)
        self.status_code = 403

def creation_permission_required(function):
    @wraps(function)
    @login_required
    def decorateur(request, *k, **a):
        user = get_object_or_404(User, username__iexact=request.user.username)
        if user.is_superuser or user.get_profile().creation:
            return function(request, *k, **a)
        else:
            return HttpResponseTest(reverse("non_autorise"))# <--- PROBLEM
    return decorateur
    return function
4

3 に答える 3

1

If you want a 403 response, you can raise a PermissionDenied exception in your decorator if you are using Django 1.4. Alternatively, you can return a HttpResponseForbidden in your decorator. You will also have to build a custom login_required decorator.

于 2012-07-03T09:41:58.567 に答える
0
self.assertEqual(r.status_code, 403)
于 2012-07-03T09:12:00.317 に答える
0

I had this same issue and solved it by instructing the test get() to follow the redirect using follow=True. Using BlueMagma's example it would look something like this:

for url in self.url_creation:
    r = c.get(reverse(url['url'], args=url['args']), follow=True)
    self.assertEqual(r.status_code, 403)      # <--- SECOND PROBLEM NO MORE!!!

Hope this helps someone else!

于 2013-06-06T21:03:12.217 に答える