Как сгенерировать 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
Вернуться на верх