test_provider_proxy_list.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. # coding=utf-8
  2. """
  3. 测试 provider 基类的代理列表功能
  4. Test provider base class proxy list functionality
  5. """
  6. from base_test import BaseProviderTestCase, patch, unittest
  7. from ddns.provider._base import SimpleProvider
  8. from ddns.util.http import HttpResponse
  9. class TestSimpleProvider(SimpleProvider):
  10. """测试用的简单Provider实现"""
  11. endpoint = "https://api.example.com"
  12. def set_record(self, domain, value, record_type="A", ttl=None, line=None, **extra):
  13. # type: (str, str, str, str | int | None, str | None, **object) -> bool
  14. """简单的set_record实现用于测试"""
  15. return self._http("POST", "/set", body={"domain": domain, "value": value})
  16. class TestProviderProxyList(BaseProviderTestCase):
  17. """测试Provider代理列表功能"""
  18. def setUp(self):
  19. """设置测试环境"""
  20. super(TestProviderProxyList, self).setUp()
  21. # 创建一个包含代理列表的provider
  22. self.proxy_list = ["http://proxy1:8080", "http://proxy2:8080", None]
  23. @patch("ddns.provider._base.request")
  24. def test_provider_http_with_proxy_list(self, mock_request):
  25. """测试Provider使用代理列表发送HTTP请求"""
  26. # 模拟成功响应
  27. mock_response = HttpResponse(200, "OK", {}, '{"status": "success", "data": "test"}')
  28. mock_request.return_value = mock_response
  29. # 创建provider并设置代理列表
  30. provider = TestSimpleProvider(self.id, self.token, proxy=self.proxy_list)
  31. # 调用_http方法
  32. result = provider._http("GET", "/test")
  33. # 验证结果(应该是解析后的JSON)
  34. self.assertEqual(result["status"], "success")
  35. # 验证request被正确调用,传递了proxies参数
  36. mock_request.assert_called_once()
  37. call_args = mock_request.call_args
  38. self.assertEqual(call_args[1]["proxies"], self.proxy_list)
  39. @patch("ddns.provider._base.request")
  40. def test_provider_http_with_single_proxy_backward_compatibility(self, mock_request):
  41. """测试Provider单个代理列表"""
  42. # 模拟成功响应
  43. mock_response = HttpResponse(200, "OK", {}, '{"status": "success", "data": "test"}')
  44. mock_request.return_value = mock_response
  45. # 创建provider并设置单个代理列表
  46. single_proxy_list = ["http://single-proxy:8080"]
  47. provider = TestSimpleProvider(self.id, self.token, proxy=single_proxy_list)
  48. # 调用_http方法
  49. result = provider._http("GET", "/test")
  50. # 验证结果
  51. self.assertEqual(result["status"], "success")
  52. # 验证request被正确调用
  53. mock_request.assert_called_once()
  54. call_args = mock_request.call_args
  55. self.assertEqual(call_args[1]["proxies"], single_proxy_list)
  56. @patch("ddns.provider._base.request")
  57. def test_provider_http_no_proxy(self, mock_request):
  58. """测试Provider没有代理时的默认行为"""
  59. # 模拟成功响应
  60. mock_response = HttpResponse(200, "OK", {}, '{"status": "success", "data": "test"}')
  61. mock_request.return_value = mock_response
  62. # 创建provider不设置代理
  63. provider = TestSimpleProvider(self.id, self.token)
  64. # 调用_http方法
  65. result = provider._http("GET", "/test")
  66. # 验证结果
  67. self.assertEqual(result["status"], "success")
  68. # 验证request被正确调用
  69. mock_request.assert_called_once()
  70. call_args = mock_request.call_args
  71. self.assertEqual(call_args[1]["proxies"], None)
  72. @patch("ddns.provider._base.request")
  73. def test_provider_http_empty_proxy_list(self, mock_request):
  74. """测试Provider空代理列表时的默认行为"""
  75. # 模拟成功响应
  76. mock_response = HttpResponse(200, "OK", {}, '{"status": "success", "data": "test"}')
  77. mock_request.return_value = mock_response
  78. # 创建provider设置空代理列表
  79. provider = TestSimpleProvider(self.id, self.token, proxy=[])
  80. # 调用_http方法
  81. result = provider._http("GET", "/test")
  82. # 验证结果
  83. self.assertEqual(result["status"], "success")
  84. # 验证request被正确调用
  85. mock_request.assert_called_once()
  86. call_args = mock_request.call_args
  87. self.assertEqual(call_args[1]["proxies"], [])
  88. @patch("ddns.provider._base.request")
  89. def test_provider_http_request_failure_handling(self, mock_request):
  90. """测试Provider处理请求失败的情况"""
  91. # 模拟请求失败
  92. mock_request.side_effect = RuntimeError("All proxies failed")
  93. # 创建provider
  94. provider = TestSimpleProvider(self.id, self.token, proxy=self.proxy_list)
  95. # 调用_http方法应该抛出异常
  96. with self.assertRaises(RuntimeError) as context:
  97. provider._http("GET", "/test")
  98. self.assertIn("All proxies failed", str(context.exception))
  99. def test_provider_initialization_with_proxy_types(self):
  100. """测试Provider初始化时不同代理参数类型的处理"""
  101. # 测试代理列表
  102. proxy_list = ["http://proxy1:8080", "http://proxy2:8080", None]
  103. provider1 = TestSimpleProvider(self.id, self.token, proxy=proxy_list)
  104. self.assertEqual(provider1._proxy, proxy_list)
  105. # 测试单项代理列表
  106. single_proxy_list = ["http://proxy:8080"]
  107. provider2 = TestSimpleProvider(self.id, self.token, proxy=single_proxy_list)
  108. self.assertEqual(provider2._proxy, single_proxy_list)
  109. # 测试None代理
  110. provider3 = TestSimpleProvider(self.id, self.token, proxy=None)
  111. self.assertEqual(provider3._proxy, None)
  112. # 测试空列表代理
  113. provider4 = TestSimpleProvider(self.id, self.token, proxy=[])
  114. self.assertEqual(provider4._proxy, [])
  115. if __name__ == "__main__":
  116. unittest.main()