@@ -2,32 +2,91 @@ package transport
22
33import (
44 "net/http"
5- "net/http/httptest"
65 "testing"
76
87 "github.com/github/github-mcp-server/pkg/http/headers"
98 "github.com/stretchr/testify/assert"
109 "github.com/stretchr/testify/require"
1110)
1211
12+ type roundTripFunc func (* http.Request ) (* http.Response , error )
13+
14+ func (f roundTripFunc ) RoundTrip (req * http.Request ) (* http.Response , error ) {
15+ return f (req )
16+ }
17+
1318func TestAPIVersionTransport (t * testing.T ) {
1419 t .Parallel ()
1520
16- var gotVersion string
17- server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
18- gotVersion = r .Header .Get (headers .GitHubAPIVersionHeader )
19- w .WriteHeader (http .StatusOK )
20- }))
21- defer server .Close ()
21+ tests := []struct {
22+ name string
23+ url string
24+ existingVersion string
25+ wantVersion string
26+ }{
27+ {
28+ name : "GitHub.com overrides the default version" ,
29+ url : "https://api.github.com/repos/octo-org/octo-repo" ,
30+ existingVersion : headers .GitHubEnterpriseServerAPIVersion ,
31+ wantVersion : headers .GitHubAPIVersion ,
32+ },
33+ {
34+ name : "GitHub Enterprise Cloud sets the new version" ,
35+ url : "https://api.example.ghe.com/repos/octo-org/octo-repo" ,
36+ wantVersion : headers .GitHubAPIVersion ,
37+ },
38+ {
39+ name : "GitHub Enterprise Server pins the compatibility version" ,
40+ url : "https://github.example.com/api/v3/repos/octo-org/octo-repo" ,
41+ existingVersion : headers .GitHubAPIVersion ,
42+ wantVersion : headers .GitHubEnterpriseServerAPIVersion ,
43+ },
44+ {
45+ name : "GitHub Enterprise Server sets the compatibility version" ,
46+ url : "https://github.example.com/api/v3/repos/octo-org/octo-repo" ,
47+ wantVersion : headers .GitHubEnterpriseServerAPIVersion ,
48+ },
49+ {
50+ name : "host classification is case insensitive" ,
51+ url : "https://API.GITHUB.COM/repos/octo-org/octo-repo" ,
52+ wantVersion : headers .GitHubAPIVersion ,
53+ },
54+ {
55+ name : "lookalike domain is treated as GitHub Enterprise Server" ,
56+ url : "https://api.github.com.example.org/api/v3/" ,
57+ wantVersion : headers .GitHubEnterpriseServerAPIVersion ,
58+ },
59+ }
60+
61+ for _ , tt := range tests {
62+ t .Run (tt .name , func (t * testing.T ) {
63+ t .Parallel ()
64+
65+ var gotVersion string
66+ underlying := roundTripFunc (func (req * http.Request ) (* http.Response , error ) {
67+ gotVersion = req .Header .Get (headers .GitHubAPIVersionHeader )
68+ return & http.Response {
69+ StatusCode : http .StatusOK ,
70+ Header : make (http.Header ),
71+ Body : http .NoBody ,
72+ Request : req ,
73+ }, nil
74+ })
2275
23- req , err := http .NewRequest (http .MethodGet , server .URL , nil )
24- require .NoError (t , err )
25- req .Header .Set (headers .GitHubAPIVersionHeader , "2022-11-28" )
76+ req , err := http .NewRequest (http .MethodGet , tt .url , nil )
77+ require .NoError (t , err )
78+ if tt .existingVersion != "" {
79+ req .Header .Set (headers .GitHubAPIVersionHeader , tt .existingVersion )
80+ } else {
81+ req .Header = nil
82+ }
2683
27- resp , err := (& APIVersionTransport {}).RoundTrip (req )
28- require .NoError (t , err )
29- defer resp .Body .Close ()
84+ resp , err := (& APIVersionTransport {Transport : underlying }).RoundTrip (req )
85+ require .NoError (t , err )
86+ defer resp .Body .Close ()
3087
31- assert .Equal (t , headers .GitHubAPIVersion , gotVersion )
32- assert .Equal (t , "2022-11-28" , req .Header .Get (headers .GitHubAPIVersionHeader ))
88+ assert .Equal (t , tt .wantVersion , gotVersion )
89+ assert .Equal (t , tt .existingVersion , req .Header .Get (headers .GitHubAPIVersionHeader ), "the original request must not be mutated" )
90+ })
91+ }
3392}
0 commit comments