api_test.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package xray
  2. import (
  3. "strings"
  4. "testing"
  5. )
  6. // RemoveUser must return an error, not panic, when the handler client is not
  7. // initialized — matching every sibling API method. A depletion sweep can reach
  8. // it with a nil client during a restart window where Init(0) failed.
  9. func TestRemoveUserGuardsNilHandlerClient(t *testing.T) {
  10. err := (&XrayAPI{}).RemoveUser("in-443-tcp", "[email protected]")
  11. if err == nil {
  12. t.Fatal("RemoveUser with an uninitialized HandlerServiceClient must return an error")
  13. }
  14. }
  15. func TestGetRequiredUserString_Present(t *testing.T) {
  16. user := map[string]any{"email": "[email protected]"}
  17. got, err := getRequiredUserString(user, "email")
  18. if err != nil {
  19. t.Fatalf("unexpected error: %v", err)
  20. }
  21. if got != "[email protected]" {
  22. t.Fatalf("got %q, want %q", got, "[email protected]")
  23. }
  24. }
  25. func TestGetRequiredUserString_Missing(t *testing.T) {
  26. user := map[string]any{}
  27. if _, err := getRequiredUserString(user, "email"); err == nil {
  28. t.Fatal("expected error for missing key")
  29. }
  30. }
  31. func TestGetRequiredUserString_NilValue(t *testing.T) {
  32. user := map[string]any{"email": nil}
  33. if _, err := getRequiredUserString(user, "email"); err == nil {
  34. t.Fatal("expected error for nil value")
  35. }
  36. }
  37. func TestGetRequiredUserString_WrongType(t *testing.T) {
  38. user := map[string]any{"email": 42}
  39. _, err := getRequiredUserString(user, "email")
  40. if err == nil {
  41. t.Fatal("expected error for non-string value")
  42. }
  43. if !strings.Contains(err.Error(), "invalid type") {
  44. t.Fatalf("expected %q in error, got: %v", "invalid type", err)
  45. }
  46. }
  47. func TestGetOptionalUserString_Present(t *testing.T) {
  48. user := map[string]any{"flow": "xtls-rprx-vision"}
  49. got, err := getOptionalUserString(user, "flow")
  50. if err != nil {
  51. t.Fatalf("unexpected error: %v", err)
  52. }
  53. if got != "xtls-rprx-vision" {
  54. t.Fatalf("got %q, want %q", got, "xtls-rprx-vision")
  55. }
  56. }
  57. func TestGetOptionalUserString_MissingReturnsEmptyNoError(t *testing.T) {
  58. user := map[string]any{}
  59. got, err := getOptionalUserString(user, "flow")
  60. if err != nil {
  61. t.Fatalf("unexpected error for missing optional field: %v", err)
  62. }
  63. if got != "" {
  64. t.Fatalf("got %q, want empty string", got)
  65. }
  66. }
  67. func TestGetOptionalUserString_NilReturnsEmptyNoError(t *testing.T) {
  68. user := map[string]any{"flow": nil}
  69. got, err := getOptionalUserString(user, "flow")
  70. if err != nil {
  71. t.Fatalf("unexpected error for nil optional field: %v", err)
  72. }
  73. if got != "" {
  74. t.Fatalf("got %q, want empty string", got)
  75. }
  76. }
  77. func TestGetOptionalUserString_WrongTypeErrors(t *testing.T) {
  78. user := map[string]any{"flow": []string{"a", "b"}}
  79. if _, err := getOptionalUserString(user, "flow"); err == nil {
  80. t.Fatal("expected error for non-string optional value")
  81. }
  82. }