Skip to content

Commit f93e36e

Browse files
authored
fix: handle sdk error (#51)
1 parent 37a97c2 commit f93e36e

File tree

3 files changed

+163
-6
lines changed

3 files changed

+163
-6
lines changed

internal/server/sdk/errors.go

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,39 @@ package sdk
22

33
import (
44
"context"
5+
"encoding/json"
6+
"errors"
57
"fmt"
68

79
"github.com/formancehq/formance-sdk-go/v3/pkg/models/sdkerrors"
810
"github.com/hashicorp/terraform-plugin-framework/diag"
911
"go.opentelemetry.io/otel/trace"
1012
)
1113

14+
type Error struct {
15+
ErrorCode string `json:"errorCode"`
16+
ErrorMessage string `json:"errorMessage"`
17+
}
18+
1219
func HandleStackError(ctx context.Context, err error, diag *diag.Diagnostics) {
13-
sharedError := &sdkerrors.V2ErrorResponse{
20+
sharedError := &Error{
1421
ErrorCode: "INTERNAL",
15-
ErrorMessage: "unexpected error",
22+
ErrorMessage: err.Error(),
1623
}
17-
switch e := err.(type) {
18-
case *sdkerrors.V2ErrorResponse:
19-
sharedError = e
24+
25+
tmp := &sdkerrors.SDKError{}
26+
if errors.As(err, &tmp) {
27+
err = errors.New(tmp.Body)
28+
}
29+
30+
errResponse := &Error{}
31+
if e := json.Unmarshal([]byte(err.Error()), errResponse); e == nil {
32+
sharedError = errResponse
2033
}
2134
span := trace.SpanFromContext(ctx)
2235
if span.SpanContext().IsValid() {
23-
diag.AddError("traceparent", fmt.Sprintf("%s-%s", span.SpanContext().TraceID(), span.SpanContext().SpanID()))
36+
traceparent := fmt.Sprintf("%s-%s", span.SpanContext().TraceID().String(), span.SpanContext().SpanID().String())
37+
sharedError.ErrorMessage = fmt.Sprintf("[Traceparent: %s] %s", traceparent, sharedError.ErrorMessage)
2438
}
2539
diag.AddError(
2640
string(sharedError.ErrorCode),

internal/server/sdk/errors_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package sdk
2+
3+
import (
4+
"context"
5+
"errors"
6+
"testing"
7+
8+
"github.com/formancehq/formance-sdk-go/v3/pkg/models/sdkerrors"
9+
"github.com/formancehq/formance-sdk-go/v3/pkg/models/shared"
10+
"github.com/formancehq/go-libs/v3/pointer"
11+
"github.com/hashicorp/terraform-plugin-framework/diag"
12+
"github.com/stretchr/testify/require"
13+
)
14+
15+
func TestHandleSDKError(t *testing.T) {
16+
for _, tt := range []struct {
17+
name string
18+
err error
19+
expected diag.Diagnostic
20+
}{
21+
{
22+
name: "Test case 1",
23+
err: errors.New(""),
24+
expected: diag.NewErrorDiagnostic(
25+
"INTERNAL",
26+
"",
27+
),
28+
},
29+
{
30+
name: "Error string",
31+
err: errors.New(`{"errorCode":"VALIDATION","errorMessage":"invalid config: polling period invalid: polling period cannot be lower than minimum of 20m0s: validation error: validation error"}`),
32+
expected: diag.NewErrorDiagnostic(
33+
"VALIDATION",
34+
"invalid config: polling period invalid: polling period cannot be lower than minimum of 20m0s: validation error: validation error",
35+
),
36+
},
37+
{
38+
name: "SDKError case",
39+
err: &sdkerrors.SDKError{
40+
Body: `{"errorCode":"SOME_ERROR","errorMessage":"An error occurred"}`,
41+
},
42+
expected: diag.NewErrorDiagnostic("SOME_ERROR", "An error occurred"),
43+
},
44+
{
45+
name: "V2ErrorResponse case",
46+
err: &sdkerrors.V2ErrorResponse{
47+
ErrorCode: "SOME_ERROR",
48+
ErrorMessage: "An error occurred",
49+
},
50+
expected: diag.NewErrorDiagnostic("SOME_ERROR", "An error occurred"),
51+
},
52+
{
53+
name: "V2BulkResponse case",
54+
err: &sdkerrors.V2BulkResponse{
55+
ErrorCode: pointer.For[shared.V2ErrorsEnum]("SOME_ERROR"),
56+
ErrorMessage: pointer.For("An error occurred"),
57+
},
58+
expected: diag.NewErrorDiagnostic("SOME_ERROR", "An error occurred"),
59+
},
60+
{
61+
name: "v3error response case",
62+
err: &sdkerrors.ErrorResponse{
63+
ErrorMessage: "a message",
64+
ErrorCode: "123",
65+
},
66+
expected: diag.NewErrorDiagnostic("123", "a message"),
67+
},
68+
{
69+
name: "invalid error type",
70+
err: errors.New("some random error"),
71+
expected: diag.NewErrorDiagnostic("INTERNAL", "some random error"),
72+
},
73+
} {
74+
t.Run(tt.name, func(t *testing.T) {
75+
diag := make(diag.Diagnostics, 0)
76+
HandleStackError(context.Background(), tt.err, &diag)
77+
require.Len(t, diag, 1)
78+
require.Equal(t, tt.expected, diag[0])
79+
})
80+
}
81+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package e2e_test
2+
3+
import (
4+
"regexp"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-framework/providerserver"
8+
"github.com/hashicorp/terraform-plugin-go/tfprotov6"
9+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
10+
"github.com/hashicorp/terraform-plugin-testing/tfversion"
11+
)
12+
13+
func TestPaymentConnector(t *testing.T) {
14+
resource.ParallelTest(t, resource.TestCase{
15+
ProtoV6ProviderFactories: map[string]func() (tfprotov6.ProviderServer, error){
16+
"cloud": providerserver.NewProtocol6WithError(CloudProvider()),
17+
"stack": providerserver.NewProtocol6WithError(StackProvider()),
18+
},
19+
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
20+
tfversion.SkipBelow(tfversion.Version0_15_0),
21+
},
22+
Steps: []resource.TestStep{
23+
{
24+
Config: `
25+
provider "stack" {
26+
stack_id = cloud_stack.default.id
27+
organization_id = data.cloud_current_organization.default.id
28+
uri = cloud_stack.default.uri
29+
}
30+
31+
data "cloud_current_organization" "default" {}
32+
33+
data "cloud_regions" "default" {
34+
name = "` + RegionName + `"
35+
}
36+
37+
resource "cloud_stack" "default" {
38+
name = "test"
39+
region_id = data.cloud_regions.default.id
40+
version = "v3.2-rc.1"
41+
force_destroy = true
42+
}
43+
44+
resource "stack_payments_connectors" "default" {
45+
config = {
46+
provider = "Moneycorp"
47+
name = "moneycorp-connector"
48+
endpoint = "https://sandbox-corpapi.moneycorp.com"
49+
pollingPeriod = "30s"
50+
}
51+
credentials = {
52+
apiKey = "1234"
53+
clientID = "formanceApi"
54+
}
55+
}
56+
`,
57+
ExpectError: regexp.MustCompile(".*Error: VALIDATION.*"),
58+
},
59+
},
60+
})
61+
62+
}

0 commit comments

Comments
 (0)