feat: merge default proxy groups of all subscription

This commit is contained in:
2026-07-20 15:00:11 +08:00
parent 2b73f83a2a
commit 7ff3daa9d3
4 changed files with 172 additions and 2 deletions

View File

@ -0,0 +1,82 @@
package corecfg
import (
"reflect"
"testing"
)
func TestPopFirstProxyGroup(t *testing.T) {
data := map[string]interface{}{
"proxy-groups": []interface{}{
map[string]interface{}{"name": "Proxy", "type": "select", "proxies": []interface{}{"Auto"}},
map[string]interface{}{"name": "Auto", "type": "url-test", "proxies": []interface{}{"HK"}},
},
}
got := popFirstProxyGroup(data)
want := map[string]interface{}{"name": "Proxy", "type": "select", "proxies": []interface{}{"Auto"}}
if !reflect.DeepEqual(got, want) {
t.Fatalf("got %#v, want %#v", got, want)
}
remaining := data["proxy-groups"].([]interface{})
if len(remaining) != 1 || remaining[0].(map[string]interface{})["name"] != "Auto" {
t.Fatalf("expected only the Auto group to remain, got %#v", remaining)
}
}
func TestPopFirstProxyGroupEmpty(t *testing.T) {
if got := popFirstProxyGroup(map[string]interface{}{}); got != nil {
t.Fatalf("expected nil, got %#v", got)
}
}
func TestMergeProxySelection(t *testing.T) {
combined := map[string]interface{}{
"proxy-groups": []interface{}{
map[string]interface{}{"name": "sub-a | Auto", "type": "url-test", "proxies": []interface{}{"sub-a | HK"}},
},
"rules": []interface{}{
"DOMAIN,example.com,sub-a | Proxy",
"DOMAIN,other.com,sub-b | Proxy",
},
}
groups := []map[string]interface{}{
{"name": "sub-a | Proxy", "type": "select", "proxies": []interface{}{"sub-a | Auto", "DIRECT"}},
{"name": "sub-b | Proxy", "type": "select", "proxies": []interface{}{"sub-b | Auto", "DIRECT"}},
}
mergeProxySelection(combined, groups)
proxyGroups := combined["proxy-groups"].([]interface{})
if len(proxyGroups) != 2 {
t.Fatalf("expected 2 proxy-groups (merged selection + sub-a | Auto), got %#v", proxyGroups)
}
merged := proxyGroups[0].(map[string]interface{})
if merged["name"] != selectionGroupName {
t.Fatalf("expected first group to be %q, got %#v", selectionGroupName, merged["name"])
}
wantProxies := []interface{}{"sub-a | Auto", "DIRECT", "sub-b | Auto"}
if !reflect.DeepEqual(merged["proxies"], wantProxies) {
t.Fatalf("got proxies %#v, want %#v", merged["proxies"], wantProxies)
}
wantRules := []interface{}{
"DOMAIN,example.com," + selectionGroupName,
"DOMAIN,other.com," + selectionGroupName,
}
if !reflect.DeepEqual(combined["rules"], wantRules) {
t.Fatalf("got rules %#v, want %#v", combined["rules"], wantRules)
}
}
func TestMergeProxySelectionNoGroups(t *testing.T) {
combined := map[string]interface{}{"proxy-groups": []interface{}{"unchanged"}}
mergeProxySelection(combined, nil)
if !reflect.DeepEqual(combined["proxy-groups"], []interface{}{"unchanged"}) {
t.Fatalf("expected combined to be untouched, got %#v", combined)
}
}