import os import tempfile import unittest from config import GatewayConfig class GatewayConfigCompatTest(unittest.TestCase): def test_gateway_config_accepts_documented_fms_env_names_when_dotenv_missing(self): env = { 'FMS_API_BASE': 'http://gateway.example.test', 'FMS_CLIENT_TYPE': 'workbuddy', 'FMS_TIMEOUT_MS': '15000', 'FMS_LOG_LEVEL': 'debug', } config = GatewayConfig.from_env(env, dotenv_path=os.path.join(tempfile.gettempdir(), 'missing-fms-mcp.env')) self.assertEqual('http://gateway.example.test', config.auth_base_url) self.assertEqual('http://gateway.example.test', config.tools_base_url) self.assertEqual('workbuddy', config.client_type) self.assertEqual(15, config.timeout_seconds) self.assertEqual('debug', config.log_level) def test_gateway_config_reads_dotenv_file_when_env_missing(self): with tempfile.TemporaryDirectory() as tmp_dir: dotenv_path = os.path.join(tmp_dir, '.env') with open(dotenv_path, 'w', encoding='utf-8') as file: file.write('FMS_API_BASE=http://dotenv.example.test\n') file.write('FMS_CLIENT_TYPE=workbuddy\n') file.write('FMS_TIMEOUT_SECONDS=12\n') file.write('FMS_LOG_LEVEL=warning\n') file.write('FMS_TOKEN_STORE_PATH=.runtime-token.json\n') config = GatewayConfig.from_env(env={}, dotenv_path=dotenv_path) self.assertEqual('http://dotenv.example.test', config.auth_base_url) self.assertEqual('http://dotenv.example.test', config.tools_base_url) self.assertEqual('workbuddy', config.client_type) self.assertEqual(12, config.timeout_seconds) self.assertEqual('warning', config.log_level) self.assertEqual('.runtime-token.json', config.token_store_path) def test_gateway_config_prefers_dotenv_over_environment(self): with tempfile.TemporaryDirectory() as tmp_dir: dotenv_path = os.path.join(tmp_dir, '.env') with open(dotenv_path, 'w', encoding='utf-8') as file: file.write('FMS_AUTH_BASE=http://dotenv-auth.example.test\n') file.write('FMS_TOOLS_BASE=http://dotenv-tools.example.test\n') file.write('FMS_CLIENT_TYPE=workbuddy-dotenv\n') file.write('FMS_TIMEOUT_SECONDS=12\n') file.write('FMS_LOG_LEVEL=warning\n') file.write('FMS_TOKEN_STORE_PATH=.dotenv-token.json\n') config = GatewayConfig.from_env( env={ 'FMS_AUTH_BASE': 'http://env-auth.example.test', 'FMS_TOOLS_BASE': 'http://env-tools.example.test', 'FMS_CLIENT_TYPE': 'workbuddy-env', 'FMS_TIMEOUT_SECONDS': '30', 'FMS_LOG_LEVEL': 'debug', 'FMS_TOKEN_STORE_PATH': '.env-token.json', }, dotenv_path=dotenv_path, ) self.assertEqual('http://dotenv-auth.example.test', config.auth_base_url) self.assertEqual('http://dotenv-tools.example.test', config.tools_base_url) self.assertEqual('workbuddy-dotenv', config.client_type) self.assertEqual(12, config.timeout_seconds) self.assertEqual('warning', config.log_level) self.assertEqual('.dotenv-token.json', config.token_store_path) if __name__ == '__main__': unittest.main()