Files
drf-rack/net/xeaf/rack/tests/models/responses/exception_response_tests.py

65 lines
2.9 KiB
Python

# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Описание класса ExceptionResponseTests
"""
from django.test import SimpleTestCase
from rest_framework import status
from net.xeaf.rack.core import CoreException
from net.xeaf.rack.models.responses import ExceptionResponse
class ExceptionResponseTests(SimpleTestCase):
"""
Тесты для класса ExceptionResponse
"""
def test_init_with_standard_exception(self):
"""
Если у исключения is_pure_status() == False,
внешний HTTP статус должен быть 200 OK, но внутренний — реальный код ошибки,
а данные обязаны лежать в ключе 'detail'
"""
# Симулируем обычную ошибку (is_pure_status по умолчанию выдает False)
exc = CoreException(status_code=status.HTTP_400_BAD_REQUEST, detail="Неверный логин")
response = ExceptionResponse(exc=exc)
# Проверяем маскировку под 200 OK для фронтенда в заголовках
self.assertEqual(response.status_code, status.HTTP_200_OK)
# Проверяем JSON контракт
self.assertEqual(response.data["status"], status.HTTP_400_BAD_REQUEST)
# Так как реальный статус ошибки >= 400, данные ДОЛЖНЫ быть в detail
self.assertEqual(response.data["detail"], "Неверный логин")
self.assertNotIn("data", response.data)
def test_init_with_pure_http_exception(self):
"""
Если у исключения is_pure_status() == True,
и внешний HTTP статус, и внутренний код должны быть равны коду ошибки
"""
# Создаем тестовый класс, переопределяющий метод на True (как твой CriticalException)
class PureException(CoreException):
def is_pure_status(self) -> bool:
return True
exc = PureException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Крах БД")
response = ExceptionResponse(exc=exc)
# Проверяем, что маскировка отключилась и в заголовках честный HTTP статус
self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
# Внутренний контракт тоже содержит реальный код ошибки
self.assertEqual(response.data["status"], status.HTTP_500_INTERNAL_SERVER_ERROR)
self.assertEqual(response.data["detail"], "Крах БД")