В тестовой среде 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, когда вы запускаете тест из терминала (чтобы перестроить базу данных для этого конкретного запуска теста).

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