Добавлены классы ответов
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
# 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"], "Крах БД")
|
||||
Reference in New Issue
Block a user