xray_config_inject_test.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package service
  2. import (
  3. "encoding/json"
  4. "testing"
  5. "github.com/mhsanaei/3x-ui/v3/internal/util/json_util"
  6. )
  7. func TestEnsureAPIServices(t *testing.T) {
  8. // legacy template without RoutingService gets it injected
  9. out := ensureAPIServices(json_util.RawMessage(`{"services":["HandlerService","LoggerService","StatsService"],"tag":"api"}`))
  10. var parsed struct {
  11. Services []string `json:"services"`
  12. Tag string `json:"tag"`
  13. }
  14. if err := json.Unmarshal(out, &parsed); err != nil {
  15. t.Fatal(err)
  16. }
  17. want := map[string]bool{"HandlerService": true, "StatsService": true, "RoutingService": true, "LoggerService": true}
  18. if len(parsed.Services) != 4 {
  19. t.Fatalf("expected 4 services, got %v", parsed.Services)
  20. }
  21. for _, svc := range parsed.Services {
  22. if !want[svc] {
  23. t.Fatalf("unexpected service %q", svc)
  24. }
  25. }
  26. if parsed.Tag != "api" {
  27. t.Fatalf("tag must be preserved, got %q", parsed.Tag)
  28. }
  29. // complete api block is returned unchanged (no marshal churn)
  30. full := json_util.RawMessage(`{"services":["HandlerService","StatsService","RoutingService"],"tag":"api"}`)
  31. if got := ensureAPIServices(full); string(got) != string(full) {
  32. t.Fatalf("complete api block must pass through untouched, got %s", got)
  33. }
  34. // absent api block stays absent
  35. if got := ensureAPIServices(nil); got != nil {
  36. t.Fatalf("nil api block must stay nil, got %s", got)
  37. }
  38. }