Repository navigation
Expand file tree
/
Copy pathheaders_test.go
More file actions
114 lines (102 loc) · 3.29 KB
/
Copy pathheaders_test.go
File metadata and controls
114 lines (102 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package client
import (
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
)
// recordingServer answers every request with a minimal valid body and keeps
// the headers of the most recent request for assertions.
type recordingServer struct {
*httptest.Server
last http.Header
}
func newRecordingServer(t *testing.T) *recordingServer {
t.Helper()
rs := &recordingServer{}
rs.Server = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
rs.last = r.Header.Clone()
w.Header().Set("Content-Type", "application/json")
if r.Method == http.MethodGet {
_, _ = w.Write([]byte(`{"hash":"abc"}`))
return
}
var req struct {
ID int64 `json:"id"`
}
_ = json.NewDecoder(r.Body).Decode(&req)
_ = json.NewEncoder(w).Encode(map[string]interface{}{
"jsonrpc": "2.0",
"id": req.ID,
"result": map[string]interface{}{"tools": []interface{}{}},
})
}))
t.Cleanup(rs.Close)
return rs
}
func (rs *recordingServer) bypass() (string, bool) {
v, ok := rs.last[http.CanonicalHeaderKey(bypassHeader)]
if !ok || len(v) == 0 {
return "", false
}
return v[0], true
}
func TestBypassHeader_SentOnEveryRequestKindWhenConfigured(t *testing.T) {
t.Setenv(BypassSecretEnv, "s3cret")
srv := newRecordingServer(t)
c := New(srv.URL, "tok", "test")
if _, err := c.ListTools("meta-ads-mcp"); err != nil {
t.Fatalf("ListTools: %v", err)
}
if got, ok := srv.bypass(); !ok || got != "s3cret" {
t.Errorf("tools/list: bypass header = %q, %v; want s3cret", got, ok)
}
if got := srv.last.Get("Authorization"); got != "Bearer tok" {
t.Errorf("tools/list: Authorization = %q; want Bearer tok", got)
}
if got := srv.last.Get("User-Agent"); got != "pipeboard-cli/test" {
t.Errorf("tools/list: User-Agent = %q", got)
}
if err := c.notify("meta-ads-mcp", "notifications/initialized", nil); err != nil {
t.Fatalf("notify: %v", err)
}
if got, ok := srv.bypass(); !ok || got != "s3cret" {
t.Errorf("notify: bypass header = %q, %v; want s3cret", got, ok)
}
rest := NewREST(srv.URL, "tok", "test")
if _, err := rest.Post("/api/debug/x", map[string]string{"a": "b"}); err != nil {
t.Fatalf("REST Post: %v", err)
}
if got, ok := srv.bypass(); !ok || got != "s3cret" {
t.Errorf("REST: bypass header = %q, %v; want s3cret", got, ok)
}
if _, err := FetchToolsHash(srv.URL, "test"); err != nil {
t.Fatalf("FetchToolsHash: %v", err)
}
if got, ok := srv.bypass(); !ok || got != "s3cret" {
t.Errorf("tools-hash: bypass header = %q, %v; want s3cret", got, ok)
}
if got := srv.last.Get("Authorization"); got != "" {
t.Errorf("tools-hash must stay unauthenticated, got Authorization=%q", got)
}
}
func TestBypassHeader_OmittedWhenUnset(t *testing.T) {
t.Setenv(BypassSecretEnv, "")
srv := newRecordingServer(t)
c := New(srv.URL, "tok", "test")
if _, err := c.ListTools("meta-ads-mcp"); err != nil {
t.Fatalf("ListTools: %v", err)
}
if got, ok := srv.bypass(); ok {
t.Errorf("bypass header should be absent when env is unset, got %q", got)
}
if got := srv.last.Get("Authorization"); got != "Bearer tok" {
t.Errorf("Authorization = %q; want Bearer tok", got)
}
if _, err := FetchToolsHash(srv.URL, "test"); err != nil {
t.Fatalf("FetchToolsHash: %v", err)
}
if got, ok := srv.bypass(); ok {
t.Errorf("tools-hash: bypass header should be absent, got %q", got)
}
}