"""Tests for configuration management."""
import json
import os
import tempfile
from pathlib import Path
import pytest
from sharepoint_mcp.config import Config, ConfigurationError, load_config, save_config
def test_config_from_env_variables(monkeypatch):
"""Test loading configuration from environment variables."""
monkeypatch.setenv("AZURE_CLIENT_ID", "test-client-id")
monkeypatch.setenv("AZURE_TENANT_ID", "test-tenant-id")
config = load_config()
assert config.client_id == "test-client-id"
assert config.tenant_id == "test-tenant-id"
assert config.redirect_uri == "http://localhost:8765/callback"
assert config.log_level == "INFO"
def test_config_from_sharepoint_env_variables(monkeypatch):
"""Test loading configuration from SHAREPOINT_* environment variables."""
monkeypatch.setenv("SHAREPOINT_CLIENT_ID", "sp-client-id")
monkeypatch.setenv("SHAREPOINT_TENANT_ID", "sp-tenant-id")
config = load_config()
assert config.client_id == "sp-client-id"
assert config.tenant_id == "sp-tenant-id"
def test_config_custom_values_from_env(monkeypatch):
"""Test loading custom configuration values from environment."""
monkeypatch.setenv("AZURE_CLIENT_ID", "test-client-id")
monkeypatch.setenv("AZURE_TENANT_ID", "test-tenant-id")
monkeypatch.setenv("REDIRECT_URI", "http://localhost:9000/callback")
monkeypatch.setenv("LOG_LEVEL", "DEBUG")
config = load_config()
assert config.redirect_uri == "http://localhost:9000/callback"
assert config.log_level == "DEBUG"
def test_config_from_file(monkeypatch, tmp_path):
"""Test loading configuration from file."""
# Clear environment variables
monkeypatch.delenv("AZURE_CLIENT_ID", raising=False)
monkeypatch.delenv("AZURE_TENANT_ID", raising=False)
monkeypatch.delenv("SHAREPOINT_CLIENT_ID", raising=False)
monkeypatch.delenv("SHAREPOINT_TENANT_ID", raising=False)
# Create config file
config_dir = tmp_path / "sharepoint-mcp"
config_dir.mkdir()
config_file = config_dir / "config.json"
config_data = {
"client_id": "file-client-id",
"tenant_id": "file-tenant-id",
"redirect_uri": "http://localhost:8080/callback",
"log_level": "WARNING",
}
with open(config_file, "w") as f:
json.dump(config_data, f)
# Mock platformdirs to return our temp path
monkeypatch.setattr("sharepoint_mcp.config.platformdirs.user_config_dir", lambda x: str(config_dir))
config = load_config()
assert config.client_id == "file-client-id"
assert config.tenant_id == "file-tenant-id"
assert config.redirect_uri == "http://localhost:8080/callback"
assert config.log_level == "WARNING"
def test_config_missing_raises_error(monkeypatch):
"""Test that missing configuration raises ConfigurationError."""
# Clear all environment variables
monkeypatch.delenv("AZURE_CLIENT_ID", raising=False)
monkeypatch.delenv("AZURE_TENANT_ID", raising=False)
monkeypatch.delenv("SHAREPOINT_CLIENT_ID", raising=False)
monkeypatch.delenv("SHAREPOINT_TENANT_ID", raising=False)
# Mock platformdirs to return a non-existent directory
monkeypatch.setattr("sharepoint_mcp.config.platformdirs.user_config_dir", lambda x: "/nonexistent")
with pytest.raises(ConfigurationError, match="Missing configuration"):
load_config()
def test_save_config(tmp_path, monkeypatch):
"""Test saving configuration to file."""
config_dir = tmp_path / "sharepoint-mcp"
monkeypatch.setattr("sharepoint_mcp.config.platformdirs.user_config_dir", lambda x: str(config_dir))
config = Config(
client_id="save-test-client-id",
tenant_id="save-test-tenant-id",
redirect_uri="http://localhost:7000/callback",
log_level="ERROR",
)
save_config(config)
# Verify file was created
config_file = config_dir / "config.json"
assert config_file.exists()
# Verify contents
with open(config_file) as f:
data = json.load(f)
assert data["client_id"] == "save-test-client-id"
assert data["tenant_id"] == "save-test-tenant-id"
assert data["redirect_uri"] == "http://localhost:7000/callback"
assert data["log_level"] == "ERROR"