PyGithub MCP Server
by AstroMined
"""Unit tests for configuration settings module.
These tests use real environment variables and real files to test the
configuration loading functionality with no mocks.
"""
import os
import json
import tempfile
import shutil
from pathlib import Path
import pytest
from pygithub_mcp_server.config.settings import load_config, DEFAULT_CONFIG
@pytest.fixture
def clean_config_env():
"""Fixture to clean environment variables that affect configuration.
This fixture removes environment variables that would affect the
configuration loading, then restores them after the test.
"""
# Store original values
orig_env = {}
env_vars = [
"PYGITHUB_MCP_CONFIG",
"PYGITHUB_ENABLE_ISSUES",
"PYGITHUB_ENABLE_REPOSITORIES",
"PYGITHUB_ENABLE_PULL_REQUESTS",
"PYGITHUB_ENABLE_DISCUSSIONS",
"PYGITHUB_ENABLE_SEARCH",
"PYGITHUB_ENABLE_USERS",
"PYGITHUB_ENABLE_ORGANIZATIONS",
"PYGITHUB_ENABLE_TEAMS",
"PYGITHUB_ENABLE_WEBHOOKS",
"PYGITHUB_ENABLE_GISTS",
]
for var in env_vars:
if var in os.environ:
orig_env[var] = os.environ[var]
del os.environ[var]
yield
# Restore original values
for var in env_vars:
if var in os.environ:
del os.environ[var]
for var, value in orig_env.items():
os.environ[var] = value
@pytest.fixture
def temp_config_file():
"""Fixture that creates a temporary config file.
This fixture creates a temporary file that can be used as a config file
and cleans it up after the test.
Returns:
Path to temporary file
"""
# Create temporary file
fd, path = tempfile.mkstemp(suffix=".json")
os.close(fd)
yield path
# Clean up
if os.path.exists(path):
os.unlink(path)
class TestConfigSettings:
"""Tests for the configuration settings module."""
def test_default_configuration(self, clean_config_env):
"""Test default configuration is loaded correctly when no overrides exist."""
# Load config with clean environment
config = load_config()
# Verify default configuration is returned
assert config is not None
assert "tool_groups" in config
# Check that values match DEFAULT_CONFIG (instead of hardcoded expectations)
for group, settings in DEFAULT_CONFIG["tool_groups"].items():
assert config["tool_groups"][group]["enabled"] == settings["enabled"]
def test_environment_variable_override(self, clean_config_env):
"""Test environment variables override default configuration."""
# Set environment variables to override defaults
os.environ["PYGITHUB_ENABLE_REPOSITORIES"] = "true"
os.environ["PYGITHUB_ENABLE_ISSUES"] = "false"
os.environ["PYGITHUB_ENABLE_PULL_REQUESTS"] = "1"
# Load config with environment overrides
config = load_config()
# Verify environment variables override defaults
assert config["tool_groups"]["repositories"]["enabled"] is True
assert config["tool_groups"]["issues"]["enabled"] is False
assert config["tool_groups"]["pull_requests"]["enabled"] is True
def test_config_file_override(self, clean_config_env, temp_config_file):
"""Test configuration file overrides default configuration."""
# Create config data
config_data = {
"tool_groups": {
"issues": {"enabled": False},
"repositories": {"enabled": True},
"discussions": {"enabled": True}
},
"logging": {
"level": "DEBUG"
}
}
# Write config to file
with open(temp_config_file, "w") as f:
json.dump(config_data, f)
# Set environment variable to point to config file
os.environ["PYGITHUB_MCP_CONFIG"] = temp_config_file
# Load config with file override
config = load_config()
# Verify file configuration overrides defaults
assert config["tool_groups"]["issues"]["enabled"] is False
assert config["tool_groups"]["repositories"]["enabled"] is True
assert config["tool_groups"]["discussions"]["enabled"] is True
assert config.get("logging", {}).get("level") == "DEBUG"
def test_environment_overrides_file(self, clean_config_env, temp_config_file):
"""Test environment variables override file configuration."""
# Create config data
config_data = {
"tool_groups": {
"issues": {"enabled": False},
"repositories": {"enabled": False}
}
}
# Write config to file
with open(temp_config_file, "w") as f:
json.dump(config_data, f)
# Set environment variables
os.environ["PYGITHUB_MCP_CONFIG"] = temp_config_file
os.environ["PYGITHUB_ENABLE_REPOSITORIES"] = "true"
# Load config with file and environment overrides
config = load_config()
# Verify environment variables override file configuration
assert config["tool_groups"]["issues"]["enabled"] is False # From file
assert config["tool_groups"]["repositories"]["enabled"] is True # From env var
def test_invalid_config_file(self, clean_config_env, temp_config_file):
"""Test handling of invalid configuration file."""
# Write invalid JSON to file
with open(temp_config_file, "w") as f:
f.write("not valid json")
# Set environment variable to point to invalid config file
os.environ["PYGITHUB_MCP_CONFIG"] = temp_config_file
# Load config with invalid file
config = load_config()
# Verify defaults are used
for group, settings in DEFAULT_CONFIG["tool_groups"].items():
assert config["tool_groups"][group]["enabled"] == settings["enabled"]
def test_nonexistent_config_file(self, clean_config_env):
"""Test handling of nonexistent configuration file."""
# Set environment variable to point to nonexistent file
os.environ["PYGITHUB_MCP_CONFIG"] = "/nonexistent/file.json"
# Load config with nonexistent file
config = load_config()
# Verify defaults are used
for group, settings in DEFAULT_CONFIG["tool_groups"].items():
assert config["tool_groups"][group]["enabled"] == settings["enabled"]