Тестирование 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, но я не понял, как это сделать.