added tests for internal views

This commit is contained in:
Oliver Zander 2025-08-21 10:42:55 +02:00 committed by Tobias Herre
parent c295f7182b
commit 295f41ff75
4 changed files with 83 additions and 9 deletions

View File

@ -1,2 +1,2 @@
from .models import ModelTestCase from .models import ModelTestCase
from .views import ViewTestCase from .views import AuthenticatedViewTestCase, AnonymousViewTestCase

View File

@ -1,9 +1,10 @@
from django.test import TestCase from django.test import TestCase
from input.utils.testing import request from input.models import Library
from input.utils.testing import create_superuser, login, request
class ViewTestCase(TestCase): class AnonymousViewTestCase(TestCase):
def test_index(self): def test_index(self):
response = request(self, 'index') response = request(self, 'index')
@ -91,3 +92,42 @@ class ViewTestCase(TestCase):
'duration': 'Test', 'duration': 'Test',
'notes': '', 'notes': '',
}) })
class AuthenticatedViewTestCase(TestCase):
@classmethod
def setUpTestData(cls):
cls.user = create_superuser('staff')
def setUp(self):
login(self)
def test_export(self):
request(self, 'export')
def helper_auth_deny(self, view, expected):
obj = Library.objects.create(library='Test')
request(self, view, args=[obj.type, obj.id])
obj.refresh_from_db(fields=['granted'])
self.assertEqual(obj.granted, expected)
def helper_auth_deny_error(self, view):
response = request(self, view, args=['TEST', 1])
self.assertContains(response, 'ERROR')
def test_authorize(self):
self.helper_auth_deny('authorize', True)
def test_authorize_error(self):
self.helper_auth_deny_error('authorize')
def test_deny(self):
self.helper_auth_deny('deny', False)
def test_deny_error(self):
self.helper_auth_deny_error('deny')

View File

@ -1,5 +1,7 @@
from typing import Any, Iterable, Mapping, Union, Tuple, Protocol from typing import Any, Iterable, Mapping, Union, Tuple, Protocol
from django.apps import apps
from django.conf import settings
from django.http import HttpRequest, HttpResponse from django.http import HttpRequest, HttpResponse
from django.http.response import HttpResponseRedirectBase, StreamingHttpResponse from django.http.response import HttpResponseRedirectBase, StreamingHttpResponse
from django.shortcuts import resolve_url from django.shortcuts import resolve_url
@ -112,3 +114,39 @@ def request(
test_case.assertEqual(response.status_code, status_code, msg=msg) test_case.assertEqual(response.status_code, status_code, msg=msg)
return response return response
def login(test_case: SimpleTestCase, user=None, password: str = None) -> bool:
"""
Logs in the user trying to use the raw password or the given password.
Force logs in the user when no password is found.
"""
user = user or getattr(test_case, 'user')
password = password or getattr(user, 'raw_password', password)
if password is None:
return test_case.client.force_login(user=user) or True
return test_case.client.login(username=user.username, password=password)
def create_user(username: str, *, model=None, **kwargs):
model = model or apps.get_model(settings.AUTH_USER_MODEL)
password = kwargs.setdefault('password', 'P4sSW0rD')
kwargs.setdefault('email', f'{username}@test.case')
kwargs.setdefault(model.USERNAME_FIELD, username)
user = model.objects.create_user(**kwargs)
user.raw_password = password
return user
def create_superuser(username: str, **kwargs):
kwargs['is_superuser'] = True
kwargs['is_staff'] = True
return create_user(username, **kwargs)

View File

@ -36,8 +36,6 @@ def auth_deny(choice, pk, auth):
MODELS[choice].set_granted(pk, auth) MODELS[choice].set_granted(pk, auth)
return False
@login_required @login_required
def export(request): def export(request):
@ -50,8 +48,7 @@ def authorize(request, choice, pk):
'''If IF grant a support they click a link in a mail which leads here. '''If IF grant a support they click a link in a mail which leads here.
We write the granted field in the database here and set a timestamp.''' We write the granted field in the database here and set a timestamp.'''
ret = auth_deny(choice, pk, True) if ret := auth_deny(choice, pk, True):
if ret:
return ret return ret
else: else:
return HttpResponse(f"AUTHORIZED! choice: {choice}, pk: {pk}") return HttpResponse(f"AUTHORIZED! choice: {choice}, pk: {pk}")
@ -62,8 +59,7 @@ def deny(request, choice, pk):
'''If IF denies a support they click a link in a mail which leads here '''If IF denies a support they click a link in a mail which leads here
We write the granted field in the database here.''' We write the granted field in the database here.'''
ret = auth_deny(choice, pk, False) if ret := auth_deny(choice, pk, False):
if ret:
return ret return ret
else: else:
return HttpResponse(f"DENIED! choice: {choice}, pk: {pk}") return HttpResponse(f"DENIED! choice: {choice}, pk: {pk}")