File size: 2,135 Bytes
5a4ba84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
62
63
64
65
66
67
68
69
70
71
72
73
74
import pytest
from app.grabber.parsers import VMessParser, VLESSParser, TrojanParser, SSParser
from app.models.proxy import Proxy


class TestVMessParser:
    def test_parse_valid_vmess(self):
        vmess_json = '{"add": "127.0.0.1", "port": 443, "id": "test-uuid", "aid": 0}'
        import base64

        encoded = base64.b64encode(vmess_json.encode()).decode()
        url = f"vmess://{encoded}"

        proxy = VMessParser.parse(url)

        assert proxy is not None
        assert proxy.ip == "127.0.0.1"
        assert proxy.port == 443
        assert proxy.protocol == "vmess"

    def test_parse_invalid_vmess(self):
        url = "vmess://invalid-base64!@#"

        with pytest.raises(ValueError):
            VMessParser.parse(url)


class TestVLESSParser:
    def test_parse_valid_vless(self):
        url = "vless://uuid-here@192.168.1.1:443?type=tcp&encryption=none"

        proxy = VLESSParser.parse(url)

        assert proxy is not None
        assert proxy.ip == "192.168.1.1"
        assert proxy.port == 443
        assert proxy.protocol == "vless"

    def test_parse_vless_with_domain(self):
        url = "vless://uuid@example.com:443?type=tcp"

        proxy = VLESSParser.parse(url)

        assert proxy is not None
        assert "example.com" in proxy.ip or proxy.ip != ""


class TestTrojanParser:
    def test_parse_valid_trojan(self):
        url = "trojan://password123@10.0.0.1:443?sni=example.com"

        proxy = TrojanParser.parse(url)

        assert proxy is not None
        assert proxy.ip == "10.0.0.1"
        assert proxy.port == 443
        assert proxy.protocol == "trojan"


class TestSSParser:
    def test_parse_valid_ss(self):
        method_pass = "aes-256-gcm:password123"
        import base64

        encoded = base64.b64encode(method_pass.encode()).decode()
        url = f"ss://{encoded}@192.168.1.1:8388"

        proxy = SSParser.parse(url)

        assert proxy is not None
        assert proxy.ip == "192.168.1.1"
        assert proxy.port == 8388
        assert proxy.protocol == "shadowsocks"