From 7ef35b2832bbae9cc9b52c05f9585d1cf2d3aa1b Mon Sep 17 00:00:00 2001 From: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> Date: Thu, 28 Nov 2024 16:10:33 +0100 Subject: [PATCH] Fix error source bug in ErrorResponseWithErrorSource (#1158) * Fix error source bug in ErrorResponseWithErrorSource * Fix lint * Add tests --- backend/error_source.go | 2 +- backend/error_source_test.go | 49 ++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/backend/error_source.go b/backend/error_source.go index 4981228a7..4a1cef45c 100644 --- a/backend/error_source.go +++ b/backend/error_source.go @@ -93,7 +93,7 @@ func ErrorResponseWithErrorSource(err error) DataResponse { var e ErrorWithSource if errors.As(err, &e) { return DataResponse{ - Error: e, + Error: err, ErrorSource: e.ErrorSource(), } } diff --git a/backend/error_source_test.go b/backend/error_source_test.go index d10926ee9..cf19b13ac 100644 --- a/backend/error_source_test.go +++ b/backend/error_source_test.go @@ -1,6 +1,8 @@ package backend_test import ( + "errors" + "fmt" "testing" "github.com/grafana/grafana-plugin-sdk-go/backend" @@ -16,3 +18,50 @@ func TestErrorSource(t *testing.T) { require.True(t, backend.ErrorSourcePlugin.IsValid()) require.Equal(t, "plugin", backend.ErrorSourcePlugin.String()) } + +func TestResponseWithOptions(t *testing.T) { + for _, tc := range []struct { + name string + err error + expErrorMessage string + expErrorSource backend.ErrorSource + }{ + { + name: "plugin error", + err: backend.PluginError(errors.New("unknown")), + expErrorMessage: "unknown", + expErrorSource: backend.ErrorSourcePlugin, + }, + { + name: "downstream error", + err: backend.DownstreamError(errors.New("bad gateway")), + expErrorMessage: "bad gateway", + expErrorSource: backend.ErrorSourceDownstream, + }, + { + name: "wrapped downstream error", + err: fmt.Errorf("wrapped: %w", backend.DownstreamError(errors.New("inside error"))), + expErrorMessage: "wrapped: inside error", + expErrorSource: backend.ErrorSourceDownstream, + }, + { + name: "wrapped plugin error", + err: fmt.Errorf("wrapped: %w", backend.PluginError(errors.New("inside error"))), + expErrorMessage: "wrapped: inside error", + expErrorSource: backend.ErrorSourcePlugin, + }, + { + name: "non error source error", + err: errors.New("inside error"), + expErrorMessage: "inside error", + expErrorSource: "", + }, + } { + t.Run(tc.name, func(t *testing.T) { + res := backend.ErrorResponseWithErrorSource(tc.err) + require.Error(t, res.Error) + require.Equal(t, tc.expErrorMessage, res.Error.Error()) + require.Equal(t, tc.expErrorSource, res.ErrorSource) + }) + } +}