package service import ( "encoding/json" "testing" "github.com/mhsanaei/3x-ui/v3/internal/util/json_util" ) func TestEnsureAPIServices(t *testing.T) { // legacy template without RoutingService gets it injected out := ensureAPIServices(json_util.RawMessage(`{"services":["HandlerService","LoggerService","StatsService"],"tag":"api"}`)) var parsed struct { Services []string `json:"services"` Tag string `json:"tag"` } if err := json.Unmarshal(out, &parsed); err != nil { t.Fatal(err) } want := map[string]bool{"HandlerService": true, "StatsService": true, "RoutingService": true, "LoggerService": true} if len(parsed.Services) != 4 { t.Fatalf("expected 4 services, got %v", parsed.Services) } for _, svc := range parsed.Services { if !want[svc] { t.Fatalf("unexpected service %q", svc) } } if parsed.Tag != "api" { t.Fatalf("tag must be preserved, got %q", parsed.Tag) } // complete api block is returned unchanged (no marshal churn) full := json_util.RawMessage(`{"services":["HandlerService","StatsService","RoutingService"],"tag":"api"}`) if got := ensureAPIServices(full); string(got) != string(full) { t.Fatalf("complete api block must pass through untouched, got %s", got) } // absent api block stays absent if got := ensureAPIServices(nil); got != nil { t.Fatalf("nil api block must stay nil, got %s", got) } }