From dfbab0a0610660794e44093c49d8dd57389f485f Mon Sep 17 00:00:00 2001 From: begmaroman Date: Thu, 4 Jan 2024 09:02:29 +0000 Subject: [PATCH] Small refactoring and added UTs ro RPC --- rpc/client.go | 22 +--------------- rpc/client_test.go | 66 ++++++++++++++++++++++++++++++++++++++++++++++ rpc/dbtxmanager.go | 1 + 3 files changed, 68 insertions(+), 21 deletions(-) create mode 100644 rpc/client_test.go diff --git a/rpc/client.go b/rpc/client.go index f84386fb..cc7a6478 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -17,31 +17,11 @@ func JSONRPCCall(url, method string, params ...interface{}) (Response, error) { // the provided method and parameters, which is compatible with the Ethereum // JSON RPC Server. func JSONRPCCallWithContext(ctx context.Context, url, method string, parameters ...interface{}) (Response, error) { - params, err := json.Marshal(parameters) + httpReq, err := BuildJsonHTTPRequest(ctx, url, method, parameters...) if err != nil { return Response{}, err } - req := Request{ - JSONRPC: "2.0", - ID: float64(1), - Method: method, - Params: params, - } - - reqBody, err := json.Marshal(req) - if err != nil { - return Response{}, err - } - - reqBodyReader := bytes.NewReader(reqBody) - httpReq, err := http.NewRequestWithContext(ctx, http.MethodPost, url, reqBodyReader) - if err != nil { - return Response{}, err - } - - httpReq.Header.Add("Content-type", "application/json") - httpRes, err := http.DefaultClient.Do(httpReq) if err != nil { return Response{}, err diff --git a/rpc/client_test.go b/rpc/client_test.go new file mode 100644 index 00000000..fc84f00e --- /dev/null +++ b/rpc/client_test.go @@ -0,0 +1,66 @@ +package rpc + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/require" +) + +func Test_JSONRPCCallWithContext(t *testing.T) { + tests := []struct { + name string + result string + resp Response + statusCode int + err error + }{ + { + name: "successfully executed request", + result: `{"result":"test"}`, + resp: Response{ + Result: json.RawMessage(`"test"`), + }, + }, + { + name: "unsuccessful status code returned by server", + statusCode: http.StatusUnauthorized, + err: errors.New("invalid status code, expected: 200, found: 401"), + }, + } + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var res Request + require.NoError(t, json.NewDecoder(r.Body).Decode(&res)) + require.Equal(t, "test", res.Method) + + if tt.statusCode > 0 { + w.WriteHeader(tt.statusCode) + } + + _, err := fmt.Fprint(w, tt.result) + require.NoError(t, err) + })) + defer svr.Close() + + got, err := JSONRPCCallWithContext(context.Background(), svr.URL, "test") + if tt.err != nil { + require.Error(t, err) + require.EqualError(t, tt.err, err.Error()) + } else { + require.NoError(t, err) + require.Equal(t, tt.resp, got) + } + }) + } +} diff --git a/rpc/dbtxmanager.go b/rpc/dbtxmanager.go index ef8ccc75..3475aeac 100644 --- a/rpc/dbtxmanager.go +++ b/rpc/dbtxmanager.go @@ -15,6 +15,7 @@ type DBTxScopedFn func(ctx context.Context, dbTx db.Tx) (interface{}, Error) // NewDbTxScope function to initiate DB scopped txs func (f *DBTxManager) NewDbTxScope(db db.DB, scopedFn DBTxScopedFn) (interface{}, Error) { ctx := context.Background() + dbTx, err := db.BeginStateTransaction(ctx) if err != nil { return RPCErrorResponse(DefaultErrorCode, "failed to connect to the state", err)