diff options
author | 2024-08-06 17:16:35 -0700 | |
---|---|---|
committer | 2024-08-06 17:16:35 -0700 | |
commit | 961f9e0a76c3cfe9ae92ca8da0531790e0610b69 (patch) | |
tree | f6de4ed36c3f48ee94ecd524dedeb0d7c84b72e5 /backend/internal/ibd/auth_test.go | |
parent | 641c81198d7fed7138bb482f226e54bd703094ab (diff) | |
download | ibd-trader-961f9e0a76c3cfe9ae92ca8da0531790e0610b69.tar.gz ibd-trader-961f9e0a76c3cfe9ae92ca8da0531790e0610b69.tar.zst ibd-trader-961f9e0a76c3cfe9ae92ca8da0531790e0610b69.zip |
Modify IBD to accept various transport backends
This allows IBD to try using faster and cheaper transports first with
fallback to more reliable and expensive transports later.
Diffstat (limited to 'backend/internal/ibd/auth_test.go')
-rw-r--r-- | backend/internal/ibd/auth_test.go | 84 |
1 files changed, 34 insertions, 50 deletions
diff --git a/backend/internal/ibd/auth_test.go b/backend/internal/ibd/auth_test.go index d28b33a..8a00d42 100644 --- a/backend/internal/ibd/auth_test.go +++ b/backend/internal/ibd/auth_test.go @@ -9,6 +9,8 @@ import ( "testing" "time" + "github.com/ansg191/ibd-trader-backend/internal/ibd/transport" + "github.com/jarcoal/httpmock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/net/html" @@ -134,44 +136,36 @@ func TestClient_Authenticate(t *testing.T) { expectedVal := "test-cookie" expectedExp := time.Now().Add(time.Hour).Round(time.Second).In(time.UTC) - server := newServer(t, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - uri := r.URL.String() - switch uri { - case signInUrl: - w.Header().Set("Content-Type", "text/html") - _, err := w.Write([]byte(extractAuthHtml)) - require.NoError(t, err) - return - case authenticateUrl: + tp := httpmock.NewMockTransport() + tp.RegisterResponder("GET", signInUrl, + httpmock.NewStringResponder(http.StatusOK, extractAuthHtml)) + tp.RegisterResponder("POST", authenticateUrl, + func(request *http.Request) (*http.Response, error) { var body authRequestBody - require.NoError(t, json.NewDecoder(r.Body).Decode(&body)) + require.NoError(t, json.NewDecoder(request.Body).Decode(&body)) assert.Equal(t, "abc", body.Username) assert.Equal(t, "xyz", body.Password) - w.Header().Set("Content-Type", "text/html") - _, err := w.Write([]byte(extractTokenParamsHtml)) - require.NoError(t, err) - return - case postAuthUrl: - require.NoError(t, r.ParseForm()) - assert.Equal(t, extractTokenExpectedToken, r.Form.Get("token")) + return httpmock.NewStringResponse(http.StatusOK, extractTokenParamsHtml), nil + }) + tp.RegisterResponder("POST", postAuthUrl, + func(request *http.Request) (*http.Response, error) { + require.NoError(t, request.ParseForm()) + assert.Equal(t, extractTokenExpectedToken, request.Form.Get("token")) params, err := url.QueryUnescape(extractTokenExpectedParams) require.NoError(t, err) - assert.Equal(t, params, r.Form.Get("params")) + assert.Equal(t, params, request.Form.Get("params")) - w.Header().Set("Content-Type", "text/html") - http.SetCookie(w, &http.Cookie{Name: cookieName, Value: expectedVal, Expires: expectedExp}) - _, err = w.Write([]byte("OK")) - require.NoError(t, err) - return - default: - t.Fatalf("unexpected URL: %s", uri) - } - })) + resp := httpmock.NewStringResponse(http.StatusOK, "OK") + cookie := &http.Cookie{Name: cookieName, Value: expectedVal, Expires: expectedExp} + resp.Header.Set("Set-Cookie", cookie.String()) + return resp, nil + }) - client, err := NewClient(http.DefaultClient, apiKey, nil, "", WithBaseURL(server.URL)) - require.NoError(t, err) + client := NewClient([]transport.Transport{ + &http.Client{Transport: tp}, + }, nil) cookie, err := client.Authenticate(context.Background(), "abc", "xyz") require.NoError(t, err) @@ -184,32 +178,22 @@ func TestClient_Authenticate(t *testing.T) { func TestClient_Authenticate_401(t *testing.T) { t.Parallel() - server := newServer(t, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - uri := r.URL.String() - switch uri { - case signInUrl: - w.Header().Set("Content-Type", "text/html") - _, err := w.Write([]byte(extractAuthHtml)) - require.NoError(t, err) - return - case authenticateUrl: + tp := httpmock.NewMockTransport() + tp.RegisterResponder("GET", signInUrl, + httpmock.NewStringResponder(http.StatusOK, extractAuthHtml)) + tp.RegisterResponder("POST", authenticateUrl, + func(request *http.Request) (*http.Response, error) { var body authRequestBody - require.NoError(t, json.NewDecoder(r.Body).Decode(&body)) + require.NoError(t, json.NewDecoder(request.Body).Decode(&body)) assert.Equal(t, "abc", body.Username) assert.Equal(t, "xyz", body.Password) - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusUnauthorized) - _, err := w.Write([]byte(`{"name":"ValidationError","code":"ERR016","message":"Wrong username or password","description":"Wrong username or password"}`)) - require.NoError(t, err) - return - default: - t.Fatalf("unexpected URL: %s", uri) - } - })) + return httpmock.NewStringResponse(http.StatusUnauthorized, `{"name":"ValidationError","code":"ERR016","message":"Wrong username or password","description":"Wrong username or password"}`), nil + }) - client, err := NewClient(http.DefaultClient, apiKey, nil, "", WithBaseURL(server.URL)) - require.NoError(t, err) + client := NewClient([]transport.Transport{ + &http.Client{Transport: tp}, + }, nil) cookie, err := client.Authenticate(context.Background(), "abc", "xyz") assert.Nil(t, cookie) |