github.com/status-im/status-go@v1.1.0/rpc/call_raw_test.go (about)

     1  package rpc
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func TestNewSuccessResponse(t *testing.T) {
    12  	cases := []struct {
    13  		name     string
    14  		result   json.RawMessage
    15  		id       json.RawMessage
    16  		expected string
    17  	}{
    18  		{"string", json.RawMessage(`"3434=done"`), nil, `{"jsonrpc":"2.0","id":0,"result":"3434=done"}`},
    19  		{"struct_nil_id", json.RawMessage(`{"field": "value"}`), nil, `{"jsonrpc":"2.0","id":0,"result":{"field":"value"}}`},
    20  		{"struct_non_nil_id", json.RawMessage(`{"field": "value"}`), json.RawMessage(`42`), `{"jsonrpc":"2.0","id":42,"result":{"field":"value"}}`},
    21  		{"null", json.RawMessage(`null`), json.RawMessage(`7`), `{"jsonrpc":"2.0","id":7,"result":null}`},
    22  		{"null_nil", nil, json.RawMessage(`7`), `{"jsonrpc":"2.0","id":7,"result":null}`},
    23  	}
    24  
    25  	for _, test := range cases {
    26  		t.Run(test.name, func(t *testing.T) {
    27  			got := newSuccessResponse(test.result, test.id)
    28  			require.Equal(t, test.expected, got)
    29  		})
    30  	}
    31  }
    32  
    33  func TestNewErrorResponse(t *testing.T) {
    34  	got := newErrorResponse(-32601, errors.New("Method not found"), json.RawMessage(`42`))
    35  
    36  	expected := `{"jsonrpc":"2.0","id":42,"error":{"code":-32601,"message":"Method not found"}}`
    37  	require.Equal(t, expected, got)
    38  }
    39  
    40  func TestUnmarshalMessage(t *testing.T) {
    41  	body := json.RawMessage(`{"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}}`)
    42  	got, err := unmarshalMessage(body)
    43  	require.NoError(t, err)
    44  
    45  	expected := &jsonrpcRequest{
    46  		jsonrpcMessage: jsonrpcMessage{Version: "2.0"},
    47  		Method:         "subtract",
    48  		Params:         json.RawMessage(`{"subtrahend": 23, "minuend": 42}`),
    49  	}
    50  	require.Equal(t, expected, got)
    51  }
    52  
    53  func TestMethodAndParamsFromBody(t *testing.T) {
    54  	cases := []struct {
    55  		name       string
    56  		body       json.RawMessage
    57  		params     []interface{}
    58  		method     string
    59  		id         json.RawMessage
    60  		chainID    uint64
    61  		shouldFail bool
    62  	}{
    63  		{
    64  			"params_array",
    65  			json.RawMessage(`{"jsonrpc": "2.0", "id": 42, "method": "subtract", "params": [{"subtrahend": 23, "minuend": 42}]}`),
    66  			[]interface{}{
    67  				map[string]interface{}{
    68  					"subtrahend": float64(23),
    69  					"minuend":    float64(42),
    70  				},
    71  			},
    72  			"subtract",
    73  			json.RawMessage(`42`),
    74  			0,
    75  			false,
    76  		},
    77  		{
    78  			"params_empty_array",
    79  			json.RawMessage(`{"jsonrpc": "2.0", "method": "test", "params": []}`),
    80  			[]interface{}{},
    81  			"test",
    82  			nil,
    83  			0,
    84  			false,
    85  		},
    86  		{
    87  			"params_none",
    88  			json.RawMessage(`{"jsonrpc": "2.0", "method": "test"}`),
    89  			[]interface{}{},
    90  			"test",
    91  			nil,
    92  			0,
    93  			false,
    94  		},
    95  		{
    96  			"params_chain_id",
    97  			json.RawMessage(`{"jsonrpc": "2.0", "chainId": 2, "method": "test"}`),
    98  			[]interface{}{},
    99  			"test",
   100  			nil,
   101  			2,
   102  			false,
   103  		},
   104  		{
   105  			"getFilterMessage",
   106  			json.RawMessage(`{"jsonrpc":"2.0","id":44,"method":"shh_getFilterMessages","params":["3de6a8867aeb75be74d68478b853b4b0e063704d30f8231c45d0fcbd97af207e"]}`),
   107  			[]interface{}{string("3de6a8867aeb75be74d68478b853b4b0e063704d30f8231c45d0fcbd97af207e")},
   108  			"shh_getFilterMessages",
   109  			json.RawMessage(`44`),
   110  			0,
   111  			false,
   112  		},
   113  		{
   114  			"getFilterMessage_array",
   115  			json.RawMessage(`[{"jsonrpc":"2.0","id":44,"method":"shh_getFilterMessages","params":["3de6a8867aeb75be74d68478b853b4b0e063704d30f8231c45d0fcbd97af207e"]}]`),
   116  			[]interface{}{},
   117  			"",
   118  			nil,
   119  			0,
   120  			true,
   121  		},
   122  		{
   123  			"empty_array",
   124  			json.RawMessage(`[]`),
   125  			[]interface{}{},
   126  			"",
   127  			nil,
   128  			0,
   129  			true,
   130  		},
   131  	}
   132  
   133  	for _, test := range cases {
   134  		t.Run(test.name, func(t *testing.T) {
   135  			chainID, method, params, id, err := methodAndParamsFromBody(test.body)
   136  			if test.shouldFail {
   137  				require.Error(t, err)
   138  				return
   139  			}
   140  			require.NoError(t, err)
   141  			require.Equal(t, test.chainID, chainID)
   142  			require.Equal(t, test.method, method)
   143  			require.Equal(t, test.params, params)
   144  			require.EqualValues(t, test.id, id)
   145  		})
   146  	}
   147  }
   148  
   149  func TestIsBatch(t *testing.T) {
   150  	cases := []struct {
   151  		name     string
   152  		body     json.RawMessage
   153  		expected bool
   154  	}{
   155  		{"single", json.RawMessage(`{"jsonrpc":"2.0","id":44,"method":"shh_getFilterMessages","params":["3de6a8867aeb75be74d68478b853b4b0e063704d30f8231c45d0fcbd97af207e"]}`), false},
   156  		{"array", json.RawMessage(`[{"jsonrpc":"2.0","id":44,"method":"shh_getFilterMessages","params":["3de6a8867aeb75be74d68478b853b4b0e063704d30f8231c45d0fcbd97af207e"]}]`), true},
   157  	}
   158  
   159  	for _, test := range cases {
   160  		t.Run(test.name, func(t *testing.T) {
   161  			got := isBatch(test.body)
   162  			require.Equal(t, test.expected, got)
   163  		})
   164  	}
   165  }