# DRF Rack # Библиотека классов расширений для Django REST Framework # # Автор: Николай В. Анохин # Все права защищены. Лицензия: MIT """ Описание класса CryptoTests """ from django.core.exceptions import ImproperlyConfigured from django.test import override_settings from django.test import SimpleTestCase from net.xeaf.rack.managers import ConfigurationManager class ConfigurationManagerTests(SimpleTestCase): """ Тесты для класса ConfigurationManager """ def test_get_string_returns_default_if_setting_missing(self) -> None: """ Должен вернуть дефолтное значение, если настройки нет в settings.py """ result = ConfigurationManager.get_string("NON_EXISTENT_STR_KEY", default="default_val") self.assertEqual(result, "default_val") @override_settings(EXISTING_STR_KEY="custom_val") def test_get_string_returns_custom_value(self) -> None: """ Должен успешно прочитать кастомную строку из настроек проекта """ result = ConfigurationManager.get_string("EXISTING_STR_KEY", default="default_val") self.assertEqual(result, "custom_val") @override_settings(INVALID_STR_KEY=123) def test_get_string_raises_exception_on_type_mismatch(self) -> None: """ Должен взорваться исключением ImproperlyConfigured, если вместо строки пришел int """ with self.assertRaises(ImproperlyConfigured) as context: ConfigurationManager.get_string("INVALID_STR_KEY", default="default_val") self.assertIn("must be of type str, got int", str(context.exception)) def test_get_int_returns_default_if_setting_missing(self) -> None: """ Должен вернуть дефолтное число, если настройки нет в файле конфигурации """ result = ConfigurationManager.get_int("NON_EXISTENT_INT_KEY", default=42) self.assertEqual(result, 42) @override_settings(EXISTING_INT_KEY=100) def test_get_int_returns_custom_value(self) -> None: """ Должен успешно вернуть настроенный int """ result = ConfigurationManager.get_int("EXISTING_INT_KEY", default=42) self.assertEqual(result, 100) @override_settings(INVALID_INT_KEY="not_an_int") def test_get_int_raises_exception_on_type_mismatch(self) -> None: """ Должен упасть, если в числовую настройку хост-проект прокинул строку """ with self.assertRaises(ImproperlyConfigured) as context: ConfigurationManager.get_int("INVALID_INT_KEY", default=42) self.assertIn("must be of type int, got str", str(context.exception)) @override_settings(BOOLEAN_INSTEAD_OF_INT=True) def test_get_int_raises_exception_on_boolean_value(self) -> None: """ Хирургический тест: должен упасть, если вместо int передан bool (True/False) """ with self.assertRaises(ImproperlyConfigured) as context: ConfigurationManager.get_int("BOOLEAN_INSTEAD_OF_INT", default=42) self.assertIn("must be of type int, got bool", str(context.exception)) def test_get_bool_returns_default_if_setting_missing(self) -> None: """ Должен вернуть дефолтный булевый флаг при отсутствии настройки """ result = ConfigurationManager.get_bool("NON_EXISTENT_BOOL_KEY", default=True) self.assertTrue(result) @override_settings(EXISTING_BOOL_KEY=False) def test_get_bool_returns_custom_value(self) -> None: """ Должен успешно прочитать переопределенный булевый флаг """ result = ConfigurationManager.get_bool("EXISTING_BOOL_KEY", default=True) self.assertFalse(result) @override_settings(INT_INSTEAD_OF_BOOL=1) def test_get_bool_raises_exception_on_int_value(self) -> None: """ Должен выбросить исключение, если вместо честного bool передан int """ with self.assertRaises(ImproperlyConfigured) as context: ConfigurationManager.get_bool("INT_INSTEAD_OF_BOOL", default=True) self.assertIn("must be of type bool, got int", str(context.exception))