118 lines
3.9 KiB
Python
118 lines
3.9 KiB
Python
# DRF Rack
|
|
# Библиотека классов расширений для Django REST Framework
|
|
#
|
|
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
|
|
# Все права защищены. Лицензия: 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)
|