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.
kratos/transport/http/context_test.go

169 lines
3.8 KiB

package http
import (
"bytes"
"context"
"net/http"
"net/http/httptest"
"net/url"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func TestContextHeader(t *testing.T) {
w := wrapper{
router: nil,
req: &http.Request{Header: map[string][]string{"name": {"kratos"}}},
res: nil,
w: responseWriter{},
}
h := w.Header()
assert.Equal(t, h, http.Header{"name": {"kratos"}})
}
func TestContextForm(t *testing.T) {
w := wrapper{
router: nil,
req: &http.Request{Header: map[string][]string{"name": {"kratos"}}, Method: "POST"},
res: nil,
w: responseWriter{},
}
form := w.Form()
assert.Equal(t, form, url.Values{})
w = wrapper{
router: nil,
req: &http.Request{Form: map[string][]string{"name": {"kratos"}}},
res: nil,
w: responseWriter{},
}
form = w.Form()
assert.Equal(t, form, url.Values{"name": []string{"kratos"}})
}
func TestContextQuery(t *testing.T) {
w := wrapper{
router: nil,
req: &http.Request{URL: &url.URL{Scheme: "https", Host: "github.com", Path: "go-kratos/kratos", RawQuery: "page=1"}, Method: "POST"},
res: nil,
w: responseWriter{},
}
q := w.Query()
assert.Equal(t, q, url.Values{"page": []string{"1"}})
}
func TestContextRequest(t *testing.T) {
req := &http.Request{Method: "POST"}
w := wrapper{
router: nil,
req: req,
res: nil,
w: responseWriter{},
}
res := w.Request()
assert.Equal(t, res, req)
}
func TestContextResponse(t *testing.T) {
res := httptest.NewRecorder()
w := wrapper{
router: &Router{srv: &Server{enc: DefaultResponseEncoder}},
req: &http.Request{Method: "POST"},
res: res,
w: responseWriter{200, res},
}
assert.Equal(t, w.Response(), res)
err := w.Returns(map[string]string{}, nil)
assert.Nil(t, err)
}
func TestContextBindQuery(t *testing.T) {
w := wrapper{
router: nil,
req: &http.Request{URL: &url.URL{Scheme: "https", Host: "go-kratos-dev", RawQuery: "page=2"}},
res: nil,
w: responseWriter{},
}
type BindQuery struct {
Page int `json:"page"`
}
b := BindQuery{}
err := w.BindQuery(&b)
assert.Nil(t, err)
assert.Equal(t, b, BindQuery{Page: 2})
}
func TestContextBindForm(t *testing.T) {
w := wrapper{
router: nil,
req: &http.Request{URL: &url.URL{Scheme: "https", Host: "go-kratos-dev"}, Form: map[string][]string{"page": {"2"}}},
res: nil,
w: responseWriter{},
}
type BindForm struct {
Page int `json:"page"`
}
b := BindForm{}
err := w.BindForm(&b)
assert.Nil(t, err)
assert.Equal(t, b, BindForm{Page: 2})
}
func TestContextResponseReturn(t *testing.T) {
writer := httptest.NewRecorder()
w := wrapper{
router: nil,
req: nil,
res: writer,
w: responseWriter{},
}
err := w.JSON(200, "success")
assert.Nil(t, err)
err = w.XML(200, "success")
assert.Nil(t, err)
err = w.String(200, "success")
assert.Nil(t, err)
err = w.Blob(200, "blob", []byte("success"))
assert.Nil(t, err)
err = w.Stream(200, "stream", bytes.NewBuffer([]byte("success")))
assert.Nil(t, err)
}
func TestContextCtx(t *testing.T) {
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
req := &http.Request{Method: "POST"}
req = req.WithContext(ctx)
w := wrapper{
router: &Router{srv: &Server{enc: DefaultResponseEncoder}},
req: req,
res: nil,
w: responseWriter{},
}
_, ok := w.Deadline()
assert.Equal(t, ok, true)
done := w.Done()
assert.NotNil(t, done)
err := w.Err()
assert.Nil(t, err)
v := w.Value("test")
assert.Nil(t, v)
w = wrapper{
router: &Router{srv: &Server{enc: DefaultResponseEncoder}},
req: nil,
res: nil,
w: responseWriter{},
}
_, ok = w.Deadline()
assert.Equal(t, ok, false)
done = w.Done()
assert.Nil(t, done)
err = w.Err()
assert.NotNil(t, err)
v = w.Value("test")
assert.Nil(t, v)
}