Fix logger propagation (#85)
Go / test (push) Has been cancelled
Go / mocks (push) Has been cancelled
Go / lint (push) Has been cancelled
E2E / Basic E2E (push) Has been cancelled
Go / fmt (push) Has been cancelled

This commit is contained in:
Nikola Jokic
2026-04-24 15:50:32 +02:00
committed by GitHub
parent 02ad99e7fe
commit 72647ae108
2 changed files with 55 additions and 3 deletions
+1 -3
View File
@@ -120,9 +120,7 @@ func (o *httpClientOption) newRetryableHTTPClient() (*retryablehttp.Client, erro
retryClient.HTTPClient.Timeout = o.timeout
}
if retryClient.Logger == nil {
retryClient.Logger = o.logger
}
retryClient.Logger = o.logger
transport, ok := retryClient.HTTPClient.Transport.(*http.Transport)
if !ok {
+54
View File
@@ -3,6 +3,7 @@ package scaleset
import (
"encoding/json"
"io"
"log/slog"
"net/http"
"net/http/httptest"
"net/url"
@@ -156,6 +157,59 @@ func TestUserAgent(t *testing.T) {
assert.Equal(t, want, got)
}
func TestWithLogger(t *testing.T) {
newJSONHandler := func() slog.Handler {
return slog.NewJSONHandler(
io.Discard,
&slog.HandlerOptions{
AddSource: true,
Level: slog.LevelError,
},
)
}
t.Run("WithLogger(nil) sets a discard logger on raw httpClientOption", func(t *testing.T) {
opts := httpClientOption{}
WithLogger(nil)(&opts)
require.NotNil(t, opts.logger, "WithLogger(nil) should set a discard logger, not leave it nil")
assert.Equal(t, slog.DiscardHandler, opts.logger.Handler(), "WithLogger(nil) should set a discard logger handler")
})
t.Run("WithLogger(customLogger) assigns the provided logger", func(t *testing.T) {
handler := newJSONHandler()
customLogger := slog.New(handler)
opts := httpClientOption{}
WithLogger(customLogger)(&opts)
require.Equal(t, customLogger, opts.logger, "WithLogger should assign the provided logger")
assert.Equal(t, handler, opts.logger.Handler(), "WithLogger should set the provided logger handler")
})
t.Run("WithLogger(nil) propagates discard logger to retryable HTTP client", func(t *testing.T) {
opts := httpClientOption{}
WithLogger(nil)(&opts)
client, err := opts.newRetryableHTTPClient()
require.NoError(t, err)
assert.NotNil(t, client.Logger, "retryable client should have logger set from WithLogger(nil)")
logger, ok := client.Logger.(*slog.Logger)
require.True(t, ok, "retryable client logger should be a *slog.Logger")
assert.Same(t, opts.logger, logger, "retryable client logger should be the same logger set by WithLogger(nil)")
assert.Equal(t, slog.DiscardHandler, logger.Handler(), "retryable client logger should be a discard logger from WithLogger(nil)")
})
t.Run("WithLogger(customLogger) propagates custom logger to retryable HTTP client", func(t *testing.T) {
handler := newJSONHandler()
customLogger := slog.New(handler)
opts := httpClientOption{}
WithLogger(customLogger)(&opts)
client, err := opts.newRetryableHTTPClient()
require.NoError(t, err)
assert.NotNil(t, client.Logger, "retryable client should have logger set")
logger, ok := client.Logger.(*slog.Logger)
require.True(t, ok, "retryable client logger should be a *slog.Logger")
assert.Equal(t, handler, logger.Handler(), "retryable client logger should be the custom logger from WithLogger")
})
}
// TestWithRetryableHTTPClient verifies that a custom retryable HTTP client
// provided via WithRetryableHTTPClient is actually used instead of the built-in one
func TestWithRetryableHTTPClient(t *testing.T) {