test_settings.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. """集中配置与密钥保护测试。"""
  2. from pathlib import Path
  3. import unittest
  4. from vendor_guard.agent import build_chat_model
  5. from vendor_guard.settings import ConfigurationError, Settings
  6. class SettingsTests(unittest.TestCase):
  7. def test_all_api_keys_are_loaded_from_mapping(self) -> None:
  8. settings = Settings.from_mapping(
  9. {
  10. "DEEPSEEK_API_KEY": "deepseek-secret",
  11. "DEEPSEEK_BASE_URL": "https://api.deepseek.example",
  12. "DEEPSEEK_MODEL_NAME": "deepseek-test",
  13. "DEEPSEEK_ANSWER_THINKING": "false",
  14. "LANGSMITH_API_KEY": "langsmith-secret",
  15. },
  16. project_root=Path("."),
  17. )
  18. self.assertEqual(settings.require_model_api_key(), "deepseek-secret")
  19. self.assertEqual(settings.require_langsmith_api_key(), "langsmith-secret")
  20. self.assertEqual(settings.model_name, "deepseek-test")
  21. self.assertFalse(settings.model_thinking)
  22. def test_api_keys_are_hidden_from_settings_repr(self) -> None:
  23. settings = Settings(
  24. project_root=Path("."),
  25. model_api_key="deepseek-secret",
  26. langsmith_api_key="langsmith-secret",
  27. )
  28. rendered = repr(settings)
  29. self.assertNotIn("deepseek-secret", rendered)
  30. self.assertNotIn("langsmith-secret", rendered)
  31. def test_missing_model_key_has_clear_error(self) -> None:
  32. settings = Settings(project_root=Path("."))
  33. with self.assertRaisesRegex(ConfigurationError, "DEEPSEEK_API_KEY"):
  34. settings.require_model_api_key()
  35. def test_chat_model_uses_settings_instead_of_environment(self) -> None:
  36. settings = Settings(
  37. project_root=Path("."),
  38. model_name="deepseek-test",
  39. model_api_key="deepseek-secret",
  40. model_base_url="https://api.deepseek.example",
  41. model_thinking=False,
  42. )
  43. model = build_chat_model(settings)
  44. self.assertEqual(model.model_name, "deepseek-test")
  45. self.assertEqual(model.openai_api_base, "https://api.deepseek.example")
  46. self.assertNotIn("deepseek-secret", repr(model))
  47. self.assertEqual(
  48. model.extra_body,
  49. {"thinking": {"type": "disabled"}},
  50. )
  51. if __name__ == "__main__":
  52. unittest.main()