@@ -2,10 +2,12 @@ package spotify
22
33import (
44 "context"
5+ "errors"
56 "io"
67 "net/http"
78 "net/http/httptest"
89 "os"
10+ "strconv"
911 "strings"
1012 "testing"
1113 "time"
@@ -105,6 +107,52 @@ func TestNewReleasesRateLimitExceeded(t *testing.T) {
105107 }
106108}
107109
110+ func TestRateLimitExceededReportsRetryAfter (t * testing.T ) {
111+ t .Parallel ()
112+ const retryAfter = 2
113+
114+ handlers := []http.HandlerFunc {
115+ // first attempt fails
116+ http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
117+ w .Header ().Set ("Retry-After" , strconv .Itoa (retryAfter ))
118+ w .WriteHeader (rateLimitExceededStatusCode )
119+ _ , _ = io .WriteString (w , `{ "error": { "message": "slow down", "status": 429 } }` )
120+ }),
121+ // next attempt succeeds
122+ http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
123+ f , err := os .Open ("test_data/new_releases.txt" )
124+ if err != nil {
125+ t .Fatal (err )
126+ }
127+ defer f .Close ()
128+ _ , err = io .Copy (w , f )
129+ if err != nil {
130+ t .Fatal (err )
131+ }
132+ }),
133+ }
134+
135+ i := 0
136+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
137+ handlers [i ](w , r )
138+ i ++
139+ }))
140+ defer server .Close ()
141+
142+ client := & Client {http : http .DefaultClient , baseURL : server .URL + "/" }
143+ _ , err := client .NewReleases (context .Background ())
144+ if err == nil {
145+ t .Fatal ("expected an error" )
146+ }
147+ var spotifyError Error
148+ if ! errors .As (err , & spotifyError ) {
149+ t .Fatalf ("expected a spotify error, got %T" , err )
150+ }
151+ if retryAfter * time .Second - time .Until (spotifyError .RetryAfter ) > time .Second {
152+ t .Error ("expected RetryAfter value" )
153+ }
154+ }
155+
108156func TestClient_Token (t * testing.T ) {
109157 // oauth setup for valid test token
110158 config := oauth2.Config {
0 commit comments