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  }