refactor(http): extract retry delay unit to variable

Extract hardcoded retry delay unit to a variable for better testability and flexibility. Update tests to use milliseconds for faster execution while maintaining the same behavior.
This commit is contained in:
yumosx 2026-02-26 09:33:43 +08:00
parent 1aa556829d
commit 57ad26aee8
2 changed files with 11 additions and 2 deletions

View file

@ -9,6 +9,8 @@ import (
const maxRetries = 3 const maxRetries = 3
var retryDelayUnit = time.Second
func shouldRetry(statusCode int) bool { func shouldRetry(statusCode int) bool {
return statusCode == http.StatusTooManyRequests || return statusCode == http.StatusTooManyRequests ||
statusCode >= 500 statusCode >= 500
@ -34,7 +36,7 @@ func DoRequestWithRetry(client *http.Client, req *http.Request) (*http.Response,
} }
if i < maxRetries-1 { if i < maxRetries-1 {
if err = sleepWithCtx(req.Context(), time.Second*time.Duration(i+1)); err != nil { if err = sleepWithCtx(req.Context(), retryDelayUnit*time.Duration(i+1)); err != nil {
return nil, fmt.Errorf("failed to sleep: %w", err) return nil, fmt.Errorf("failed to sleep: %w", err)
} }
} }

View file

@ -11,6 +11,9 @@ import (
) )
func TestDoRequestWithRetry(t *testing.T) { func TestDoRequestWithRetry(t *testing.T) {
retryDelayUnit = time.Millisecond
t.Cleanup(func() { retryDelayUnit = time.Second })
testcases := []struct { testcases := []struct {
name string name string
serverBehavior func(*httptest.Server) int serverBehavior func(*httptest.Server) int
@ -53,6 +56,7 @@ func TestDoRequestWithRetry(t *testing.T) {
for _, tc := range testcases { for _, tc := range testcases {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
t.Parallel()
attempts := 0 attempts := 0
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
attempts++ attempts++
@ -91,6 +95,9 @@ func TestDoRequestWithRetry(t *testing.T) {
} }
func TestDoRequestWithRetry_Delay(t *testing.T) { func TestDoRequestWithRetry_Delay(t *testing.T) {
retryDelayUnit = time.Millisecond
t.Cleanup(func() { retryDelayUnit = time.Second })
var start time.Time var start time.Time
delays := []time.Duration{} delays := []time.Duration{}
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@ -124,5 +131,5 @@ func TestDoRequestWithRetry_Delay(t *testing.T) {
assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, http.StatusOK, resp.StatusCode)
resp.Body.Close() resp.Body.Close()
assert.GreaterOrEqual(t, delays[2], time.Second) assert.GreaterOrEqual(t, delays[2], time.Millisecond)
} }