@ -538,6 +538,71 @@ func TestDo_rateLimit_noNetworkCall(t *testing.T) {
}
}
// Ensure *AbuseRateLimitError is returned when the response indicates that
// the client has triggered an abuse detection mechanism.
func TestDo_rateLimit_abuseRateLimitError ( t * testing . T ) {
setup ( )
defer teardown ( )
mux . HandleFunc ( "/" , func ( w http . ResponseWriter , r * http . Request ) {
w . Header ( ) . Set ( "Content-Type" , "application/json; charset=utf-8" )
w . WriteHeader ( http . StatusForbidden )
// When the abuse rate limit error is of the "temporarily blocked from content creation" type,
// there is no "Retry-After" header.
fmt . Fprintln ( w , ` {
"message" : "You have triggered an abuse detection mechanism and have been temporarily blocked from content creation. Please retry your request again later." ,
"documentation_url" : "https://developer.github.com/v3#abuse-rate-limits"
} ` )
} )
req , _ := client . NewRequest ( "GET" , "/" , nil )
_ , err := client . Do ( req , nil )
if err == nil {
t . Error ( "Expected error to be returned." )
}
abuseRateLimitErr , ok := err . ( * AbuseRateLimitError )
if ! ok {
t . Fatalf ( "Expected a *AbuseRateLimitError error; got %#v." , err )
}
if got , want := abuseRateLimitErr . RetryAfter , ( * time . Duration ) ( nil ) ; got != want {
t . Errorf ( "abuseRateLimitErr RetryAfter = %v, want %v" , got , want )
}
}
// Ensure *AbuseRateLimitError.RetryAfter is parsed correctly.
func TestDo_rateLimit_abuseRateLimitError_retryAfter ( t * testing . T ) {
setup ( )
defer teardown ( )
mux . HandleFunc ( "/" , func ( w http . ResponseWriter , r * http . Request ) {
w . Header ( ) . Set ( "Content-Type" , "application/json; charset=utf-8" )
w . Header ( ) . Set ( "Retry-After" , "123" ) // Retry after value of 123 seconds.
w . WriteHeader ( http . StatusForbidden )
fmt . Fprintln ( w , ` {
"message" : "You have triggered an abuse detection mechanism ..." ,
"documentation_url" : "https://developer.github.com/v3#abuse-rate-limits"
} ` )
} )
req , _ := client . NewRequest ( "GET" , "/" , nil )
_ , err := client . Do ( req , nil )
if err == nil {
t . Error ( "Expected error to be returned." )
}
abuseRateLimitErr , ok := err . ( * AbuseRateLimitError )
if ! ok {
t . Fatalf ( "Expected a *AbuseRateLimitError error; got %#v." , err )
}
if abuseRateLimitErr . RetryAfter == nil {
t . Fatalf ( "abuseRateLimitErr RetryAfter is nil, expected not-nil" )
}
if got , want := * abuseRateLimitErr . RetryAfter , 123 * time . Second ; got != want {
t . Errorf ( "abuseRateLimitErr RetryAfter = %v, want %v" , got , want )
}
}
func TestDo_noContent ( t * testing . T ) {
setup ( )
defer teardown ( )