異なるユーザーのすべてのページへのアクセスをテストするテストクラスがあります。
これらのアクセスは、私の各ビューのデコレータによって定義されます。
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