update tests/unit/test_parsers.py
Browse files- tests/unit/test_parsers.py +73 -0
tests/unit/test_parsers.py
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pytest
|
| 2 |
+
from app.grabber.parsers import VMessParser, VLESSParser, TrojanParser, SSParser
|
| 3 |
+
from app.models.proxy import Proxy
|
| 4 |
+
|
| 5 |
+
|
| 6 |
+
class TestVMessParser:
|
| 7 |
+
def test_parse_valid_vmess(self):
|
| 8 |
+
vmess_json = '{"add": "127.0.0.1", "port": 443, "id": "test-uuid", "aid": 0}'
|
| 9 |
+
import base64
|
| 10 |
+
|
| 11 |
+
encoded = base64.b64encode(vmess_json.encode()).decode()
|
| 12 |
+
url = f"vmess://{encoded}"
|
| 13 |
+
|
| 14 |
+
proxy = VMessParser.parse(url)
|
| 15 |
+
|
| 16 |
+
assert proxy is not None
|
| 17 |
+
assert proxy.ip == "127.0.0.1"
|
| 18 |
+
assert proxy.port == 443
|
| 19 |
+
assert proxy.protocol == "vmess"
|
| 20 |
+
|
| 21 |
+
def test_parse_invalid_vmess(self):
|
| 22 |
+
url = "vmess://invalid-base64!@#"
|
| 23 |
+
|
| 24 |
+
with pytest.raises(ValueError):
|
| 25 |
+
VMessParser.parse(url)
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
class TestVLESSParser:
|
| 29 |
+
def test_parse_valid_vless(self):
|
| 30 |
+
url = "vless://uuid-here@192.168.1.1:443?type=tcp&encryption=none"
|
| 31 |
+
|
| 32 |
+
proxy = VLESSParser.parse(url)
|
| 33 |
+
|
| 34 |
+
assert proxy is not None
|
| 35 |
+
assert proxy.ip == "192.168.1.1"
|
| 36 |
+
assert proxy.port == 443
|
| 37 |
+
assert proxy.protocol == "vless"
|
| 38 |
+
|
| 39 |
+
def test_parse_vless_with_domain(self):
|
| 40 |
+
url = "vless://uuid@example.com:443?type=tcp"
|
| 41 |
+
|
| 42 |
+
proxy = VLESSParser.parse(url)
|
| 43 |
+
|
| 44 |
+
assert proxy is not None
|
| 45 |
+
assert "example.com" in proxy.ip or proxy.ip != ""
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
class TestTrojanParser:
|
| 49 |
+
def test_parse_valid_trojan(self):
|
| 50 |
+
url = "trojan://password123@10.0.0.1:443?sni=example.com"
|
| 51 |
+
|
| 52 |
+
proxy = TrojanParser.parse(url)
|
| 53 |
+
|
| 54 |
+
assert proxy is not None
|
| 55 |
+
assert proxy.ip == "10.0.0.1"
|
| 56 |
+
assert proxy.port == 443
|
| 57 |
+
assert proxy.protocol == "trojan"
|
| 58 |
+
|
| 59 |
+
|
| 60 |
+
class TestSSParser:
|
| 61 |
+
def test_parse_valid_ss(self):
|
| 62 |
+
method_pass = "aes-256-gcm:password123"
|
| 63 |
+
import base64
|
| 64 |
+
|
| 65 |
+
encoded = base64.b64encode(method_pass.encode()).decode()
|
| 66 |
+
url = f"ss://{encoded}@192.168.1.1:8388"
|
| 67 |
+
|
| 68 |
+
proxy = SSParser.parse(url)
|
| 69 |
+
|
| 70 |
+
assert proxy is not None
|
| 71 |
+
assert proxy.ip == "192.168.1.1"
|
| 72 |
+
assert proxy.port == 8388
|
| 73 |
+
assert proxy.protocol == "shadowsocks"
|