@@ -2,7 +2,9 @@ package github
22
33import (
44 "context"
5+ "errors"
56 "fmt"
7+ "io"
68 "net/http"
79 "net/http/httptest"
810 "net/url"
@@ -29,6 +31,23 @@ func setup() (client *github.Client, mux *http.ServeMux, teardown func()) {
2931 return client , mux , server .Close
3032}
3133
34+ func testBody (t * testing.T , r * http.Request , want string ) {
35+ t .Helper ()
36+ b , err := io .ReadAll (r .Body )
37+ if err != nil {
38+ t .Fatalf ("Error reading request body: %v" , err )
39+ }
40+ if got := string (b ); got != want {
41+ t .Errorf ("request body\n have: %q\n want: %q" , got , want )
42+ }
43+ }
44+
45+ func testMethod (t * testing.T , r * http.Request , want string ) {
46+ if want != r .Method {
47+ t .Errorf ("Request method = %v, want %v" , r .Method , want )
48+ }
49+ }
50+
3251func TestNewGithubClient (t * testing.T ) {
3352 ctx := context .Background ()
3453 client := NewGithubClient (ctx , "access_token" )
@@ -176,7 +195,7 @@ func TestLastReleaseShouldReturnTheLastRelease(t *testing.T) {
176195 }
177196}
178197
179- func TestLastReleaseShouldNotReturnErrorForInvalidStatusCode (t * testing.T ) {
198+ func TestLastReleaseShouldReturnWrappedErrorForCodeStatusNotFound (t * testing.T ) {
180199 ctx := context .Background ()
181200 client , mux , tearDown := setup ()
182201 defer tearDown ()
@@ -187,12 +206,14 @@ func TestLastReleaseShouldNotReturnErrorForInvalidStatusCode(t *testing.T) {
187206
188207 repClient := NewRepositoryClient ("o" , "r" , client )
189208
190- got , err := repClient .LastRelease (ctx )
191- if err != nil {
192- t .Error ("Should not return error for 404 status code" )
209+ _ , err := repClient .LastRelease (ctx )
210+ var errorResponse * github.ErrorResponse
211+ if ! errors .As (err , & errorResponse ) {
212+ t .Fatalf ("LastRelease(GitHub API responds with 404) returned wrapped error of type %T, want: %T," , err , errorResponse )
193213 }
194- if got != nil {
195- t .Error ("Release should be nil" )
214+ if got , want := errorResponse .Response .StatusCode , http .StatusNotFound ; got != want {
215+ t .Errorf ("LastRelease(GitHub API responds with 404) returned wrapped error of type %T with StatusCode %d, want: %d" ,
216+ errorResponse , got , want )
196217 }
197218}
198219
@@ -274,19 +295,75 @@ func TestEditReleaseShouldEditTheRelease(t *testing.T) {
274295 }
275296}
276297
277- func TestEditReleaseShouldReturnErrorForNilCurrentRelease (t * testing.T ) {
298+ func TestEditReleaseShouldReturnErrorForNilInputRelease (t * testing.T ) {
278299 ctx := context .Background ()
279300 client , _ , tearDown := setup ()
280301 defer tearDown ()
281302
282303 repClient := NewRepositoryClient ("o" , "r" , client )
283304
284- rel , err := repClient .EditRelease (ctx , nil )
305+ _ , err := repClient .EditRelease (ctx , nil )
285306 if err == nil {
286- t .Fatalf ("Should return eror " )
307+ t .Fatalf ("EditRelease should return error when input release is nil " )
287308 }
288- if rel != nil {
289- t .Errorf ("got = %v; want nil" , rel )
309+ }
310+
311+ func TestEditReleaseShouldReturnErrorOnGitHubAPIError (t * testing.T ) {
312+ ctx := context .Background ()
313+ client , mux , tearDown := setup ()
314+ defer tearDown ()
315+
316+ mux .HandleFunc ("/repos/o/r/releases/12" , func (w http.ResponseWriter , r * http.Request ) {
317+ w .WriteHeader (http .StatusServiceUnavailable )
318+ })
319+
320+ repClient := NewRepositoryClient ("o" , "r" , client )
321+
322+ editRelease := & ergo.Release {
323+ ID : 12 ,
324+ Body : "release_body" ,
325+ TagName : "tag_name" ,
326+ ReleaseURL : "release_url" ,
327+ }
328+ _ , err := repClient .EditRelease (ctx , editRelease )
329+ if err == nil {
330+ t .Errorf ("EditRelease should return error when GitHub API sends code 503" )
331+ }
332+ }
333+
334+ func TestPublishReleaseSuccess (t * testing.T ) {
335+ client , mux , tearDown := setup ()
336+ defer tearDown ()
337+
338+ mux .HandleFunc ("/repos/o/r/releases/12" , func (w http.ResponseWriter , r * http.Request ) {
339+ testMethod (t , r , "PATCH" )
340+ testBody (t , r , `{"draft":false}` + "\n " )
341+ fmt .Fprintf (w , `{}` )
342+ })
343+
344+ repoClient := NewRepositoryClient ("o" , "r" , client )
345+
346+ ctx := context .Background ()
347+ if err := repoClient .PublishRelease (ctx , 12 ); err != nil {
348+ t .Errorf ("PublishRelease returned error: %v" , err )
349+ }
350+ }
351+
352+ func TestPublishReleaseError (t * testing.T ) {
353+ client , mux , tearDown := setup ()
354+ defer tearDown ()
355+
356+ mux .HandleFunc ("/repos/o/r/releases/12" , func (w http.ResponseWriter , r * http.Request ) {
357+ testMethod (t , r , "PATCH" )
358+ testBody (t , r , `{"draft":false}` + "\n " )
359+ w .WriteHeader (http .StatusServiceUnavailable )
360+ })
361+
362+ repoClient := NewRepositoryClient ("o" , "r" , client )
363+
364+ ctx := context .Background ()
365+ if err := repoClient .PublishRelease (ctx , 12 ); err == nil {
366+ t .Error ("PublishRelease expected to return error" )
290367 }
291368}
292369
0 commit comments