"""仓库层单元测试""" import pytest import asyncio from datetime import datetime class TestProxyRepository: """测试 ProxyRepository""" @pytest.mark.asyncio async def test_insert_or_update(self, db, proxy_repo): """测试插入或更新代理""" result = await proxy_repo.insert_or_update(db, "192.168.1.1", 8080, "http", 50) assert result is True # 验证插入成功 proxy = await proxy_repo.get_by_ip_port(db, "192.168.1.1", 8080) assert proxy is not None assert proxy.ip == "192.168.1.1" assert proxy.port == 8080 # 清理 await proxy_repo.delete(db, "192.168.1.1", 8080) @pytest.mark.asyncio async def test_get_random(self, db, proxy_repo): """测试获取随机代理""" # 先插入一个代理 await proxy_repo.insert_or_update(db, "192.168.1.1", 8080, "http", 50) proxy = await proxy_repo.get_random(db) # 可能有也可能没有(取决于数据库状态) if proxy: assert hasattr(proxy, 'ip') assert hasattr(proxy, 'port') # 清理 await proxy_repo.delete(db, "192.168.1.1", 8080) @pytest.mark.asyncio async def test_list_all(self, db, proxy_repo): """测试列出所有代理""" # 插入测试数据 await proxy_repo.insert_or_update(db, "192.168.1.1", 8080, "http", 50) await proxy_repo.insert_or_update(db, "192.168.1.2", 8081, "https", 60) proxies = await proxy_repo.list_all(db, limit=100) assert isinstance(proxies, list) # 清理 await proxy_repo.delete(db, "192.168.1.1", 8080) await proxy_repo.delete(db, "192.168.1.2", 8081) @pytest.mark.asyncio async def test_update_score(self, db, proxy_repo): """测试更新分数""" # 插入代理 await proxy_repo.insert_or_update(db, "192.168.1.1", 8080, "http", 50) # 更新分数 result = await proxy_repo.update_score(db, "192.168.1.1", 8080, 10) assert result is True # 验证 proxy = await proxy_repo.get_by_ip_port(db, "192.168.1.1", 8080) assert proxy.score == 60 # 清理 await proxy_repo.delete(db, "192.168.1.1", 8080) @pytest.mark.asyncio async def test_update_score_deletes_on_zero_or_below(self, db, proxy_repo): """测试分数降至 0 及以下时自动删除代理""" await proxy_repo.insert_or_update(db, "192.168.1.1", 8080, "http", 5) result = await proxy_repo.update_score(db, "192.168.1.1", 8080, -10) assert result is True proxy = await proxy_repo.get_by_ip_port(db, "192.168.1.1", 8080) assert proxy is None @pytest.mark.asyncio async def test_iter_batches(self, db, proxy_repo): """测试流式分批读取""" # 插入 5 条测试数据 for i in range(5): await proxy_repo.insert_or_update(db, f"192.168.1.{i}", 8000 + i, "http", 10) batches = [] async for batch in proxy_repo.iter_batches(db, batch_size=2): batches.append(batch) assert len(batches) == 3 assert len(batches[0]) == 2 assert len(batches[1]) == 2 assert len(batches[2]) == 1 # 清理 for i in range(5): await proxy_repo.delete(db, f"192.168.1.{i}", 8000 + i) @pytest.mark.asyncio async def test_batch_delete(self, db, proxy_repo): """测试批量删除""" # 插入测试数据 await proxy_repo.insert_or_update(db, "192.168.1.1", 8080, "http", 50) await proxy_repo.insert_or_update(db, "192.168.1.2", 8081, "http", 50) # 批量删除 count = await proxy_repo.batch_delete(db, [("192.168.1.1", 8080), ("192.168.1.2", 8081)]) assert count == 2 # 验证删除 proxy1 = await proxy_repo.get_by_ip_port(db, "192.168.1.1", 8080) proxy2 = await proxy_repo.get_by_ip_port(db, "192.168.1.2", 8081) assert proxy1 is None assert proxy2 is None @pytest.mark.asyncio async def test_get_stats(self, db, proxy_repo): """测试获取统计信息""" stats = await proxy_repo.get_stats(db) assert "total" in stats assert "available" in stats assert "avg_score" in stats assert "http_count" in stats