27 lines
2.0 KiB
Python
27 lines
2.0 KiB
Python
import base64,json,unittest
|
|
from check import validate
|
|
class ValidationTests(unittest.TestCase):
|
|
def codes(self,kind,s):return {x['code'] for x in validate(kind,s.encode())[0]['issues']}
|
|
def test_bom_inside_decoded_subscription(self):
|
|
s=base64.b64encode('\ufefftrojan://secret@example.com:443#name'.encode()).decode()
|
|
self.assertIn('unexpected_BOM',self.codes('v2ray',s))
|
|
def test_vmess_fragment_is_not_part_of_base64(self):
|
|
s='vmess://'+base64.b64encode(json.dumps({'add':'example.com','port':443,'id':'test-id'}).encode()).decode()+'#node'
|
|
self.assertEqual(self.codes('v2ray',s),set())
|
|
def test_plain_json_vmess_is_reported_as_client_compatibility(self):
|
|
s='vmess://'+json.dumps({'add':'example.com','port':443,'id':'test-id'})
|
|
self.assertEqual(self.codes('v2ray',s),{'nonstandard_vmess_json_payload_requires_client_check'})
|
|
def test_empty_server_and_port_zero_in_valid_json(self):
|
|
codes=self.codes('singbox',json.dumps({'outbounds':[{'type':'vmess','tag':'bad','server':'','server_port':0,'uuid':'test'}]}))
|
|
self.assertEqual(codes,{'missing_or_empty_field','invalid_port'})
|
|
def test_html_instead_of_subscription(self):self.assertIn('parse_error',self.codes('clash','<!doctype html><html>error</html>'))
|
|
def test_missing_group_target(self):
|
|
self.assertIn('missing_group_reference',self.codes('clash','proxies: [{name: ok, type: http, server: example.com, port: 80}]\nproxy-groups: [{name: choose, type: select, proxies: [missing]}]'))
|
|
def test_empty_list_is_not_success(self):self.assertIn('empty_node_list',self.codes('clash','proxies: []'))
|
|
def test_malformed_base64(self):self.assertIn('parse_error',self.codes('v2ray','@@@bad@@@'))
|
|
def test_reports_do_not_contain_secrets(self):
|
|
r,_=validate('singbox',json.dumps({'outbounds':[{'type':'trojan','tag':'private-name','server':'secret.host','server_port':0,'password':'test-private-password'}]}).encode())
|
|
text=json.dumps(r)
|
|
for secret in ['test-private-password','secret.host','private-name']:self.assertNotIn(secret,text)
|
|
if __name__=='__main__':unittest.main()
|