Добавлены классы ответов
This commit is contained in:
@@ -10,3 +10,4 @@
|
||||
|
||||
from .core_enum_tests import CoreEnumTests
|
||||
from .core_exception_tests import CoreExceptionTests
|
||||
from .core_response_tests import CoreResponseTests
|
||||
|
||||
98
net/xeaf/rack/tests/core/core_response_tests.py
Normal file
98
net/xeaf/rack/tests/core/core_response_tests.py
Normal file
@@ -0,0 +1,98 @@
|
||||
# DRF Rack
|
||||
# Библиотека классов расширений для Django REST Framework
|
||||
#
|
||||
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
|
||||
# Все права защищены. Лицензия: MIT
|
||||
|
||||
"""
|
||||
Описание класса CoreResponseTests
|
||||
"""
|
||||
|
||||
from django.test import SimpleTestCase
|
||||
from rest_framework import status
|
||||
|
||||
from net.xeaf.rack.core import CoreResponse
|
||||
|
||||
|
||||
class CoreResponseTests(SimpleTestCase):
|
||||
"""
|
||||
Тесты для класса CoreResponse
|
||||
"""
|
||||
|
||||
def test_init_success_format(self):
|
||||
"""
|
||||
Проверяет формат успешного ответа (код < 400): данные улетают в 'data'
|
||||
"""
|
||||
|
||||
test_data = {"user_id": 42}
|
||||
internal_code = status.HTTP_200_OK
|
||||
external_code = status.HTTP_200_OK
|
||||
|
||||
response = CoreResponse(
|
||||
internal_status=internal_code,
|
||||
external_status=external_code,
|
||||
data=test_data
|
||||
)
|
||||
|
||||
# Проверяем внешний HTTP-статус в заголовках
|
||||
self.assertEqual(response.status_code, external_code)
|
||||
|
||||
# Проверяем структуру тела JSON-ответа (внутреннее свойство DRF .data)
|
||||
self.assertEqual(response.data["status"], internal_code)
|
||||
self.assertIn("timestamp", response.data)
|
||||
# Так как это успех, данные обязаны быть в ключе "data"
|
||||
self.assertEqual(response.data["data"], test_data)
|
||||
self.assertNotIn("detail", response.data)
|
||||
self.assertNotIn("meta", response.data)
|
||||
|
||||
def test_init_error_format(self):
|
||||
"""
|
||||
Проверяет формат ответа с ошибкой (код >= 400): данные улетают в 'detail'
|
||||
"""
|
||||
|
||||
error_msg = "Некорректные параметры запроса"
|
||||
internal_code = status.HTTP_400_BAD_REQUEST
|
||||
external_code = status.HTTP_200_OK # Маскируем под 200 OK для фронтенда
|
||||
|
||||
response = CoreResponse(
|
||||
internal_status=internal_code,
|
||||
external_status=external_code,
|
||||
data=error_msg
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, external_code)
|
||||
self.assertEqual(response.data["status"], internal_code)
|
||||
# Так как это ошибка, данные обязаны быть в ключе "detail"
|
||||
self.assertEqual(response.data["detail"], error_msg)
|
||||
self.assertNotIn("data", response.data)
|
||||
|
||||
def test_init_with_meta(self):
|
||||
"""
|
||||
Проверяет корректную интеграцию словаря meta в тело ответа
|
||||
"""
|
||||
|
||||
meta_data = {"page": 1, "has_next": False}
|
||||
|
||||
response = CoreResponse(
|
||||
internal_status=status.HTTP_200_OK,
|
||||
external_status=status.HTTP_200_OK,
|
||||
data={"items": []},
|
||||
meta=meta_data
|
||||
)
|
||||
|
||||
self.assertIn("meta", response.data)
|
||||
self.assertEqual(response.data["meta"], meta_data)
|
||||
|
||||
def test_init_with_empty_data(self):
|
||||
"""
|
||||
Проверяет, что если data=None или пустой, ключи 'data' и 'detail' не создаются
|
||||
"""
|
||||
|
||||
response = CoreResponse(
|
||||
internal_status=status.HTTP_204_NO_CONTENT,
|
||||
external_status=status.HTTP_204_NO_CONTENT,
|
||||
data=None
|
||||
)
|
||||
|
||||
self.assertNotIn("data", response.data)
|
||||
self.assertNotIn("detail", response.data)
|
||||
Reference in New Issue
Block a user