mirror of
https://github.com/TheNetworkGuy/netbox-zabbix-sync.git
synced 2025-07-13 15:24:48 -06:00
140 lines
5.7 KiB
Python
140 lines
5.7 KiB
Python
"""Tests for configuration parsing in the modules.config module."""
|
|
from unittest.mock import patch, MagicMock
|
|
import os
|
|
from modules.config import load_config, DEFAULT_CONFIG, load_config_file, load_env_variable
|
|
|
|
|
|
def test_load_config_defaults():
|
|
"""Test that load_config returns default values when no config file or env vars are present"""
|
|
with patch('modules.config.load_config_file', return_value=DEFAULT_CONFIG.copy()), \
|
|
patch('modules.config.load_env_variable', return_value=None):
|
|
config = load_config()
|
|
assert config == DEFAULT_CONFIG
|
|
assert config["templates_config_context"] is False
|
|
assert config["create_hostgroups"] is True
|
|
|
|
|
|
def test_load_config_file():
|
|
"""Test that load_config properly loads values from config file"""
|
|
mock_config = DEFAULT_CONFIG.copy()
|
|
mock_config["templates_config_context"] = True
|
|
mock_config["sync_vms"] = True
|
|
|
|
with patch('modules.config.load_config_file', return_value=mock_config), \
|
|
patch('modules.config.load_env_variable', return_value=None):
|
|
config = load_config()
|
|
assert config["templates_config_context"] is True
|
|
assert config["sync_vms"] is True
|
|
# Unchanged values should remain as defaults
|
|
assert config["create_journal"] is False
|
|
|
|
|
|
def test_load_env_variables():
|
|
"""Test that load_config properly loads values from environment variables"""
|
|
# Mock env variable loading to return values for specific keys
|
|
def mock_load_env(key):
|
|
if key == "sync_vms":
|
|
return True
|
|
if key == "create_journal":
|
|
return True
|
|
return None
|
|
|
|
with patch('modules.config.load_config_file', return_value=DEFAULT_CONFIG.copy()), \
|
|
patch('modules.config.load_env_variable', side_effect=mock_load_env):
|
|
config = load_config()
|
|
assert config["sync_vms"] is True
|
|
assert config["create_journal"] is True
|
|
# Unchanged values should remain as defaults
|
|
assert config["templates_config_context"] is False
|
|
|
|
|
|
def test_env_vars_override_config_file():
|
|
"""Test that environment variables override values from config file"""
|
|
mock_config = DEFAULT_CONFIG.copy()
|
|
mock_config["templates_config_context"] = True
|
|
mock_config["sync_vms"] = False
|
|
|
|
# Mock env variable that will override the config file value
|
|
def mock_load_env(key):
|
|
if key == "sync_vms":
|
|
return True
|
|
return None
|
|
|
|
with patch('modules.config.load_config_file', return_value=mock_config), \
|
|
patch('modules.config.load_env_variable', side_effect=mock_load_env):
|
|
config = load_config()
|
|
# This should be overridden by the env var
|
|
assert config["sync_vms"] is True
|
|
# This should remain from the config file
|
|
assert config["templates_config_context"] is True
|
|
|
|
|
|
def test_load_config_file_function():
|
|
"""Test the load_config_file function directly"""
|
|
# Test when the file exists
|
|
with patch('pathlib.Path.exists', return_value=True), \
|
|
patch('importlib.util.spec_from_file_location') as mock_spec:
|
|
# Setup the mock module with attributes
|
|
mock_module = MagicMock()
|
|
mock_module.templates_config_context = True
|
|
mock_module.sync_vms = True
|
|
|
|
# Setup the mock spec
|
|
mock_spec_instance = MagicMock()
|
|
mock_spec.return_value = mock_spec_instance
|
|
mock_spec_instance.loader.exec_module = lambda x: None
|
|
|
|
# Patch module_from_spec to return our mock module
|
|
with patch('importlib.util.module_from_spec', return_value=mock_module):
|
|
config = load_config_file(DEFAULT_CONFIG.copy())
|
|
assert config["templates_config_context"] is True
|
|
assert config["sync_vms"] is True
|
|
|
|
|
|
def test_load_config_file_not_found():
|
|
"""Test load_config_file when the config file doesn't exist"""
|
|
with patch('pathlib.Path.exists', return_value=False):
|
|
result = load_config_file(DEFAULT_CONFIG.copy())
|
|
# Should return a dict equal to DEFAULT_CONFIG, not a new object
|
|
assert result == DEFAULT_CONFIG
|
|
|
|
|
|
def test_load_env_variable_function():
|
|
"""Test the load_env_variable function directly"""
|
|
# Create a real environment variable for testing with correct prefix and uppercase
|
|
test_var = "NBZX_TEMPLATES_CONFIG_CONTEXT"
|
|
original_env = os.environ.get(test_var, None)
|
|
try:
|
|
# Set the environment variable with the proper prefix and case
|
|
os.environ[test_var] = "True"
|
|
|
|
# Test that it's properly read (using lowercase in the function call)
|
|
value = load_env_variable("templates_config_context")
|
|
assert value == "True"
|
|
|
|
# Test when the environment variable doesn't exist
|
|
value = load_env_variable("nonexistent_variable")
|
|
assert value is None
|
|
finally:
|
|
# Clean up - restore original environment
|
|
if original_env is not None:
|
|
os.environ[test_var] = original_env
|
|
else:
|
|
os.environ.pop(test_var, None)
|
|
|
|
|
|
def test_load_config_file_exception_handling():
|
|
"""Test that load_config_file handles exceptions gracefully"""
|
|
# This test requires modifying the load_config_file function to handle exceptions
|
|
# For now, we're just checking that an exception is raised
|
|
with patch('pathlib.Path.exists', return_value=True), \
|
|
patch('importlib.util.spec_from_file_location', side_effect=Exception("Import error")):
|
|
# Since the current implementation doesn't handle exceptions, we should
|
|
# expect an exception to be raised
|
|
try:
|
|
load_config_file(DEFAULT_CONFIG.copy())
|
|
assert False, "An exception should have been raised"
|
|
except Exception: # pylint: disable=broad-except
|
|
# This is expected
|
|
pass
|