test_config_compat.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import os
  2. import tempfile
  3. import unittest
  4. from config import GatewayConfig
  5. class GatewayConfigCompatTest(unittest.TestCase):
  6. def test_gateway_config_accepts_documented_fms_env_names_when_dotenv_missing(self):
  7. env = {
  8. 'FMS_API_BASE': 'http://gateway.example.test',
  9. 'FMS_CLIENT_TYPE': 'workbuddy',
  10. 'FMS_TIMEOUT_MS': '15000',
  11. 'FMS_LOG_LEVEL': 'debug',
  12. }
  13. config = GatewayConfig.from_env(env, dotenv_path=os.path.join(tempfile.gettempdir(), 'missing-fms-mcp.env'))
  14. self.assertEqual('http://gateway.example.test', config.auth_base_url)
  15. self.assertEqual('http://gateway.example.test', config.tools_base_url)
  16. self.assertEqual('workbuddy', config.client_type)
  17. self.assertEqual(15, config.timeout_seconds)
  18. self.assertEqual('debug', config.log_level)
  19. def test_gateway_config_reads_dotenv_file_when_env_missing(self):
  20. with tempfile.TemporaryDirectory() as tmp_dir:
  21. dotenv_path = os.path.join(tmp_dir, '.env')
  22. with open(dotenv_path, 'w', encoding='utf-8') as file:
  23. file.write('FMS_API_BASE=http://dotenv.example.test\n')
  24. file.write('FMS_CLIENT_TYPE=workbuddy\n')
  25. file.write('FMS_TIMEOUT_SECONDS=12\n')
  26. file.write('FMS_LOG_LEVEL=warning\n')
  27. file.write('FMS_TOKEN_STORE_PATH=.runtime-token.json\n')
  28. config = GatewayConfig.from_env(env={}, dotenv_path=dotenv_path)
  29. self.assertEqual('http://dotenv.example.test', config.auth_base_url)
  30. self.assertEqual('http://dotenv.example.test', config.tools_base_url)
  31. self.assertEqual('workbuddy', config.client_type)
  32. self.assertEqual(12, config.timeout_seconds)
  33. self.assertEqual('warning', config.log_level)
  34. self.assertEqual('.runtime-token.json', config.token_store_path)
  35. def test_gateway_config_prefers_dotenv_over_environment(self):
  36. with tempfile.TemporaryDirectory() as tmp_dir:
  37. dotenv_path = os.path.join(tmp_dir, '.env')
  38. with open(dotenv_path, 'w', encoding='utf-8') as file:
  39. file.write('FMS_AUTH_BASE=http://dotenv-auth.example.test\n')
  40. file.write('FMS_TOOLS_BASE=http://dotenv-tools.example.test\n')
  41. file.write('FMS_CLIENT_TYPE=workbuddy-dotenv\n')
  42. file.write('FMS_TIMEOUT_SECONDS=12\n')
  43. file.write('FMS_LOG_LEVEL=warning\n')
  44. file.write('FMS_TOKEN_STORE_PATH=.dotenv-token.json\n')
  45. config = GatewayConfig.from_env(
  46. env={
  47. 'FMS_AUTH_BASE': 'http://env-auth.example.test',
  48. 'FMS_TOOLS_BASE': 'http://env-tools.example.test',
  49. 'FMS_CLIENT_TYPE': 'workbuddy-env',
  50. 'FMS_TIMEOUT_SECONDS': '30',
  51. 'FMS_LOG_LEVEL': 'debug',
  52. 'FMS_TOKEN_STORE_PATH': '.env-token.json',
  53. },
  54. dotenv_path=dotenv_path,
  55. )
  56. self.assertEqual('http://dotenv-auth.example.test', config.auth_base_url)
  57. self.assertEqual('http://dotenv-tools.example.test', config.tools_base_url)
  58. self.assertEqual('workbuddy-dotenv', config.client_type)
  59. self.assertEqual(12, config.timeout_seconds)
  60. self.assertEqual('warning', config.log_level)
  61. self.assertEqual('.dotenv-token.json', config.token_store_path)
  62. def test_public_gateway_config_reads_session_ttl_and_mode(self):
  63. config = GatewayConfig.from_env(env={
  64. 'FMS_API_BASE': 'https://base.example.com',
  65. 'FMS_GATEWAY_MODE': 'public',
  66. 'FMS_GATEWAY_SESSION_TTL_SECONDS': '600',
  67. 'FMS_REDIS_PREFIX': 'fms:mcp:gateway:',
  68. }, dotenv_path='missing.env')
  69. self.assertEqual('public', config.gateway_mode)
  70. self.assertEqual(600, config.gateway_session_ttl_seconds)
  71. self.assertEqual('fms:mcp:gateway:', config.redis_prefix)
  72. def test_timeout_ms_conversion_in_preferred_env(self):
  73. """Test FMS_TIMEOUT_MS conversion in preferred env"""
  74. config = GatewayConfig.from_env(env={
  75. 'FMS_API_BASE': 'https://base.example.com',
  76. 'FMS_TIMEOUT_MS': '5000', # 5000ms = 5 seconds
  77. }, dotenv_path='missing.env')
  78. self.assertEqual(5, config.timeout_seconds)
  79. def test_timeout_ms_minimum_value(self):
  80. """Test that FMS_TIMEOUT_MS converts to at least 1 second"""
  81. config = GatewayConfig.from_env(env={
  82. 'FMS_API_BASE': 'https://base.example.com',
  83. 'FMS_TIMEOUT_MS': '500', # 500ms should become 1 second
  84. }, dotenv_path='missing.env')
  85. self.assertEqual(1, config.timeout_seconds)
  86. if __name__ == '__main__':
  87. unittest.main()