@@ -2,12 +2,15 @@ package proxy
22
33import (
44 "context"
5+ "net/http"
6+ "net/http/httptest"
57 "net/url"
68 "testing"
79
810 "github.com/stretchr/testify/require"
911
1012 "github.com/stripe/stripe-cli/pkg/requests"
13+ "github.com/stripe/stripe-cli/pkg/stripe"
1114 "github.com/stripe/stripe-cli/pkg/websocket"
1215)
1316
@@ -210,3 +213,78 @@ func TestExtractRequestData(t *testing.T) {
210213 require .Error (t , err )
211214 })
212215}
216+
217+ func TestRun_RetryOnAuthorizationServerError (t * testing.T ) {
218+ nAttempts := 0
219+ ts := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
220+ nAttempts ++
221+ require .Equal (t , http .MethodPost , r .Method )
222+ require .Equal (t , "/v1/stripecli/sessions" , r .URL .Path )
223+ w .WriteHeader (http .StatusInternalServerError )
224+ w .Write ([]byte (`{"error":"internal_server_error"}` ))
225+ }))
226+ defer ts .Close ()
227+
228+ baseURL , _ := url .Parse (ts .URL )
229+
230+ cfg := Config {
231+ Client : & stripe.Client {APIKey : "sk_test_123" , BaseURL : baseURL },
232+ OutCh : make (chan websocket.IElement , 2 ),
233+ }
234+ p , err := Init (context .Background (), & cfg )
235+ require .NoError (t , err )
236+
237+ err = p .Run (context .Background ())
238+ require .Error (t , err )
239+ require .Equal (t , 6 , nAttempts )
240+ }
241+
242+ func TestRun_NoRetryOnAuthorizationClientError (t * testing.T ) {
243+ nAttempts := 0
244+ ts := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
245+ nAttempts ++
246+ require .Equal (t , http .MethodPost , r .Method )
247+ require .Equal (t , "/v1/stripecli/sessions" , r .URL .Path )
248+ w .WriteHeader (http .StatusBadRequest )
249+ w .Write ([]byte (`{"error":"bad_request"}` ))
250+ }))
251+ defer ts .Close ()
252+
253+ baseURL , _ := url .Parse (ts .URL )
254+
255+ cfg := Config {
256+ Client : & stripe.Client {APIKey : "sk_test_123" , BaseURL : baseURL },
257+ OutCh : make (chan websocket.IElement , 2 ),
258+ }
259+ p , err := Init (context .Background (), & cfg )
260+ require .NoError (t , err )
261+
262+ err = p .Run (context .Background ())
263+ require .Error (t , err )
264+ require .Equal (t , 1 , nAttempts )
265+ }
266+
267+ func TestRun_NoRetryOnAuthorizationClientError_TooManyRequests (t * testing.T ) {
268+ nAttempts := 0
269+ ts := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
270+ nAttempts ++
271+ require .Equal (t , http .MethodPost , r .Method )
272+ require .Equal (t , "/v1/stripecli/sessions" , r .URL .Path )
273+ w .WriteHeader (http .StatusTooManyRequests )
274+ w .Write ([]byte (`{"error":"too_many_requests"}` ))
275+ }))
276+ defer ts .Close ()
277+
278+ baseURL , _ := url .Parse (ts .URL )
279+
280+ cfg := Config {
281+ Client : & stripe.Client {APIKey : "sk_test_123" , BaseURL : baseURL },
282+ OutCh : make (chan websocket.IElement , 2 ),
283+ }
284+ p , err := Init (context .Background (), & cfg )
285+ require .NoError (t , err )
286+
287+ err = p .Run (context .Background ())
288+ require .ErrorContains (t , err , "You have too many `stripe listen` sessions open. Please close some and try again." )
289+ require .Equal (t , 1 , nAttempts )
290+ }
0 commit comments