package agentserver import ( "net/url" "testing" ) func TestMatchRoute(t *testing.T) { sid := "ses_01jabc" cases := []struct { method, path, query string ok bool owner OwnerKind id string action Action }{ {"GET", "/profiles", "", true, OwnerNone, "", ActionPassthrough}, {"GET", "/providers", "", true, OwnerNone, "", ActionPassthrough}, {"GET", "/sessions/" + sid, "", true, OwnerSession, sid, ActionSessionDetail}, {"PATCH", "/sessions/" + sid, "", true, OwnerSession, sid, ActionSessionPatch}, {"GET", "/sessions/" + sid + "/events", "after=3", true, OwnerSession, sid, ActionEvents}, {"GET", "/sessions/" + sid + "/stream", "", true, OwnerSession, sid, ActionStream}, {"GET", "/sessions/" + sid + "/files", "", true, OwnerSession, sid, ActionListFiles}, {"POST", "/sessions/" + sid + "/files", "", true, OwnerSession, sid, ActionUploadFiles}, {"POST", "/sessions/" + sid + "/messages", "", true, OwnerSession, sid, ActionSendMessage}, {"GET", "/runs/run_01x", "", true, OwnerRun, "run_01x", ActionPassthrough}, {"POST", "/runs/run_01x/interrupt", "", true, OwnerRun, "run_01x", ActionPassthrough}, {"GET", "/interactions", "sessionId=" + sid, true, OwnerQuerySession, sid, ActionInteractions}, {"POST", "/interactions/itx_01x", "", true, OwnerInteraction, "itx_01x", ActionPassthrough}, {"GET", "/files/file_01x", "inline=1", true, OwnerFile, "file_01x", ActionPassthrough}, // 不在白名单 {"GET", "/sessions", "", false, 0, "", 0}, {"POST", "/sessions", "", false, 0, "", 0}, {"DELETE", "/sessions/" + sid, "", false, 0, "", 0}, {"GET", "/usage", "days=30", false, 0, "", 0}, {"POST", "/browser-tokens", "", false, 0, "", 0}, {"GET", "/interactions", "", false, 0, "", 0}, {"GET", "/interactions", "sessionId=../x", false, 0, "", 0}, {"POST", "/runs/run_01x", "", false, 0, "", 0}, {"GET", "/sessions/" + sid + "/stream/x", "", false, 0, "", 0}, {"GET", "/sessions/run_01x", "", false, 0, "", 0}, // 前缀不符 {"GET", "/files/file_..%2f", "", false, 0, "", 0}, // 非法字符 {"GET", "/sessions/ses_", "", false, 0, "", 0}, // 只有前缀 {"PUT", "/sessions/" + sid, "", false, 0, "", 0}, } for _, c := range cases { q, _ := url.ParseQuery(c.query) r, ok := MatchRoute(c.method, c.path, q) if ok != c.ok { t.Errorf("%s %s?%s: ok=%v, want %v", c.method, c.path, c.query, ok, c.ok) continue } if !ok { continue } if r.Owner != c.owner || r.Id != c.id || r.Action != c.action { t.Errorf("%s %s: got %+v, want owner=%v id=%s action=%v", c.method, c.path, r, c.owner, c.id, c.action) } } } func TestResourceKindOf(t *testing.T) { if ResourceKindOf("run_1") != OwnerRun || ResourceKindOf("itx_1") != OwnerInteraction || ResourceKindOf("file_1") != OwnerFile || ResourceKindOf("ses_1") != OwnerNone { t.Fatal("ResourceKindOf 前缀判断错误") } }