# DRF Rack # Библиотека классов расширений для Django REST Framework # # Автор: Николай В. Анохин # Все права защищены. Лицензия: 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"], "Крах БД")