package httpclientprovider import ( "net/http" "testing" "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" "github.com/stretchr/testify/require" ) func TestSetUserAgentMiddleware(t *testing.T) { t.Run("Without user agent set should return next http.RoundTripper", func(t *testing.T) { ctx := &testContext{} finalRoundTripper := ctx.createRoundTripper("finalrt") mw := SetUserAgentMiddleware("") rt := mw.CreateMiddleware(httpclient.Options{}, finalRoundTripper) require.NotNil(t, rt) middlewareName, ok := mw.(httpclient.MiddlewareName) require.True(t, ok) require.Equal(t, SetUserAgentMiddlewareName, middlewareName.MiddlewareName()) req, err := http.NewRequest(http.MethodGet, "http://", nil) require.NoError(t, err) res, err := rt.RoundTrip(req) require.NoError(t, err) require.NotNil(t, res) if res.Body != nil { require.NoError(t, res.Body.Close()) } require.Len(t, ctx.callChain, 1) require.ElementsMatch(t, []string{"finalrt"}, ctx.callChain) }) t.Run("With user agent set should apply HTTP headers to the request", func(t *testing.T) { ctx := &testContext{} finalRoundTripper := ctx.createRoundTripper("final") mw := SetUserAgentMiddleware("Grafana/8.0.0") rt := mw.CreateMiddleware(httpclient.Options{}, finalRoundTripper) require.NotNil(t, rt) middlewareName, ok := mw.(httpclient.MiddlewareName) require.True(t, ok) require.Equal(t, SetUserAgentMiddlewareName, middlewareName.MiddlewareName()) req, err := http.NewRequest(http.MethodGet, "http://", nil) require.NoError(t, err) res, err := rt.RoundTrip(req) require.NoError(t, err) require.NotNil(t, res) if res.Body != nil { require.NoError(t, res.Body.Close()) } require.Len(t, ctx.callChain, 1) require.ElementsMatch(t, []string{"final"}, ctx.callChain) require.Equal(t, "Grafana/8.0.0", req.Header.Get("User-Agent")) }) t.Run("With user agent set, but request already has User-Agent header set should not apply HTTP headers to the request", func(t *testing.T) { ctx := &testContext{} finalRoundTripper := ctx.createRoundTripper("final") mw := SetUserAgentMiddleware("Grafana/8.0.0") rt := mw.CreateMiddleware(httpclient.Options{}, finalRoundTripper) require.NotNil(t, rt) middlewareName, ok := mw.(httpclient.MiddlewareName) require.True(t, ok) require.Equal(t, SetUserAgentMiddlewareName, middlewareName.MiddlewareName()) req, err := http.NewRequest(http.MethodGet, "http://", nil) require.NoError(t, err) req.Header.Set("User-Agent", "ua") res, err := rt.RoundTrip(req) require.NoError(t, err) require.NotNil(t, res) if res.Body != nil { require.NoError(t, res.Body.Close()) } require.Len(t, ctx.callChain, 1) require.ElementsMatch(t, []string{"final"}, ctx.callChain) require.Equal(t, "ua", req.Header.Get("User-Agent")) }) }