routes_test.go 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package agentserver
  2. import (
  3. "net/url"
  4. "testing"
  5. )
  6. func TestMatchRoute(t *testing.T) {
  7. sid := "ses_01jabc"
  8. cases := []struct {
  9. method, path, query string
  10. ok bool
  11. owner OwnerKind
  12. id string
  13. action Action
  14. }{
  15. {"GET", "/profiles", "", true, OwnerNone, "", ActionPassthrough},
  16. {"GET", "/providers", "", true, OwnerNone, "", ActionPassthrough},
  17. {"GET", "/sessions/" + sid, "", true, OwnerSession, sid, ActionSessionDetail},
  18. {"PATCH", "/sessions/" + sid, "", true, OwnerSession, sid, ActionSessionPatch},
  19. {"GET", "/sessions/" + sid + "/events", "after=3", true, OwnerSession, sid, ActionEvents},
  20. {"GET", "/sessions/" + sid + "/stream", "", true, OwnerSession, sid, ActionStream},
  21. {"GET", "/sessions/" + sid + "/files", "", true, OwnerSession, sid, ActionListFiles},
  22. {"POST", "/sessions/" + sid + "/files", "", true, OwnerSession, sid, ActionUploadFiles},
  23. {"POST", "/sessions/" + sid + "/messages", "", true, OwnerSession, sid, ActionSendMessage},
  24. {"GET", "/runs/run_01x", "", true, OwnerRun, "run_01x", ActionPassthrough},
  25. {"POST", "/runs/run_01x/interrupt", "", true, OwnerRun, "run_01x", ActionPassthrough},
  26. {"GET", "/interactions", "sessionId=" + sid, true, OwnerQuerySession, sid, ActionInteractions},
  27. {"POST", "/interactions/itx_01x", "", true, OwnerInteraction, "itx_01x", ActionPassthrough},
  28. {"GET", "/files/file_01x", "inline=1", true, OwnerFile, "file_01x", ActionPassthrough},
  29. // 不在白名单
  30. {"GET", "/sessions", "", false, 0, "", 0},
  31. {"POST", "/sessions", "", false, 0, "", 0},
  32. {"DELETE", "/sessions/" + sid, "", false, 0, "", 0},
  33. {"GET", "/usage", "days=30", false, 0, "", 0},
  34. {"POST", "/browser-tokens", "", false, 0, "", 0},
  35. {"GET", "/interactions", "", false, 0, "", 0},
  36. {"GET", "/interactions", "sessionId=../x", false, 0, "", 0},
  37. {"POST", "/runs/run_01x", "", false, 0, "", 0},
  38. {"GET", "/sessions/" + sid + "/stream/x", "", false, 0, "", 0},
  39. {"GET", "/sessions/run_01x", "", false, 0, "", 0}, // 前缀不符
  40. {"GET", "/files/file_..%2f", "", false, 0, "", 0}, // 非法字符
  41. {"GET", "/sessions/ses_", "", false, 0, "", 0}, // 只有前缀
  42. {"PUT", "/sessions/" + sid, "", false, 0, "", 0},
  43. }
  44. for _, c := range cases {
  45. q, _ := url.ParseQuery(c.query)
  46. r, ok := MatchRoute(c.method, c.path, q)
  47. if ok != c.ok {
  48. t.Errorf("%s %s?%s: ok=%v, want %v", c.method, c.path, c.query, ok, c.ok)
  49. continue
  50. }
  51. if !ok {
  52. continue
  53. }
  54. if r.Owner != c.owner || r.Id != c.id || r.Action != c.action {
  55. t.Errorf("%s %s: got %+v, want owner=%v id=%s action=%v", c.method, c.path, r, c.owner, c.id, c.action)
  56. }
  57. }
  58. }
  59. func TestResourceKindOf(t *testing.T) {
  60. if ResourceKindOf("run_1") != OwnerRun || ResourceKindOf("itx_1") != OwnerInteraction || ResourceKindOf("file_1") != OwnerFile || ResourceKindOf("ses_1") != OwnerNone {
  61. t.Fatal("ResourceKindOf 前缀判断错误")
  62. }
  63. }