# DRF Rack # Библиотека классов расширений для Django REST Framework # # Автор: Николай В. Анохин # Все права защищены. Лицензия: MIT """ Описание класса EnvironmentInitializeTests """ from unittest.mock import patch from environ import Env from net.xeaf.rack.core.testing import CoreSimpleTestCase from net.xeaf.rack.utils.settings import Environment class EnvironmentInitializeTests(CoreSimpleTestCase): """ Тестовый класс для Environment.initialize() """ def setUp(self): """ Подготовка тестовой среды: сброс состояния Environment """ super().setUp() # Сбрасываем состояние класса перед каждым тестом Environment._is_initialized = False Environment._base_dir = "" Environment._env = Env() Environment._env_prefix = "" @patch('environ.Env') @patch('os.path.join') def test_initialize_sets_base_dir_and_env(self, mock_join, mock_env_class): """ Тест проверяет, что initialize корректно устанавливает базовую директорию и объект Env """ # Arrange base_dir = "/app/project" env_prefix = "APP_" mock_join.return_value = "/app/project/.env" # Act Environment.initialize(base_dir, env_prefix) # Assert self.assertEqual(Environment._base_dir, base_dir) self.assertEqual(Environment._env_prefix, env_prefix) self.assertTrue(Environment._is_initialized) mock_env_class.read_env.assert_called_once_with("/app/project/.env") @patch('environ.Env') @patch('os.path.join') def test_initialize_with_empty_prefix(self, mock_join, mock_env_class): """ Тест проверяет инициализацию с пустым префиксом """ # Arrange base_dir = "/app/project" env_prefix = "" mock_join.return_value = "/app/project/.env" # Act Environment.initialize(base_dir, env_prefix) # Assert self.assertEqual(Environment._env_prefix, "") mock_env_class.read_env.assert_called_once_with("/app/project/.env") @patch('environ.Env') @patch('os.path.join') def test_initialize_called_multiple_times(self, mock_join, mock_env_class): """ Тест проверяет повторную инициализацию """ # Arrange mock_join.return_value = "/app/project/.env" # Act Environment.initialize("/app/project", "PREFIX_") first_env = Environment._env # Меняем поведение join для второго вызова, если это необходимо по вашей логике mock_join.return_value = "/app/other/.env" Environment.initialize("/app/other", "OTHER_") second_env = Environment._env # Assert self.assertEqual(first_env, second_env) # Оба должны указывать на наш mock_env_class self.assertEqual(Environment._base_dir, "/app/other") self.assertEqual(Environment._env_prefix, "OTHER_") self.assertEqual(mock_env_class.read_env.call_count, 2) @patch('environ.Env') @patch('os.path.join') def test_initialize_reads_dot_env_file(self, mock_join, mock_env_class): """ Тест проверяет, что initialize читает файл .env через класс-метод """ # Arrange base_dir = "/app/project" expected_env_path = "/app/project/.env" mock_join.return_value = expected_env_path # Act Environment.initialize(base_dir) # Assert mock_env_class.read_env.assert_called_once_with(expected_env_path)