|
|
package jsonrpc
import ( "bytes" "context" "net/http" "net/http/httptest" "testing"
"github.com/intel-go/fastjson" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" )
type handler struct { F func(c context.Context, params *fastjson.RawMessage) (interface{}, *Error) }
func (h *handler) ServeJSONRPC(c context.Context, params *fastjson.RawMessage) (interface{}, *Error) { return h.F(c, params) }
func TestHandler(t *testing.T) {
mr := NewMethodRepository()
rec := httptest.NewRecorder() r, err := http.NewRequest("", "", nil) require.NoError(t, err)
mr.ServeHTTP(rec, r)
res := Response{} err = fastjson.NewDecoder(rec.Body).Decode(&res) require.NoError(t, err) assert.NotNil(t, res.Error)
rec = httptest.NewRecorder() r, err = http.NewRequest("", "", bytes.NewReader([]byte(`{"jsonrpc":"2.0","id":"test","method":"hello","params":{}}`))) require.NoError(t, err) r.Header.Set("Content-Type", "application/json")
mr.ServeHTTP(rec, r) res = Response{} err = fastjson.NewDecoder(rec.Body).Decode(&res) require.NoError(t, err) assert.NotNil(t, res.Error)
h1 := &handler{} h1.F = func(c context.Context, params *fastjson.RawMessage) (interface{}, *Error) { return "hello", nil } require.NoError(t, mr.RegisterMethod("hello", h1, nil, nil)) h2 := &handler{} h2.F = func(c context.Context, params *fastjson.RawMessage) (interface{}, *Error) { return nil, ErrInternal() } require.NoError(t, mr.RegisterMethod("bye", h2, nil, nil))
rec = httptest.NewRecorder() r, err = http.NewRequest("", "", bytes.NewReader([]byte(`{"jsonrpc":"2.0","id":"test","method":"hello","params":{}}`))) require.NoError(t, err) r.Header.Set("Content-Type", "application/json")
mr.ServeHTTP(rec, r) res = Response{} err = fastjson.NewDecoder(rec.Body).Decode(&res) require.NoError(t, err) assert.Nil(t, res.Error) assert.Equal(t, "hello", res.Result)
rec = httptest.NewRecorder() r, err = http.NewRequest("", "", bytes.NewReader([]byte(`{"jsonrpc":"2.0","id":"test","method":"bye","params":{}}`))) require.NoError(t, err) r.Header.Set("Content-Type", "application/json")
mr.ServeHTTP(rec, r) res = Response{} err = fastjson.NewDecoder(rec.Body).Decode(&res) require.NoError(t, err) assert.NotNil(t, res.Error) }
|