paijo77 commited on
Commit
2103afb
·
verified ·
1 Parent(s): 1998928

update tests/unit/test_base_grabber.py

Browse files
Files changed (1) hide show
  1. tests/unit/test_base_grabber.py +60 -0
tests/unit/test_base_grabber.py ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pytest
2
+ from abc import ABC
3
+ from app.grabber.base import BaseGrabber
4
+ from app.models.source import SourceConfig, SourceType
5
+ from app.models.proxy import Proxy
6
+
7
+
8
+ class ConcreteGrabber(BaseGrabber):
9
+ async def fetch_content(self, source: SourceConfig) -> str:
10
+ return "192.168.1.1:8080\n10.0.0.1:3128"
11
+
12
+
13
+ class TestBaseGrabber:
14
+ def test_base_grabber_is_abstract(self):
15
+ with pytest.raises(TypeError):
16
+ BaseGrabber()
17
+
18
+ @pytest.mark.asyncio
19
+ async def test_extract_proxies_abstract_method(self):
20
+ grabber = ConcreteGrabber()
21
+ source = SourceConfig(
22
+ url="http://example.com/list.txt", type=SourceType.GENERIC_TEXT
23
+ )
24
+
25
+ assert hasattr(grabber, "extract_proxies")
26
+
27
+ result = await grabber.extract_proxies(source)
28
+ assert isinstance(result, list)
29
+
30
+ @pytest.mark.asyncio
31
+ async def test_parse_content_http_proxies(self):
32
+ grabber = ConcreteGrabber()
33
+ content = "192.168.1.1:8080\n10.0.0.1:3128"
34
+
35
+ proxies = await grabber.parse_content(content, SourceType.GENERIC_TEXT)
36
+
37
+ assert len(proxies) == 2
38
+ assert all(isinstance(p, Proxy) for p in proxies)
39
+ assert proxies[0].ip == "192.168.1.1"
40
+ assert proxies[0].port == 8080
41
+
42
+ @pytest.mark.asyncio
43
+ async def test_parse_content_mixed_protocols(self):
44
+ grabber = ConcreteGrabber()
45
+ content = """
46
+ 192.168.1.1:8080
47
+ vmess://eyJhZGQiOiIxMjcuMC4wLjEiLCJwb3J0Ijo0NDN9
48
+ vless://uuid@10.0.0.1:443?type=tcp
49
+ """
50
+
51
+ proxies = await grabber.parse_content(content, SourceType.GENERIC_TEXT)
52
+
53
+ assert len(proxies) >= 2
54
+
55
+ @pytest.mark.asyncio
56
+ async def test_retry_logic(self):
57
+ grabber = ConcreteGrabber()
58
+
59
+ assert hasattr(grabber, "max_retries")
60
+ assert hasattr(grabber, "retry_delay")