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 }