fix: share Happ generation and correct protocol labels
Move the reusable generator into commons, add Netherlands display metadata, and label Hysteria links by protocol without changing URI parameters. Disclosure: I'm an AI assistant helping Vladimir Eremin; I'm not Vladimir Eremin.
This commit is contained in:
1 parent
65fef9a6b0
commit
99ff1f1433
5 files changed
+248
No files matched your search
@@ -0,0 +1,62 @@
|
||||
import json
|
||||
import pathlib
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
from urllib.parse import parse_qs, unquote, urlsplit
|
||||
|
||||
|
||||
ROOT = pathlib.Path(__file__).resolve().parents[1]
|
||||
GENERATOR = ROOT / 'assets/happ-subscription-generator/generator.py'
|
||||
|
||||
|
||||
class TestHappSubscriptions(unittest.TestCase):
|
||||
def generate(self, scheme, params, country='NL'):
|
||||
data = {
|
||||
'routing': {'name': 'test-routing'},
|
||||
'templates': {'edge': {
|
||||
'country': country, 'nodes': ['metis'], 'scheme': scheme,
|
||||
'host': 'edge.example.com', 'port': 443, 'params': params,
|
||||
}},
|
||||
'users': [{'name': 'test-user', 'psub': 'test.psub', 'configs': [
|
||||
{'template': 'edge', 'id': 'test-credential', 'params': {'sni': 'tls.example.com'}},
|
||||
]}],
|
||||
}
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
source = pathlib.Path(tmp) / 'input.json'
|
||||
source.write_text(json.dumps(data))
|
||||
result = subprocess.run(
|
||||
[sys.executable, str(GENERATOR), str(source), tmp],
|
||||
capture_output=True, text=True,
|
||||
)
|
||||
self.assertEqual(result.returncode, 0, result.stderr)
|
||||
lines = (pathlib.Path(tmp) / 'test.psub').read_text().splitlines()
|
||||
self.assertEqual(len(lines), 2)
|
||||
return urlsplit(lines[1])
|
||||
|
||||
def test_hysteria_names_follow_protocol_without_changing_link_parameters(self):
|
||||
for scheme in ('hysteria2', 'hy2'):
|
||||
for params in ({}, {'type': 'tcp'}):
|
||||
with self.subTest(scheme=scheme, params=params):
|
||||
link = self.generate(scheme, params)
|
||||
self.assertEqual(unquote(link.fragment),
|
||||
'🇳🇱 Netherlands [hysteria] | metis | test-user')
|
||||
self.assertEqual(link.scheme, scheme)
|
||||
self.assertEqual(link.netloc, 'test-credential@edge.example.com:443')
|
||||
self.assertEqual(parse_qs(link.query),
|
||||
{**{k: [v] for k, v in params.items()}, 'sni': ['tls.example.com']})
|
||||
|
||||
def test_vless_keeps_transport_label_and_user_overrides(self):
|
||||
link = self.generate('vless', {'type': 'xhttp', 'sni': 'old.example.com'})
|
||||
self.assertEqual(unquote(link.fragment),
|
||||
'🇳🇱 Netherlands [xhttp] | metis | test-user')
|
||||
self.assertEqual(parse_qs(link.query), {'type': ['xhttp'], 'sni': ['tls.example.com']})
|
||||
|
||||
def test_existing_country_and_tcp_label_are_preserved(self):
|
||||
link = self.generate('vless', {'type': 'tcp'}, country='LV')
|
||||
self.assertEqual(unquote(link.fragment), '🇱🇻 Latvia [tcp] | metis | test-user')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
Reference in new issue
Block a user