github.com/stripe/stripe-go/v76@v76.25.0/error_test.go (about) 1 package stripe 2 3 import ( 4 "errors" 5 "fmt" 6 "net/http" 7 "net/http/httptest" 8 "testing" 9 10 assert "github.com/stretchr/testify/require" 11 ) 12 13 func TestErrorError(t *testing.T) { 14 err := &Error{Type: "foo", Msg: "bar"} 15 assert.Equal(t, `{"message":"bar","type":"foo"}`, err.Error()) 16 } 17 18 func TestErrorResponse(t *testing.T) { 19 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 20 w.Header().Add("Request-Id", "req_123") 21 w.WriteHeader(http.StatusUnauthorized) 22 fmt.Fprintln(w, `{"error":{"message":"bar","type":"`+ErrorTypeInvalidRequest+`"}}`) 23 })) 24 defer ts.Close() 25 26 backend := GetBackendWithConfig(APIBackend, &BackendConfig{ 27 // Suppress error log output to make a verbose run of this test less 28 // alarming (because we're testing specifically for an error). 29 LeveledLogger: &LeveledLogger{Level: LevelNull}, 30 31 URL: String(ts.URL), 32 }) 33 34 err := backend.Call(http.MethodGet, "/v1/account", "sk_test_badKey", nil, nil) 35 assert.Error(t, err) 36 37 stripeErr := err.(*Error) 38 assert.Equal(t, ErrorTypeInvalidRequest, stripeErr.Type) 39 assert.Equal(t, "req_123", stripeErr.RequestID) 40 assert.Equal(t, 401, stripeErr.HTTPStatusCode) 41 var invalidRequestErr *InvalidRequestError 42 assert.True(t, errors.As(err, &invalidRequestErr)) 43 } 44 45 func TestErrorRedact(t *testing.T) { 46 pi := &PaymentIntent{Amount: int64(400), ClientSecret: "foo"} 47 si := &SetupIntent{Description: "keepme", ClientSecret: "foo"} 48 49 t.Run("BothIntentObjects", func(t *testing.T) { 50 err := &Error{PaymentIntent: pi, SetupIntent: si} 51 redacted := err.redact() 52 assert.Equal(t, int64(400), err.PaymentIntent.Amount) 53 assert.Equal(t, int64(400), redacted.PaymentIntent.Amount) 54 assert.Equal(t, "keepme", err.SetupIntent.Description) 55 assert.Equal(t, "keepme", redacted.SetupIntent.Description) 56 assert.Equal(t, "foo", err.PaymentIntent.ClientSecret) 57 assert.Equal(t, "foo", err.SetupIntent.ClientSecret) 58 assert.Equal(t, "foo", pi.ClientSecret) 59 assert.Equal(t, "foo", si.ClientSecret) 60 assert.Equal(t, "REDACTED", redacted.PaymentIntent.ClientSecret) 61 assert.Equal(t, "REDACTED", redacted.SetupIntent.ClientSecret) 62 }) 63 64 t.Run("NeitherIntentObject", func(t *testing.T) { 65 err := Error{PaymentIntent: nil, SetupIntent: nil} 66 redacted := err.redact() 67 assert.Nil(t, err.PaymentIntent) 68 assert.Nil(t, redacted.PaymentIntent) 69 }) 70 71 t.Run("PaymentIntentAlone", func(t *testing.T) { 72 err := &Error{PaymentIntent: pi} 73 redacted := err.redact() 74 assert.Equal(t, int64(400), err.PaymentIntent.Amount) 75 assert.Equal(t, int64(400), redacted.PaymentIntent.Amount) 76 assert.Equal(t, "foo", err.PaymentIntent.ClientSecret) 77 assert.Equal(t, "foo", pi.ClientSecret) 78 assert.Equal(t, "REDACTED", redacted.PaymentIntent.ClientSecret) 79 }) 80 81 t.Run("SetupIntentAlone", func(t *testing.T) { 82 err := &Error{SetupIntent: si} 83 redacted := err.redact() 84 assert.Equal(t, "keepme", err.SetupIntent.Description) 85 assert.Equal(t, "keepme", redacted.SetupIntent.Description) 86 assert.Equal(t, "foo", err.SetupIntent.ClientSecret) 87 assert.Equal(t, "foo", si.ClientSecret) 88 assert.Equal(t, "REDACTED", redacted.SetupIntent.ClientSecret) 89 }) 90 }