@@ -1029,6 +1029,24 @@ func TestDiscoverRedactsCredentialQueryInInvalidSpecURL(t *testing.T) {
10291029 }
10301030}
10311031
1032+ func TestDiscoverNilFetchResponseReturnsError (t * testing.T ) {
1033+ cfg := DiscoverConfig {
1034+ APIName : "nil-response" ,
1035+ BaseURL : "https://api.example.com" ,
1036+ SpecURL : "https://api.example.com/openapi.json" ,
1037+ Fetch : func (context.Context , string , http.RoundTripper ) (* http.Response , error ) {
1038+ return nil , nil
1039+ },
1040+ }
1041+ _ , err := Discover (context .Background (), cfg , DefaultLoaders ())
1042+ if err == nil {
1043+ t .Fatal ("expected nil fetch response failure" )
1044+ }
1045+ if got := err .Error (); ! strings .Contains (got , "GET https://api.example.com/openapi.json: no response" ) {
1046+ t .Fatalf ("expected no response error, got: %v" , err )
1047+ }
1048+ }
1049+
10321050func TestDiscoverResolvesSameOriginRemoteExternalRefs (t * testing.T ) {
10331051 root := `openapi: "3.1.0"
10341052info:
@@ -1525,10 +1543,12 @@ func TestDiscoverRedactsCredentialQueryInExternalRefFailures(t *testing.T) {
15251543 ref string
15261544 want string
15271545 itemErr bool
1546+ itemNil bool
15281547 status int
15291548 }{
15301549 {name : "status" , ref : "./item.yaml?api_key=ref-secret&version=1" , want : "https://specs.example.com/item.yaml?version=1" , status : http .StatusInternalServerError },
15311550 {name : "transport" , ref : "./item.yaml?api_key=ref-secret&version=1" , want : "https://specs.example.com/item.yaml?version=1" , itemErr : true },
1551+ {name : "nil response" , ref : "./item.yaml?api_key=ref-secret&version=1" , want : "https://specs.example.com/item.yaml?version=1" , itemNil : true },
15321552 {name : "unsupported scheme" , ref : "ftp://files.example.com/item.yaml?api_key=ref-secret&version=1" , want : "ftp://files.example.com/item.yaml?version=1" },
15331553 {name : "malformed" , ref : "./item.yaml?api_key=ref-secret%zz&version=1" , want : "https://specs.example.com/item.yaml?version=1" },
15341554 }
@@ -1548,6 +1568,9 @@ paths:
15481568 if tt .itemErr {
15491569 return nil , fmt .Errorf ("dial failed for %s" , r .URL .String ())
15501570 }
1571+ if tt .itemNil {
1572+ return nil , nil
1573+ }
15511574 return httpResponse (tt .status , "text/plain" , "server error" , nil ), nil
15521575 default :
15531576 return httpResponse (404 , "text/plain" , "not found" , nil ), nil
@@ -1578,6 +1601,14 @@ paths:
15781601 }
15791602}
15801603
1604+ func TestOpenAPIRefDisplayURLPreservesAbsoluteFragmentAndRedactsQuery (t * testing.T ) {
1605+ got := openAPIRefDisplayURL ("https://user:pass@example.com/schema.yaml?api_key=secret&version=1#/components/schemas/Foo" )
1606+ want := "https://example.com/schema.yaml?version=1#/components/schemas/Foo"
1607+ if got != want {
1608+ t .Fatalf ("display URL = %q, want %q" , got , want )
1609+ }
1610+ }
1611+
15811612func TestDiscover_ExternalRefDeadlineNamesRef (t * testing.T ) {
15821613 tr := roundTripperFunc (func (r * http.Request ) (* http.Response , error ) {
15831614 switch r .URL .Path {
0 commit comments