| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- # coding=utf-8
- """
- 测试 provider 基类的代理列表功能
- Test provider base class proxy list functionality
- """
- from base_test import BaseProviderTestCase, patch, unittest
- from ddns.provider._base import SimpleProvider
- from ddns.util.http import HttpResponse
- class TestSimpleProvider(SimpleProvider):
- """测试用的简单Provider实现"""
- endpoint = "https://api.example.com"
- def set_record(self, domain, value, record_type="A", ttl=None, line=None, **extra):
- # type: (str, str, str, str | int | None, str | None, **object) -> bool
- """简单的set_record实现用于测试"""
- return self._http("POST", "/set", body={"domain": domain, "value": value})
- class TestProviderProxyList(BaseProviderTestCase):
- """测试Provider代理列表功能"""
- def setUp(self):
- """设置测试环境"""
- super(TestProviderProxyList, self).setUp()
- # 创建一个包含代理列表的provider
- self.proxy_list = ["http://proxy1:8080", "http://proxy2:8080", None]
- @patch("ddns.provider._base.request")
- def test_provider_http_with_proxy_list(self, mock_request):
- """测试Provider使用代理列表发送HTTP请求"""
- # 模拟成功响应
- mock_response = HttpResponse(200, "OK", {}, '{"status": "success", "data": "test"}')
- mock_request.return_value = mock_response
- # 创建provider并设置代理列表
- provider = TestSimpleProvider(self.id, self.token, proxy=self.proxy_list)
- # 调用_http方法
- result = provider._http("GET", "/test")
- # 验证结果(应该是解析后的JSON)
- self.assertEqual(result["status"], "success")
- # 验证request被正确调用,传递了proxies参数
- mock_request.assert_called_once()
- call_args = mock_request.call_args
- self.assertEqual(call_args[1]["proxies"], self.proxy_list)
- @patch("ddns.provider._base.request")
- def test_provider_http_with_single_proxy_backward_compatibility(self, mock_request):
- """测试Provider单个代理列表"""
- # 模拟成功响应
- mock_response = HttpResponse(200, "OK", {}, '{"status": "success", "data": "test"}')
- mock_request.return_value = mock_response
- # 创建provider并设置单个代理列表
- single_proxy_list = ["http://single-proxy:8080"]
- provider = TestSimpleProvider(self.id, self.token, proxy=single_proxy_list)
- # 调用_http方法
- result = provider._http("GET", "/test")
- # 验证结果
- self.assertEqual(result["status"], "success")
- # 验证request被正确调用
- mock_request.assert_called_once()
- call_args = mock_request.call_args
- self.assertEqual(call_args[1]["proxies"], single_proxy_list)
- @patch("ddns.provider._base.request")
- def test_provider_http_no_proxy(self, mock_request):
- """测试Provider没有代理时的默认行为"""
- # 模拟成功响应
- mock_response = HttpResponse(200, "OK", {}, '{"status": "success", "data": "test"}')
- mock_request.return_value = mock_response
- # 创建provider不设置代理
- provider = TestSimpleProvider(self.id, self.token)
- # 调用_http方法
- result = provider._http("GET", "/test")
- # 验证结果
- self.assertEqual(result["status"], "success")
- # 验证request被正确调用
- mock_request.assert_called_once()
- call_args = mock_request.call_args
- self.assertEqual(call_args[1]["proxies"], None)
- @patch("ddns.provider._base.request")
- def test_provider_http_empty_proxy_list(self, mock_request):
- """测试Provider空代理列表时的默认行为"""
- # 模拟成功响应
- mock_response = HttpResponse(200, "OK", {}, '{"status": "success", "data": "test"}')
- mock_request.return_value = mock_response
- # 创建provider设置空代理列表
- provider = TestSimpleProvider(self.id, self.token, proxy=[])
- # 调用_http方法
- result = provider._http("GET", "/test")
- # 验证结果
- self.assertEqual(result["status"], "success")
- # 验证request被正确调用
- mock_request.assert_called_once()
- call_args = mock_request.call_args
- self.assertEqual(call_args[1]["proxies"], [])
- @patch("ddns.provider._base.request")
- def test_provider_http_request_failure_handling(self, mock_request):
- """测试Provider处理请求失败的情况"""
- # 模拟请求失败
- mock_request.side_effect = RuntimeError("All proxies failed")
- # 创建provider
- provider = TestSimpleProvider(self.id, self.token, proxy=self.proxy_list)
- # 调用_http方法应该抛出异常
- with self.assertRaises(RuntimeError) as context:
- provider._http("GET", "/test")
- self.assertIn("All proxies failed", str(context.exception))
- def test_provider_initialization_with_proxy_types(self):
- """测试Provider初始化时不同代理参数类型的处理"""
- # 测试代理列表
- proxy_list = ["http://proxy1:8080", "http://proxy2:8080", None]
- provider1 = TestSimpleProvider(self.id, self.token, proxy=proxy_list)
- self.assertEqual(provider1._proxy, proxy_list)
- # 测试单项代理列表
- single_proxy_list = ["http://proxy:8080"]
- provider2 = TestSimpleProvider(self.id, self.token, proxy=single_proxy_list)
- self.assertEqual(provider2._proxy, single_proxy_list)
- # 测试None代理
- provider3 = TestSimpleProvider(self.id, self.token, proxy=None)
- self.assertEqual(provider3._proxy, None)
- # 测试空列表代理
- provider4 = TestSimpleProvider(self.id, self.token, proxy=[])
- self.assertEqual(provider4._proxy, [])
- if __name__ == "__main__":
- unittest.main()
|