File size: 1,908 Bytes
2103afb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import pytest
from abc import ABC
from app.grabber.base import BaseGrabber
from app.models.source import SourceConfig, SourceType
from app.models.proxy import Proxy


class ConcreteGrabber(BaseGrabber):
    async def fetch_content(self, source: SourceConfig) -> str:
        return "192.168.1.1:8080\n10.0.0.1:3128"


class TestBaseGrabber:
    def test_base_grabber_is_abstract(self):
        with pytest.raises(TypeError):
            BaseGrabber()

    @pytest.mark.asyncio
    async def test_extract_proxies_abstract_method(self):
        grabber = ConcreteGrabber()
        source = SourceConfig(
            url="http://example.com/list.txt", type=SourceType.GENERIC_TEXT
        )

        assert hasattr(grabber, "extract_proxies")

        result = await grabber.extract_proxies(source)
        assert isinstance(result, list)

    @pytest.mark.asyncio
    async def test_parse_content_http_proxies(self):
        grabber = ConcreteGrabber()
        content = "192.168.1.1:8080\n10.0.0.1:3128"

        proxies = await grabber.parse_content(content, SourceType.GENERIC_TEXT)

        assert len(proxies) == 2
        assert all(isinstance(p, Proxy) for p in proxies)
        assert proxies[0].ip == "192.168.1.1"
        assert proxies[0].port == 8080

    @pytest.mark.asyncio
    async def test_parse_content_mixed_protocols(self):
        grabber = ConcreteGrabber()
        content = """

        192.168.1.1:8080

        vmess://eyJhZGQiOiIxMjcuMC4wLjEiLCJwb3J0Ijo0NDN9

        vless://uuid@10.0.0.1:443?type=tcp

        """

        proxies = await grabber.parse_content(content, SourceType.GENERIC_TEXT)

        assert len(proxies) >= 2

    @pytest.mark.asyncio
    async def test_retry_logic(self):
        grabber = ConcreteGrabber()

        assert hasattr(grabber, "max_retries")
        assert hasattr(grabber, "retry_delay")