1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
package datadog
import (
"fmt"
"github.com/stretchr/testify/assert"
"net/http"
"net/url"
"testing"
)
func Test_updateRateLimits(t *testing.T) {
// fake client to ensure that we are race free.
client := Client{
rateLimitingStats: make(map[string]RateLimit),
}
tests := []struct {
desc string
api *url.URL
resp *http.Response
header RateLimit
error error
}{
{
"nominal case query",
&url.URL{Path: "/v1/query"},
makeHeader(RateLimit{"1", "2", "3", "4"}),
RateLimit{"1", "2", "3", "4"},
nil,
},
{
"nominal case logs",
&url.URL{Path: "/v1/logs-queries/list"},
makeHeader(RateLimit{"2", "2", "1", "5"}),
RateLimit{"2", "2", "1", "5"},
nil,
},
{
"no response",
&url.URL{Path: ""},
nil,
RateLimit{},
fmt.Errorf("malformed HTTP content."),
},
{
"no header",
&url.URL{Path: "/v2/error"},
makeEmptyHeader(),
RateLimit{},
fmt.Errorf("malformed HTTP content."),
},
{
"not rate limited",
&url.URL{Path: "/v2/error"},
makeHeader(RateLimit{}),
RateLimit{},
nil,
},
{
"update case query",
&url.URL{Path: "/v1/query"},
makeHeader(RateLimit{"2", "4", "6", "4"}),
RateLimit{"2", "4", "6", "4"},
nil,
},
}
for i, tt := range tests {
t.Run(fmt.Sprintf("#%d %s", i, tt.desc), func(t *testing.T) {
err := client.updateRateLimits(tt.resp, tt.api)
assert.Equal(t, tt.error, err)
assert.Equal(t, tt.header, client.rateLimitingStats[tt.api.Path])
})
}
}
func makeHeader(r RateLimit) *http.Response {
h := http.Response{
Header: make(map[string][]string),
}
h.Header.Set("X-RateLimit-Limit", r.Limit)
h.Header.Set("X-RateLimit-Reset", r.Reset)
h.Header.Set("X-RateLimit-Period", r.Period)
h.Header.Set("X-RateLimit-Remaining", r.Remaining)
return &h
}
func makeEmptyHeader() *http.Response {
return &http.Response{
Header: nil,
}
}
|