В тестовой среде Django отсутствуют Group и Permissions: но я создал их в миграции
Я пытаюсь исправить кучу тестов в кодовой базе, которые не работают из-за отсутствия разрешений (например: update ticket). Странно то, что у меня есть миграция, которая создает группы аутентификации и добавляет соответствующие разрешения к группам.
Мне кажется, что я упускаю что-то фундаментальное в настройке тестовой среды Django - я думал, что она применяет миграции перед запуском тестов, и что миграции являются более предпочтительным способом, чем фиксы для чего-то вроде этого, где группа всегда должна 1. существовать и 2. иметь это Разрешение.
Миграция
from django.db import migrations
from django.core.management.sql import emit_post_migrate_signal
def create_groups(apps, schema_editor):
# Ensure permissions and content types have been created.
db_alias = schema_editor.connection.alias
emit_post_migrate_signal(2, False, db_alias)
Permission = apps.get_model("auth", "Permission")
Group = apps.get_model("auth", "Group")
# Create CC group
permission = Permission.objects.get(
codename="handle_ticket", content_type__model="ticket"
)
corps = Group.objects.create(name="CC")
corps.permissions.add(permission)
def remove_groups(apps, schema_editor):
Group = apps.get_model("auth", "Group")
cc = Group.objects.filter(name="CC").delete()
class Migration(migrations.Migration):
dependencies = [
("my_app", "previous"),
]
operations = [
migrations.RunPython(create_groups, remove_groups),
]
Тест, который завершается с ошибкой Auth.
def test_update_ticket(self):
ticket = factories.TicketFactory(notes="Old notes")
cc_group = Group.objects.get(name="CC")
assignee = factories.UserFactory()
assignee.groups.set([cc_group])
self.client.force_login(assignee)
result = self.client.post(
reverse("ticket_update", args=[ticket.id]), data={"notes": "New notes"}
)
print(assignee.groups.all(), assignee.get_all_permissions(), assignee.has_perm("my_app.handle_ticket"))
#### PRINTS: Group(CC), QuerySet[], False
#### the QuerySet shouldn't be empty, and .has_perm should be True
Благодаря комментарию я понял, что проблема была в том, что я использовал тестовую базу данных, к которой не были применены миграции.
Чтобы решить эту проблему, либо проверьте ваш файл pytest.ini
и убедитесь, что --reuse-db
не записано в поле addopts
(примечание: это может перестраивать тестовую базу данных каждый раз, когда вы запускаете тест, поэтому это может замедлить ваше тестирование), либо добавьте --create-db
к команде pytest, когда вы запускаете тест из терминала (чтобы перестроить базу данных для этого конкретного запуска теста).