You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
3.1 KiB

package jsonrpc
import (
"bytes"
"net/http"
"net/http/httptest"
"testing"
"github.com/intel-go/fastjson"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestParseRequest(t *testing.T) {
r, _ := http.NewRequest("", "", bytes.NewReader(nil))
_, _, err := ParseRequest(r)
require.IsType(t, &Error{}, err)
assert.Equal(t, ErrorCodeInvalidRequest, err.Code)
r.Header.Set("Content-Type", "application/json")
_, _, err = ParseRequest(r)
require.IsType(t, &Error{}, err)
assert.Equal(t, ErrorCodeInvalidRequest, err.Code)
r, _ = http.NewRequest("", "", bytes.NewReader([]byte("")))
r.Header.Set("Content-Type", "application/json")
_, _, err = ParseRequest(r)
require.IsType(t, &Error{}, err)
assert.Equal(t, ErrorCodeInvalidRequest, err.Code)
r, _ = http.NewRequest("", "", bytes.NewReader([]byte("test")))
r.Header.Set("Content-Type", "application/json")
_, _, err = ParseRequest(r)
require.IsType(t, &Error{}, err)
assert.Equal(t, ErrorCodeParse, err.Code)
r, _ = http.NewRequest("", "", bytes.NewReader([]byte("{}")))
r.Header.Set("Content-Type", "application/json")
rs, batch, err := ParseRequest(r)
require.Nil(t, err)
require.NotEmpty(t, rs)
assert.False(t, batch)
r, _ = http.NewRequest("", "", bytes.NewReader([]byte("[")))
r.Header.Set("Content-Type", "application/json")
_, _, err = ParseRequest(r)
require.IsType(t, &Error{}, err)
assert.Equal(t, ErrorCodeParse, err.Code)
r, _ = http.NewRequest("", "", bytes.NewReader([]byte("[test]")))
r.Header.Set("Content-Type", "application/json")
_, _, err = ParseRequest(r)
require.IsType(t, &Error{}, err)
assert.Equal(t, ErrorCodeParse, err.Code)
r, _ = http.NewRequest("", "", bytes.NewReader([]byte("[{}]")))
r.Header.Set("Content-Type", "application/json")
rs, batch, err = ParseRequest(r)
require.Nil(t, err)
require.NotEmpty(t, rs)
assert.True(t, batch)
}
func TestNewResponse(t *testing.T) {
id := fastjson.RawMessage("test")
r := NewResponse(&Request{
Version: "2.0",
ID: &id,
})
assert.Equal(t, "2.0", r.Version)
assert.Equal(t, "test", string(*r.ID))
}
func TestSendResponse(t *testing.T) {
rec := httptest.NewRecorder()
err := SendResponse(rec, []*Response{}, false)
require.NoError(t, err)
assert.Empty(t, rec.Body.String())
id := fastjson.RawMessage([]byte(`"test"`))
r := &Response{
ID: &id,
Version: "2.0",
Result: struct {
Name string `json:"name"`
}{
Name: "john",
},
}
rec = httptest.NewRecorder()
err = SendResponse(rec, []*Response{r}, false)
require.NoError(t, err)
assert.Equal(t, `{"id":"test","jsonrpc":"2.0","result":{"name":"john"}}
`, rec.Body.String())
rec = httptest.NewRecorder()
err = SendResponse(rec, []*Response{r}, true)
require.NoError(t, err)
assert.Equal(t, `[{"id":"test","jsonrpc":"2.0","result":{"name":"john"}}]
`, rec.Body.String())
rec = httptest.NewRecorder()
err = SendResponse(rec, []*Response{r, r}, false)
require.NoError(t, err)
assert.Equal(t, `[{"id":"test","jsonrpc":"2.0","result":{"name":"john"}},{"id":"test","jsonrpc":"2.0","result":{"name":"john"}}]
`, rec.Body.String())
}