296 lines
9.9 KiB
Python
296 lines
9.9 KiB
Python
"""
|
|
CookieCloud客户端单元测试
|
|
"""
|
|
import unittest
|
|
from unittest.mock import Mock, patch, MagicMock
|
|
import json
|
|
from cookiecloud_client import (
|
|
CookieCloudClient,
|
|
CookieConfig,
|
|
CookieCloudError,
|
|
ConfigurationError,
|
|
ConnectionError,
|
|
AuthenticationError,
|
|
DataParseError,
|
|
NetworkError
|
|
)
|
|
|
|
|
|
class TestCookieConfig(unittest.TestCase):
|
|
"""测试CookieConfig配置类"""
|
|
|
|
def test_valid_config(self):
|
|
"""测试有效配置"""
|
|
config = CookieConfig(
|
|
server="https://example.com",
|
|
username="user",
|
|
password="pass"
|
|
)
|
|
self.assertEqual(config.server, "https://example.com")
|
|
self.assertEqual(config.username, "user")
|
|
self.assertEqual(config.password, "pass")
|
|
self.assertEqual(config.timeout, 30)
|
|
self.assertTrue(config.verify_ssl)
|
|
|
|
def test_config_with_custom_params(self):
|
|
"""测试自定义参数配置"""
|
|
config = CookieConfig(
|
|
server="https://example.com",
|
|
username="user",
|
|
password="pass",
|
|
timeout=60,
|
|
verify_ssl=False,
|
|
ignore_cookies=["test_cookie"]
|
|
)
|
|
self.assertEqual(config.timeout, 60)
|
|
self.assertFalse(config.verify_ssl)
|
|
self.assertEqual(config.ignore_cookies, ["test_cookie"])
|
|
|
|
def test_config_auto_add_protocol(self):
|
|
"""测试自动添加协议"""
|
|
config = CookieConfig(
|
|
server="example.com",
|
|
username="user",
|
|
password="pass"
|
|
)
|
|
self.assertTrue(config.server.startswith("https://"))
|
|
|
|
def test_config_empty_server(self):
|
|
"""测试空服务器地址"""
|
|
with self.assertRaises(ValueError):
|
|
CookieConfig(server="", username="user", password="pass")
|
|
|
|
def test_config_empty_username(self):
|
|
"""测试空用户名"""
|
|
with self.assertRaises(ValueError):
|
|
CookieConfig(server="https://example.com", username="", password="pass")
|
|
|
|
def test_config_empty_password(self):
|
|
"""测试空密码"""
|
|
with self.assertRaises(ValueError):
|
|
CookieConfig(server="https://example.com", username="user", password="")
|
|
|
|
|
|
class TestCookieCloudClient(unittest.TestCase):
|
|
"""测试CookieCloudClient客户端类"""
|
|
|
|
def setUp(self):
|
|
"""测试前准备"""
|
|
self.config = CookieConfig(
|
|
server="https://test.example.com",
|
|
username="testuser",
|
|
password="testpass"
|
|
)
|
|
self.client = CookieCloudClient(self.config)
|
|
|
|
def test_client_initialization(self):
|
|
"""测试客户端初始化"""
|
|
self.assertIsInstance(self.client.config, CookieConfig)
|
|
self.assertIsNone(self.client.last_download_time)
|
|
self.assertEqual(self.client.download_count, 0)
|
|
|
|
def test_client_invalid_config(self):
|
|
"""测试无效配置"""
|
|
with self.assertRaises(ConfigurationError):
|
|
CookieCloudClient("invalid_config")
|
|
|
|
@patch('urllib.request.urlopen')
|
|
def test_download_success(self, mock_urlopen):
|
|
"""测试成功下载"""
|
|
mock_response = Mock()
|
|
mock_response.status = 200
|
|
mock_response.read.return_value = json.dumps({
|
|
"cookie_data": {
|
|
"test.com": [
|
|
{
|
|
"domain": "test.com",
|
|
"name": "session",
|
|
"value": "test_value",
|
|
"path": "/",
|
|
"secure": False,
|
|
"httpOnly": False
|
|
}
|
|
]
|
|
}
|
|
}).encode('utf-8')
|
|
mock_urlopen.return_value = mock_response
|
|
|
|
result = self.client.download()
|
|
|
|
self.assertTrue(result.success)
|
|
self.assertEqual(result.total_domains, 1)
|
|
self.assertEqual(result.total_cookies, 1)
|
|
self.assertIsNotNone(self.client.last_download_time)
|
|
self.assertEqual(self.client.download_count, 1)
|
|
|
|
@patch('urllib.request.urlopen')
|
|
def test_download_authentication_error(self, mock_urlopen):
|
|
"""测试认证失败"""
|
|
import urllib.error
|
|
|
|
mock_urlopen.side_effect = urllib.error.HTTPError(
|
|
url="https://test.example.com/get/testuser",
|
|
code=401,
|
|
msg="Unauthorized",
|
|
hdrs={},
|
|
fp=None
|
|
)
|
|
|
|
with self.assertRaises(AuthenticationError):
|
|
self.client.download()
|
|
|
|
@patch('urllib.request.urlopen')
|
|
def test_download_connection_error(self, mock_urlopen):
|
|
"""测试连接错误"""
|
|
import urllib.error
|
|
|
|
mock_urlopen.side_effect = urllib.error.HTTPError(
|
|
url="https://test.example.com/get/testuser",
|
|
code=404,
|
|
msg="Not Found",
|
|
hdrs={},
|
|
fp=None
|
|
)
|
|
|
|
with self.assertRaises(ConnectionError):
|
|
self.client.download()
|
|
|
|
@patch('urllib.request.urlopen')
|
|
def test_download_network_error(self, mock_urlopen):
|
|
"""测试网络错误"""
|
|
import urllib.error
|
|
|
|
mock_urlopen.side_effect = urllib.error.URLError("Connection refused")
|
|
|
|
with self.assertRaises(NetworkError):
|
|
self.client.download()
|
|
|
|
@patch('urllib.request.urlopen')
|
|
def test_download_empty_data(self, mock_urlopen):
|
|
"""测试空数据"""
|
|
mock_response = Mock()
|
|
mock_response.status = 200
|
|
mock_response.read.return_value = json.dumps({}).encode('utf-8')
|
|
mock_urlopen.return_value = mock_response
|
|
|
|
with self.assertRaises(DataParseError):
|
|
self.client.download()
|
|
|
|
@patch('urllib.request.urlopen')
|
|
def test_test_connection_success(self, mock_urlopen):
|
|
"""测试连接测试成功"""
|
|
mock_response = Mock()
|
|
mock_response.status = 200
|
|
mock_response.read.return_value = json.dumps({
|
|
"cookie_data": {}
|
|
}).encode('utf-8')
|
|
mock_urlopen.return_value = mock_response
|
|
|
|
success, message = self.client.test_connection()
|
|
|
|
self.assertTrue(success)
|
|
self.assertEqual(message, "连接成功")
|
|
|
|
@patch('urllib.request.urlopen')
|
|
def test_test_connection_failure(self, mock_urlopen):
|
|
"""测试连接测试失败"""
|
|
import urllib.error
|
|
|
|
mock_urlopen.side_effect = urllib.error.HTTPError(
|
|
url="https://test.example.com/get/testuser",
|
|
code=401,
|
|
msg="Unauthorized",
|
|
hdrs={},
|
|
fp=None
|
|
)
|
|
|
|
success, message = self.client.test_connection()
|
|
|
|
self.assertFalse(success)
|
|
self.assertIn("认证失败", message)
|
|
|
|
@patch('urllib.request.urlopen')
|
|
def test_download_for_domain(self, mock_urlopen):
|
|
"""测试下载指定域名"""
|
|
mock_response = Mock()
|
|
mock_response.status = 200
|
|
mock_response.read.return_value = json.dumps({
|
|
"cookie_data": {
|
|
"test.com": [
|
|
{
|
|
"domain": "test.com",
|
|
"name": "session",
|
|
"value": "test_value",
|
|
"path": "/",
|
|
"secure": False,
|
|
"httpOnly": False
|
|
}
|
|
]
|
|
}
|
|
}).encode('utf-8')
|
|
mock_urlopen.return_value = mock_response
|
|
|
|
cookie_str = self.client.download_for_domain("test.com")
|
|
|
|
self.assertIsNotNone(cookie_str)
|
|
self.assertIn("session=test_value", cookie_str)
|
|
|
|
@patch('urllib.request.urlopen')
|
|
def test_download_for_domains(self, mock_urlopen):
|
|
"""测试批量下载多个域名"""
|
|
mock_response = Mock()
|
|
mock_response.status = 200
|
|
mock_response.read.return_value = json.dumps({
|
|
"cookie_data": {
|
|
"test1.com": [
|
|
{"domain": "test1.com", "name": "cookie1", "value": "value1", "path": "/"}
|
|
],
|
|
"test2.com": [
|
|
{"domain": "test2.com", "name": "cookie2", "value": "value2", "path": "/"}
|
|
]
|
|
}
|
|
}).encode('utf-8')
|
|
mock_urlopen.return_value = mock_response
|
|
|
|
domains = ["test1.com", "test2.com", "test3.com"]
|
|
cookies = self.client.download_for_domains(domains)
|
|
|
|
self.assertEqual(len(cookies), 3)
|
|
self.assertIn("cookie1=value1", cookies["test1.com"])
|
|
self.assertIn("cookie2=value2", cookies["test2.com"])
|
|
self.assertIsNone(cookies["test3.com"])
|
|
|
|
|
|
class TestExceptions(unittest.TestCase):
|
|
"""测试异常类"""
|
|
|
|
def test_cookie_cloud_error(self):
|
|
"""测试基础异常"""
|
|
error = CookieCloudError("测试错误", {"key": "value"})
|
|
self.assertEqual(error.message, "测试错误")
|
|
self.assertEqual(error.details, {"key": "value"})
|
|
self.assertIn("测试错误", str(error))
|
|
|
|
def test_configuration_error(self):
|
|
"""测试配置错误"""
|
|
error = ConfigurationError("配置错误", config_key="server")
|
|
self.assertEqual(error.message, "配置错误")
|
|
self.assertEqual(error.details["config_key"], "server")
|
|
|
|
def test_connection_error(self):
|
|
"""测试连接错误"""
|
|
error = ConnectionError("连接失败", server="example.com", status_code=404)
|
|
self.assertEqual(error.message, "连接失败")
|
|
self.assertEqual(error.details["server"], "example.com")
|
|
self.assertEqual(error.details["status_code"], 404)
|
|
|
|
def test_authentication_error(self):
|
|
"""测试认证错误"""
|
|
error = AuthenticationError("认证失败", username="testuser")
|
|
self.assertEqual(error.message, "认证失败")
|
|
self.assertEqual(error.details["username"], "testuser")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|