Тестирование Django - объект группы не работает при использовании factory_boy

Я пытаюсь упростить тестирование с помощью factory_boy. Я хочу протестировать представления, которые зависят от некоторых групповых разрешений. Если я напишу тест, создав пользователя и группу в setUpTestData, я смогу заставить тест работать. Однако, если я создаю пользователя и группу с помощью factory_boy, не похоже, что разрешения установлены в тесте.

view

@method_decorator([login_required, teacher_required], name='dispatch')
class GradeBookSetupCreateView(PermissionRequiredMixin, UpdateView):
    raise_exceptions = True
    permission_required = 'gradebook.change_gradebooksetup'
    permission_denied_message = "You don't have access to this."

    form_class = GradeBookSetupForm
    model = GradeBookSetup

    success_url = "/gradebook/"

    def get_object(self, queryset=None):
        try:
            obj = GradeBookSetup.objects.get(user=self.request.user)
            return obj
        except:
            pass

Проблема с разрешением возникает из-за PermissionRequiredMixin и permission_required. Есть также разрешение в декораторе, но оно работает нормально.

Вот тест, который работает:

class GradeBookSetupTests(TestCase):

    @classmethod
    def setUpTestData(cls):
        cls.user = get_user_model().objects.create_user(
            username='teacher1',
            email='tester@email.com',
            password='tester123'
        )
        cls.user.is_active = True
        cls.user.is_teacher = True
        cls.user.save()
        teacher_group, created = Group.objects.get_or_create(name='teacher')
        teacher_group = Group.objects.get(name='teacher')

        content_type = ContentType.objects.get(
            app_label='gradebook', model='gradebooksetup')
        # get all permssions for this model
        perms = Permission.objects.filter(content_type=content_type)
        for p in perms:
            teacher_group.permissions.add(p)

        cls.user.groups.add(teacher_group)
        cls.user.save()
        print(cls.user.groups.filter(name='teacher').exists())
        my_g = cls.user.groups.all()
        for g in my_g:
            print(g)
        cls.gradeb = GradeBookSetupFactory(user=cls.user)

    def test_signup_template(self):
        self.client.login(username='teacher1', password='tester123')
        response = self.client.get(reverse('gradebook:gradebooksetup'))
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'gradebook/gradebooksetup_form.html')

Этот тест создает пользователя, создает группу, назначает разрешения группе, добавляет пользователя в группу, и утверждения проходят. Операторы печати возвращают True и teacher, чего я и ожидаю.

Следующий код использует factory_boy для создания пользователя и группы:

class SubscribedGroupFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = auth_models.Group

    name = 'teacher'


class TeacherFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = CustomUser

    is_teacher = True
    is_active = True
    username = 'teacher1'
    password = 'tester123'

    @factory.post_generation
    def groups(self, create, extracted, **kwargs):
        if not create:
            return

        if extracted:
            for group in extracted:
                self.groups.add(group)
                print(group)

class GradeBookSetupTests(TestCase):

    @classmethod
    def setUpTestData(cls):
        cls.user = TeacherFactory.create(
            groups=(SubscribedGroupFactory.create(),))
        teacher_group = Group.objects.get(name='teacher')

        content_type = ContentType.objects.get(
            app_label='gradebook', model='gradebooksetup')
        # get all permssions for this model
        perms = Permission.objects.filter(content_type=content_type)
        for p in perms:
            teacher_group.permissions.add(p)

        cls.user.groups.add(teacher_group)
        cls.user.save() # I'm not sure if this is needed
        print(cls.user.groups.filter(name='teacher').exists())
        my_g = cls.user.groups.all()
        for g in my_g:
            print(g)
        cls.gradeb = GradeBookSetupFactory(user=cls.user)

    def test_signup_template(self):
        self.client.login(username='teacher1', password='tester123')
        response = self.client.get(reverse('gradebook:gradebooksetup'))
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'gradebook/gradebooksetup_form.html')

При выполнении этого теста операторы печати также выводят True и teacher, что заставляет меня думать, что с пользователем/группой все в порядке. Однако разрешения не работают, и тест не проходит (404 редирект, потому что у пользователя нет разрешения на просмотр страницы). Что-то не так в том, как группа взаимодействует с разрешением.

Идеально я бы также добавил разрешения к группе внутри factory_boy, но я не понял, как это сделать.

Вернуться на верх