@@ -36,13 +36,15 @@ func TestPublishReleaseFlipsDraftToPublished(t *testing.T) {
3636 defer mu .Unlock ()
3737 authHdr = append (authHdr , r .Header .Get ("Authorization" ))
3838 switch {
39- case r .Method == http .MethodGet && r .URL .Path == "/repos/jeduden/mdsmith/releases/tags/v1.2.3 " :
39+ case r .Method == http .MethodGet && r .URL .Path == "/repos/jeduden/mdsmith/releases" :
4040 gets ++
4141 if gets == 1 {
42- http .NotFound (w , r )
42+ // The draft has not materialized yet: the list
43+ // endpoint returns other releases but not this tag.
44+ _ , _ = fmt .Fprint (w , `[{"id":7,"draft":false,"tag_name":"v1.2.2"}]` )
4345 return
4446 }
45- _ , _ = fmt .Fprint (w , `{"id":42,"draft":true} ` )
47+ _ , _ = fmt .Fprint (w , `[ {"id":42,"draft":true,"tag_name":"v1.2.3"}] ` )
4648 case r .Method == http .MethodPatch && r .URL .Path == "/repos/jeduden/mdsmith/releases/42" :
4749 patched = true
4850 patchID = r .URL .Path
@@ -76,12 +78,55 @@ func TestPublishReleaseFlipsDraftToPublished(t *testing.T) {
7678 }
7779}
7880
81+ func TestPublishReleaseFollowsPaginationToFindDraft (t * testing.T ) {
82+ var patched bool
83+ var srv * httptest.Server
84+ srv = httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
85+ isList := r .Method == http .MethodGet && r .URL .Path == "/repos/jeduden/mdsmith/releases"
86+ page := r .URL .Query ().Get ("page" )
87+ switch {
88+ case isList && page == "" :
89+ w .Header ().Set ("Link" ,
90+ `<` + srv .URL + `/repos/jeduden/mdsmith/releases?page=2>; rel="next", ` +
91+ `<` + srv .URL + `/repos/jeduden/mdsmith/releases?page=2>; rel="last"` )
92+ _ , _ = fmt .Fprint (w , `[{"id":1,"draft":false,"tag_name":"v1.2.2"}]` )
93+ case isList && page == "2" :
94+ _ , _ = fmt .Fprint (w , `[{"id":99,"draft":true,"tag_name":"v1.2.3"}]` )
95+ case r .Method == http .MethodPatch && r .URL .Path == "/repos/jeduden/mdsmith/releases/99" :
96+ patched = true
97+ _ , _ = fmt .Fprint (w , `{"id":99,"draft":false}` )
98+ default :
99+ t .Errorf ("unexpected request %s %s" , r .Method , r .URL .String ())
100+ http .Error (w , "unexpected" , http .StatusTeapot )
101+ }
102+ }))
103+ t .Cleanup (srv .Close )
104+
105+ err := PublishRelease (PublishReleaseOptions {
106+ Repository : "jeduden/mdsmith" ,
107+ Tag : "v1.2.3" ,
108+ Token : "t" ,
109+ APIBaseURL : srv .URL ,
110+ })
111+ require .NoError (t , err )
112+ assert .True (t , patched )
113+ }
114+
115+ func TestNextPageURL (t * testing.T ) {
116+ hdr := `<https://api.github.com/repositories/1/releases?page=2>; rel="next", ` +
117+ `<https://api.github.com/repositories/1/releases?page=9>; rel="last"`
118+ assert .Equal (t , "https://api.github.com/repositories/1/releases?page=2" , nextPageURL (hdr ))
119+
120+ assert .Equal (t , "" , nextPageURL ("" ))
121+ assert .Equal (t , "" , nextPageURL (`<https://x/p?page=9>; rel="last"` ))
122+ }
123+
79124func TestPublishReleaseAlreadyPublishedIsNoOp (t * testing.T ) {
80125 srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
81126 if r .Method != http .MethodGet {
82127 t .Errorf ("already-published release must not be patched, got %s" , r .Method )
83128 }
84- _ , _ = fmt .Fprint (w , `{"id":7,"draft":false} ` )
129+ _ , _ = fmt .Fprint (w , `[ {"id":7,"draft":false,"tag_name":"v1.2.3"}] ` )
85130 }))
86131 t .Cleanup (srv .Close )
87132
@@ -96,9 +141,10 @@ func TestPublishReleaseAlreadyPublishedIsNoOp(t *testing.T) {
96141
97142func TestPublishReleaseMissingAfterRetriesErrors (t * testing.T ) {
98143 var calls , sleeps int
99- srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
144+ srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
100145 calls ++
101- http .NotFound (w , r )
146+ // The draft for v9.9.9 never appears in the list.
147+ _ , _ = fmt .Fprint (w , `[{"id":1,"draft":false,"tag_name":"v9.9.8"}]` )
102148 }))
103149 t .Cleanup (srv .Close )
104150
@@ -151,7 +197,7 @@ func TestPublishReleaseLookupUnexpectedStatusErrors(t *testing.T) {
151197func TestPublishReleasePatchUnexpectedStatusErrors (t * testing.T ) {
152198 srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
153199 if r .Method == http .MethodGet {
154- _ , _ = fmt .Fprint (w , `{"id":3,"draft":true} ` )
200+ _ , _ = fmt .Fprint (w , `[ {"id":3,"draft":true,"tag_name":"v1.2.3"}] ` )
155201 return
156202 }
157203 w .WriteHeader (http .StatusUnprocessableEntity )
@@ -200,7 +246,7 @@ func TestPublishReleaseUsesDefaultAPIBase(t *testing.T) {
200246 gotURL = r .URL .String ()
201247 return & http.Response {
202248 StatusCode : http .StatusOK ,
203- Body : io .NopCloser (strings .NewReader (`{"id":1,"draft":false} ` )),
249+ Body : io .NopCloser (strings .NewReader (`[ {"id":1,"draft":false,"tag_name":"v1.2.3"}] ` )),
204250 Header : make (http.Header ),
205251 }, nil
206252 })}
@@ -211,7 +257,7 @@ func TestPublishReleaseUsesDefaultAPIBase(t *testing.T) {
211257 Client : client ,
212258 })
213259 require .NoError (t , err )
214- assert .Equal (t , "https://api.github.com/repos/jeduden/mdsmith/releases/tags/v1.2.3 " , gotURL )
260+ assert .Equal (t , "https://api.github.com/repos/jeduden/mdsmith/releases?per_page=100 " , gotURL )
215261}
216262
217263func TestPublishReleaseClientDoError (t * testing.T ) {
@@ -237,7 +283,7 @@ func TestPublishReleasePatchTransportError(t *testing.T) {
237283 }
238284 return & http.Response {
239285 StatusCode : http .StatusOK ,
240- Body : io .NopCloser (strings .NewReader (`{"id":5,"draft":true} ` )),
286+ Body : io .NopCloser (strings .NewReader (`[ {"id":5,"draft":true,"tag_name":"v1.2.3"}] ` )),
241287 Header : make (http.Header ),
242288 }, nil
243289 })}
0 commit comments