package backend import ( "bytes" "cursor/internal/backend/server" serverconfig "cursor/internal/backend/server/config" "net/http" "net/http/httptest" "path/filepath" "testing" ) func TestTabCallerTokenAndBasePathFollowCurrentConfiguration(t *testing.T) { expected := "client-first" calls := 0 tab := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { calls++ if r.Header.Get("Authorization") != "Bearer "+expected { t.Error("configured caller token not forwarded") } if r.URL.Path != "/base/aiserver.v1.AiService/CppConfig" { t.Error("base path lost", r.URL.Path) } w.WriteHeader(204) })) defer tab.Close() store := serverconfig.NewStore(filepath.Join(t.TempDir(), "config.yaml"), "") cfg := serverconfig.DefaultConfig() cfg.TabServerBaseURL = tab.URL + "/base" cfg.TabServerToken = expected if _, err := store.Save(nil, cfg); err != nil { t.Fatal(err) } host, err := NewHost(store, nil) if err != nil { t.Fatal(err) } local := httptest.NewServer(host.mux) defer local.Close() call := func() { r, _ := http.NewRequest(http.MethodPost, local.URL+"/aiserver.v1.AiService/CppConfig", bytes.NewReader(nil)) r.Header.Set("Content-Type", "application/proto") r.Header.Set(server.HeaderServerUpstreamURL, "https://api2.cursor.sh/aiserver.v1.AiService/CppConfig") r.Header.Set("Authorization", "Bearer unrelated-cursor-token") response, err := local.Client().Do(r) if err != nil { t.Fatal(err) } response.Body.Close() if response.StatusCode != 204 { t.Fatal(response.StatusCode) } } call() cfg = host.ConfigManager().Current() expected = "client-second" cfg.TabServerToken = expected if _, err = host.SaveConfig(nil, cfg); err != nil { t.Fatal(err) } call() if calls != 2 { t.Fatal("Tab requests did not reach configured server") } }