Как сгенерировать Django / Python тест для представления с LoginRequiredMixin и UserPassesTestMixin
Я уже некоторое время пытаюсь протестировать свое представление, которое я защитил от доступа с помощью LoginRequiredMixin и UserPassesTestMixin.
К сожалению, мне не удается написать соответствующий тест.
вот вид. Особенность в том, что пользователь должен не только войти в систему, но и принадлежать к группе "Администратор" или "Руководитель".
При такой комбинации мне еще не удалось написать тест.
Пожалуйста, кто может помочь мне. Вот мой взгляд:
class FeatureListView(LoginRequiredMixin, UserPassesTestMixin, ListView):
model = FeatureFilm
template_name = "project/feature-list.html"
def test_func(self):
if self.request.user.groups.filter(name="Administrator").exists():
return True
elif self.request.user.groups.filter(name="Supervisor").exists():
return True
elif self.request.user.groups.filter(name="Operator").exists():
return True
else:
return False
def handle_no_permission(self):
return redirect("access-denied")
и вот фрагмент url.py:
urlpatterns = [
path("feature/list/", FeatureListView.as_view(), name="feature-list"),
path(
"feature/<int:pk>/date",
FeatureDetailViewDate.as_view(),
name="feature-detail-date",
),
как бы вы протестировали этот FeatureListView и шаблон, к которому он принадлежит
большое спасибо!
Прежде всего, было бы лучше, если бы вы дали этим группам разрешение. Потому что django предлагает много хороших функций для проверки разрешений, а не для проверки групп (см. здесь). Вы можете дать администратору, руководителю и оператору одно и то же разрешение, а затем вместо проверки того, входит ли пользователь в одну из этих групп, вы просто проверите, имеет ли он это разрешение. Но поскольку вопрос был задан не об этом, вот, пожалуйста:
from django.test import TestCase
from django.test import Client
class TestFeatureListView(TestCase):
def _create_administrator(self):
u = Users.objects.create( <input for administrator> )
u.groups.add(administrator)
return u
def _create_supervisor(self):
u = Users.objects.create( <input for supervisor> )
u.groups.add(supervisor)
return u
def _create_operator(self):
u = Users.objects.create( <input for operator> )
u.groups.add(operator)
return u
def _create_normal_user(self):
return Users.objects.create( <input for normal_user> )
def test_users_with_access_rights(self):
users = [
self._create_administrator(),
self._create_supervisor(),
self._create_operator(),
]
for u in users:
c = Client() # initialize every iteration a new client
c.login(username=<username>, password=<password>)
response = c.get(reverse("appwithfeaturelist:feature-list"))
self.assertTemplateUsed(response, "project/feature-list.html")
def test_users_withOUT_access_rights(self):
u = self._create_normal_user()
self.client.login(username=<username>, password=<password>)
response = self.client.get(reverse("appwithfeaturelist:feature-list"), follow=True)
self.assertTemplateNotUsed(response, "project/feature-list.html")
self.assertRedirects(response, "/access-denied/")
def test_without_any_user(self):
response = self.client.get(reverse("appwithfeaturelist:feature-list"), follow=True)
self.assertTemplateNotUsed(response, "project/feature-list.html")
self.assertRedirects(response, "/access-denied/") # this is probably wrong and should test whether the redirect goes to something like a login page