Rate limit errors, prevent requests if above limit

Signed-off-by: Vartan Benohanian <vartanbeno@gmail.com>
This commit is contained in:
Vartan Benohanian
2020-09-28 22:13:50 -04:00
parent 28b59f02c7
commit 6f79da6e35
3 changed files with 170 additions and 2 deletions
+52
View File
@@ -10,6 +10,7 @@ import (
"os"
"reflect"
"testing"
"time"
"github.com/stretchr/testify/require"
)
@@ -221,3 +222,54 @@ func TestClient_ErrorResponse(t *testing.T) {
require.EqualError(t, err, fmt.Sprintf(`GET %s/api/v1/test: 403 error message`, client.BaseURL))
require.Equal(t, http.StatusForbidden, resp.StatusCode)
}
func TestClient_Do_RateLimitError(t *testing.T) {
client, mux, teardown := setup()
defer teardown()
var counter int
mux.HandleFunc("/api/v1/test", func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, http.MethodGet, r.Method)
defer func() { counter++ }()
switch counter {
case 0:
w.Header().Set(headerRateLimitRemaining, "500")
w.Header().Set(headerRateLimitUsed, "100")
w.Header().Set(headerRateLimitReset, "120")
case 1:
w.Header().Set(headerRateLimitRemaining, "0")
w.Header().Set(headerRateLimitUsed, "600")
w.Header().Set(headerRateLimitReset, "240")
}
})
req, err := client.NewRequest(http.MethodGet, "api/v1/test", nil)
require.NoError(t, err)
client.rate.Remaining = 0
client.rate.Reset = time.Now().Add(time.Minute)
resp, err := client.Do(ctx, req, nil)
require.Equal(t, 0, counter)
require.IsType(t, &RateLimitError{}, err)
require.Equal(t, http.StatusTooManyRequests, resp.StatusCode)
client.rate = Rate{}
resp, err = client.Do(ctx, req, nil)
require.Equal(t, 1, counter)
require.Nil(t, err)
require.Equal(t, http.StatusOK, resp.StatusCode)
require.Equal(t, 500, resp.Rate.Remaining)
require.Equal(t, 100, resp.Rate.Used)
require.Equal(t, time.Now().Truncate(time.Second).Add(time.Minute*2), resp.Rate.Reset)
resp, err = client.Do(ctx, req, nil)
require.Equal(t, 2, counter)
require.IsType(t, &RateLimitError{}, err)
require.Equal(t, http.StatusOK, resp.StatusCode)
require.Equal(t, 0, resp.Rate.Remaining)
require.Equal(t, 600, resp.Rate.Used)
require.Equal(t, time.Now().Truncate(time.Second).Add(time.Minute*4), resp.Rate.Reset)
}