parent
dc80d0865f
commit
0ff1c6f89a
@ -0,0 +1,174 @@ |
|||||||
|
package http |
||||||
|
|
||||||
|
import ( |
||||||
|
"bytes" |
||||||
|
"context" |
||||||
|
"encoding/json" |
||||||
|
"github.com/go-kratos/kratos/v2/errors" |
||||||
|
"io/ioutil" |
||||||
|
nethttp "net/http" |
||||||
|
"testing" |
||||||
|
"time" |
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert" |
||||||
|
|
||||||
|
"github.com/go-kratos/kratos/v2/registry" |
||||||
|
) |
||||||
|
|
||||||
|
type mockRoundTripper struct { |
||||||
|
} |
||||||
|
|
||||||
|
func (rt *mockRoundTripper) RoundTrip(req *nethttp.Request) (resp *nethttp.Response, err error) { |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
func TestWithTransport(t *testing.T) { |
||||||
|
ov := &mockRoundTripper{} |
||||||
|
o := WithTransport(ov) |
||||||
|
co := &clientOptions{} |
||||||
|
o(co) |
||||||
|
assert.Equal(t, co.transport, ov) |
||||||
|
} |
||||||
|
|
||||||
|
func TestWithTimeout(t *testing.T) { |
||||||
|
ov := 1 * time.Second |
||||||
|
o := WithTimeout(ov) |
||||||
|
co := &clientOptions{} |
||||||
|
o(co) |
||||||
|
assert.Equal(t, co.timeout, ov) |
||||||
|
} |
||||||
|
|
||||||
|
func TestWithBalancer(t *testing.T) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
func TestWithUserAgent(t *testing.T) { |
||||||
|
ov := "kratos" |
||||||
|
o := WithUserAgent(ov) |
||||||
|
co := &clientOptions{} |
||||||
|
o(co) |
||||||
|
assert.Equal(t, co.userAgent, ov) |
||||||
|
} |
||||||
|
|
||||||
|
func TestWithMiddleware(t *testing.T) { |
||||||
|
} |
||||||
|
|
||||||
|
func TestWithEndpoint(t *testing.T) { |
||||||
|
ov := "some-endpoint" |
||||||
|
o := WithEndpoint(ov) |
||||||
|
co := &clientOptions{} |
||||||
|
o(co) |
||||||
|
assert.Equal(t, co.endpoint, ov) |
||||||
|
} |
||||||
|
|
||||||
|
func TestWithRequestEncoder(t *testing.T) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
func TestWithResponseDecoder(t *testing.T) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
func TestWithErrorDecoder(t *testing.T) { |
||||||
|
} |
||||||
|
|
||||||
|
type mockDiscovery struct { |
||||||
|
} |
||||||
|
|
||||||
|
func (*mockDiscovery) GetService(ctx context.Context, serviceName string) ([]*registry.ServiceInstance, error) { |
||||||
|
return nil, nil |
||||||
|
} |
||||||
|
|
||||||
|
func (*mockDiscovery) Watch(ctx context.Context, serviceName string) (registry.Watcher, error) { |
||||||
|
return nil, nil |
||||||
|
} |
||||||
|
|
||||||
|
func TestWithDiscovery(t *testing.T) { |
||||||
|
ov := &mockDiscovery{} |
||||||
|
o := WithDiscovery(ov) |
||||||
|
co := &clientOptions{} |
||||||
|
o(co) |
||||||
|
assert.Equal(t, co.discovery, ov) |
||||||
|
} |
||||||
|
|
||||||
|
func TestDefaultRequestEncoder(t *testing.T) { |
||||||
|
req1 := &nethttp.Request{ |
||||||
|
Header: make(nethttp.Header), |
||||||
|
Body: ioutil.NopCloser(bytes.NewBufferString("{\"a\":\"1\", \"b\": 2}")), |
||||||
|
} |
||||||
|
req1.Header.Set("Content-Type", "application/xml") |
||||||
|
|
||||||
|
v1 := &struct { |
||||||
|
A string `json:"a"` |
||||||
|
B int64 `json:"b"` |
||||||
|
}{"a", 1} |
||||||
|
b, err1 := DefaultRequestEncoder(context.TODO(), "application/json", v1) |
||||||
|
assert.Nil(t, err1) |
||||||
|
v1b := &struct { |
||||||
|
A string `json:"a"` |
||||||
|
B int64 `json:"b"` |
||||||
|
}{} |
||||||
|
err1 = json.Unmarshal(b, v1b) |
||||||
|
assert.Nil(t, err1) |
||||||
|
assert.Equal(t, v1, v1b) |
||||||
|
} |
||||||
|
|
||||||
|
func TestDefaultResponseDecoder(t *testing.T) { |
||||||
|
resp1 := &nethttp.Response{ |
||||||
|
Header: make(nethttp.Header), |
||||||
|
StatusCode: 200, |
||||||
|
Body: ioutil.NopCloser(bytes.NewBufferString("{\"a\":\"1\", \"b\": 2}")), |
||||||
|
} |
||||||
|
v1 := &struct { |
||||||
|
A string `json:"a"` |
||||||
|
B int64 `json:"b"` |
||||||
|
}{} |
||||||
|
err1 := DefaultResponseDecoder(context.TODO(), resp1, &v1) |
||||||
|
assert.Nil(t, err1) |
||||||
|
assert.Equal(t, "1", v1.A) |
||||||
|
assert.Equal(t, int64(2), v1.B) |
||||||
|
|
||||||
|
resp2 := &nethttp.Response{ |
||||||
|
Header: make(nethttp.Header), |
||||||
|
StatusCode: 200, |
||||||
|
Body: ioutil.NopCloser(bytes.NewBufferString("{badjson}")), |
||||||
|
} |
||||||
|
v2 := &struct { |
||||||
|
A string `json:"a"` |
||||||
|
B int64 `json:"b"` |
||||||
|
}{} |
||||||
|
err2 := DefaultResponseDecoder(context.TODO(), resp2, &v2) |
||||||
|
terr1 := &json.SyntaxError{} |
||||||
|
assert.ErrorAs(t, err2, &terr1) |
||||||
|
} |
||||||
|
|
||||||
|
func TestDefaultErrorDecoder(t *testing.T) { |
||||||
|
for i := 200; i < 300; i++ { |
||||||
|
resp := &nethttp.Response{Header: make(nethttp.Header), StatusCode: i} |
||||||
|
assert.Nil(t, DefaultErrorDecoder(context.TODO(), resp)) |
||||||
|
} |
||||||
|
resp1 := &nethttp.Response{ |
||||||
|
Header: make(nethttp.Header), |
||||||
|
StatusCode: 300, |
||||||
|
Body: ioutil.NopCloser(bytes.NewBufferString("{\"foo\":\"bar\"}")), |
||||||
|
} |
||||||
|
assert.Error(t, DefaultErrorDecoder(context.TODO(), resp1)) |
||||||
|
|
||||||
|
resp2 := &nethttp.Response{ |
||||||
|
Header: make(nethttp.Header), |
||||||
|
StatusCode: 500, |
||||||
|
Body: ioutil.NopCloser(bytes.NewBufferString("{\"code\":54321, \"message\": \"hi\", \"reason\": \"FOO\"}")), |
||||||
|
} |
||||||
|
err2 := DefaultErrorDecoder(context.TODO(), resp2) |
||||||
|
assert.Error(t, err2) |
||||||
|
assert.Equal(t, int32(54321), err2.(*errors.Error).GetCode()) |
||||||
|
assert.Equal(t, "hi", err2.(*errors.Error).GetMessage()) |
||||||
|
assert.Equal(t, "FOO", err2.(*errors.Error).GetReason()) |
||||||
|
} |
||||||
|
|
||||||
|
func TestCodecForResponse(t *testing.T) { |
||||||
|
resp := &nethttp.Response{Header: make(nethttp.Header)} |
||||||
|
resp.Header.Set("Content-Type", "application/xml") |
||||||
|
c := CodecForResponse(resp) |
||||||
|
assert.Equal(t, "xml", c.Name()) |
||||||
|
} |
@ -0,0 +1,108 @@ |
|||||||
|
package http |
||||||
|
|
||||||
|
import ( |
||||||
|
"bytes" |
||||||
|
"github.com/go-kratos/kratos/v2/errors" |
||||||
|
"github.com/stretchr/testify/assert" |
||||||
|
"io/ioutil" |
||||||
|
nethttp "net/http" |
||||||
|
"testing" |
||||||
|
) |
||||||
|
|
||||||
|
func TestDefaultRequestDecoder(t *testing.T) { |
||||||
|
req1 := &nethttp.Request{ |
||||||
|
Header: make(nethttp.Header), |
||||||
|
Body: ioutil.NopCloser(bytes.NewBufferString("{\"a\":\"1\", \"b\": 2}")), |
||||||
|
} |
||||||
|
req1.Header.Set("Content-Type", "application/json") |
||||||
|
|
||||||
|
v1 := &struct { |
||||||
|
A string `json:"a"` |
||||||
|
B int64 `json:"b"` |
||||||
|
}{} |
||||||
|
err1 := DefaultRequestDecoder(req1, &v1) |
||||||
|
assert.Nil(t, err1) |
||||||
|
assert.Equal(t, "1", v1.A) |
||||||
|
assert.Equal(t, int64(2), v1.B) |
||||||
|
} |
||||||
|
|
||||||
|
type mockResponseWriter struct { |
||||||
|
StatusCode int |
||||||
|
Data []byte |
||||||
|
header nethttp.Header |
||||||
|
} |
||||||
|
|
||||||
|
func (w *mockResponseWriter) Header() nethttp.Header { |
||||||
|
return w.header |
||||||
|
} |
||||||
|
|
||||||
|
func (w *mockResponseWriter) Write(b []byte) (int, error) { |
||||||
|
w.Data = b |
||||||
|
return len(b), nil |
||||||
|
} |
||||||
|
|
||||||
|
func (w *mockResponseWriter) WriteHeader(statusCode int) { |
||||||
|
w.StatusCode = statusCode |
||||||
|
} |
||||||
|
|
||||||
|
type dataWithStatusCode struct { |
||||||
|
statusCode int |
||||||
|
A string `json:"a"` |
||||||
|
B int64 `json:"b"` |
||||||
|
} |
||||||
|
|
||||||
|
func (d *dataWithStatusCode) StatusCode() int { |
||||||
|
return d.statusCode |
||||||
|
} |
||||||
|
|
||||||
|
func TestDefaultResponseEncoder(t *testing.T) { |
||||||
|
w := &mockResponseWriter{header: make(nethttp.Header)} |
||||||
|
req1 := &nethttp.Request{ |
||||||
|
Header: make(nethttp.Header), |
||||||
|
} |
||||||
|
req1.Header.Set("Content-Type", "application/json") |
||||||
|
|
||||||
|
v1 := &dataWithStatusCode{statusCode: 201, A: "1", B: 2} |
||||||
|
err := DefaultResponseEncoder(w, req1, v1) |
||||||
|
assert.Nil(t, err) |
||||||
|
assert.Equal(t, "application/json", w.Header().Get("Content-Type")) |
||||||
|
assert.Equal(t, 201, w.StatusCode) |
||||||
|
assert.NotNil(t, w.Data) |
||||||
|
} |
||||||
|
|
||||||
|
func TestDefaultResponseEncoderWithError(t *testing.T) { |
||||||
|
w := &mockResponseWriter{header: make(nethttp.Header)} |
||||||
|
req1 := &nethttp.Request{ |
||||||
|
Header: make(nethttp.Header), |
||||||
|
} |
||||||
|
req1.Header.Set("Content-Type", "application/json") |
||||||
|
|
||||||
|
v1 := &errors.Error{Code: 511} |
||||||
|
err := DefaultResponseEncoder(w, req1, v1) |
||||||
|
assert.Nil(t, err) |
||||||
|
assert.Equal(t, "application/json", w.Header().Get("Content-Type")) |
||||||
|
assert.Equal(t, 511, w.StatusCode) |
||||||
|
assert.NotNil(t, w.Data) |
||||||
|
} |
||||||
|
|
||||||
|
func TestCodecForRequest(t *testing.T) { |
||||||
|
req1 := &nethttp.Request{ |
||||||
|
Header: make(nethttp.Header), |
||||||
|
Body: ioutil.NopCloser(bytes.NewBufferString("<xml></xml>")), |
||||||
|
} |
||||||
|
req1.Header.Set("Content-Type", "application/xml") |
||||||
|
|
||||||
|
c, ok := CodecForRequest(req1, "Content-Type") |
||||||
|
assert.True(t, ok) |
||||||
|
assert.Equal(t, "xml", c.Name()) |
||||||
|
|
||||||
|
req2 := &nethttp.Request{ |
||||||
|
Header: make(nethttp.Header), |
||||||
|
Body: ioutil.NopCloser(bytes.NewBufferString("{\"a\":\"1\", \"b\": 2}")), |
||||||
|
} |
||||||
|
req2.Header.Set("Content-Type", "blablablabla") |
||||||
|
|
||||||
|
c, ok = CodecForRequest(req2, "Content-Type") |
||||||
|
assert.False(t, ok) |
||||||
|
assert.Equal(t, "json", c.Name()) |
||||||
|
} |
Loading…
Reference in new issue