test_auth.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from __future__ import annotations
  2. import time
  3. import unittest
  4. from unittest.mock import patch
  5. from data_collector_mcp import auth
  6. class AuthTests(unittest.TestCase):
  7. def test_load_projects_config_normalizes_project(self) -> None:
  8. with patch(
  9. "data_collector_mcp.auth.read_sys_config_value",
  10. return_value=[
  11. {
  12. "project_key": " dev-01 ",
  13. "project_name": " DEV ",
  14. "base_url": "http://gateway.test/",
  15. "data_collector_base_url": "http://collector.test/",
  16. "username": "admin",
  17. "password": "123456",
  18. }
  19. ],
  20. ):
  21. projects = auth.load_projects_config()
  22. self.assertEqual(
  23. projects,
  24. [
  25. {
  26. "project_key": "dev-01",
  27. "project_name": "DEV",
  28. "base_url": "http://gateway.test",
  29. "data_collector_base_url": "http://collector.test",
  30. "username": "admin",
  31. "password": "123456",
  32. "enabled": True,
  33. }
  34. ],
  35. )
  36. def test_load_projects_config_requires_data_collector_base_url(self) -> None:
  37. with patch(
  38. "data_collector_mcp.auth.read_sys_config_value",
  39. return_value=[
  40. {
  41. "project_key": "dev-01",
  42. "base_url": "http://gateway.test",
  43. "username": "admin",
  44. "password": "123456",
  45. }
  46. ],
  47. ):
  48. with self.assertRaisesRegex(ValueError, "data_collector_base_url is required"):
  49. auth.load_projects_config()
  50. def test_resolve_project_token_uses_valid_cache(self) -> None:
  51. project = {"project_key": "dev-01"}
  52. with patch(
  53. "data_collector_mcp.auth.read_sys_config_value",
  54. return_value={"auth_token": "cached-token", "expire_at": int(time.time()) + 3600},
  55. ), patch("data_collector_mcp.auth.request_json") as request_json:
  56. token = auth.resolve_project_token(project)
  57. self.assertEqual(token, "cached-token")
  58. request_json.assert_not_called()
  59. def test_resolve_project_token_logs_in_when_cache_expired(self) -> None:
  60. project = {
  61. "project_key": "dev-01",
  62. "base_url": "http://gateway.test",
  63. "username": "admin",
  64. "password": "123456",
  65. }
  66. with patch(
  67. "data_collector_mcp.auth.read_sys_config_value",
  68. return_value={"auth_token": "old-token", "expire_at": int(time.time()) - 1},
  69. ), patch(
  70. "data_collector_mcp.auth.request_json",
  71. return_value={
  72. "errcode": 0,
  73. "token": "new-token",
  74. "token_expire_time": int(time.time()) + 3600,
  75. },
  76. ) as request_json, patch("data_collector_mcp.auth.write_sys_config_value") as write_value:
  77. token = auth.resolve_project_token(project)
  78. self.assertEqual(token, "new-token")
  79. request_json.assert_called_once_with(
  80. "POST",
  81. "http://gateway.test/api/ai/auth/password_login",
  82. json_payload={"username": "admin", "password": "123456"},
  83. )
  84. write_value.assert_called_once()
  85. self.assertEqual(write_value.call_args.args[0], "mcp_data_collector_token_dev-01")
  86. self.assertEqual(write_value.call_args.args[1]["auth_token"], "new-token")
  87. if __name__ == "__main__":
  88. unittest.main()