65 lines
2.9 KiB
Python
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"], "Крах БД")
|