Как я могу правильно протестировать swagger_auto_schema для методов, request_body и ответов в drf-задаче с помощью pytest?

Я работаю над тестированием Django REST Framework (DRF) CartViewSet с использованием pytest, и мне нужно проверить свойства swagger_auto_schema, такие как HTTP-метод, тело запроса и ответы на различные действия (например, добавление, удаление, очистка).

У меня есть следующий код в моем CartViewSet:

class CartViewSet(GenericViewSet, RetrieveModelMixin, ListModelMixin):
    # Other viewset code...

    @swagger_auto_schema(
        method="post",
        request_body=AddToCartSerializer,
        responses={
            201: openapi.Response(description="Item added successfully."),
            400: openapi.Response(description="Invalid input data"),
        },
    )
    @action(detail=False, methods=["post"], url_path="add")
    def add(self, request):
        # Logic for adding an item to the cart
        pass

Теперь я хочу написать модульный тест pytest, чтобы проверить следующее для метода add:

  1. HTTP-метод: Убедитесь, что метод swagger_auto_schema является POST.
  2. Текст запроса: Убедитесь, что для текста запроса установлен правильный сериализатор (AddToCartSerializer).
  3. Ответы: Убедитесь, что коды состояния ответов (201 и 400) и их описания заданы правильно.

Не мог бы кто-нибудь подсказать мне, как правильно протестировать свойства swagger_auto_schema для метода, тела запроса и ответов в pytest?

Мы были бы очень признательны за любую помощь или разъяснения!

Если вы следовали краткому руководству по началу работы, чтобы добавить drf-yasg в свой проект, вы добавили конечную точку, которая возвращает всю схему в формате json.

Это выглядит так:

path('swagger<format>/', schema_view.without_ui(cache_timeout=0), name='schema-json'),

Если вы вызываете конечную точку локально, вы можете получить полезную нагрузку со всем, что отображается в пользовательском интерфейсе swagger.

В полезной нагрузке есть поле пути, которое содержит список существующих конечных точек, под которым у вас есть http-методы для каждого из них, а также возможные коды ответов.

В другом поле компоненты вы можете найти список имен сериализаторов.

Теперь, учитывая все это, вы можете вызывать конечную точку в своих тестах и утверждать части текста ответа, подтверждающие изменения в пользовательском интерфейсе swagger.

Это можно протестировать следующим образом.

def test_cart_viewset_add_swagger_documentation(self):
        """Test that the CartViewSet's add method has proper Swagger documentation."""
        # Get the add method from CartViewSet
        add_method = CartViewSet.add

        # Access the swagger schema from the method
        schema_info = getattr(add_method, "_swagger_auto_schema", {})

        # The structure has 'post' as the key since it's a POST method
        method_info = schema_info.get("post", {})

        # Verify request body is defined
        request_body = method_info.get("request_body", None)
        assert request_body == AddToCartSerializer

        # Verify responses are defined
        responses = method_info.get("responses", {})
        assert 201 in responses
        assert 400 in responses

        # Verify response content
        success_response = responses.get(201)
        assert isinstance(success_response, openapi.Response)
        assert success_response.description == "Item added successfully."

        error_response = responses.get(400)
        assert isinstance(error_response, openapi.Response)
        assert error_response.description == "Invalid input data"
Вернуться на верх