mirror of
https://github.com/eiblog/eiblog.git
synced 2026-02-11 00:52:25 +08:00
115 lines
2.7 KiB
Go
115 lines
2.7 KiB
Go
package mockhttp_test
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
"testing"
|
|
|
|
"qiniupkg.com/x/mockhttp.v7"
|
|
"qiniupkg.com/x/rpc.v7"
|
|
)
|
|
|
|
// --------------------------------------------------------------------
|
|
|
|
func reply(w http.ResponseWriter, code int, data interface{}) {
|
|
|
|
msg, _ := json.Marshal(data)
|
|
h := w.Header()
|
|
h.Set("Content-Length", strconv.Itoa(len(msg)))
|
|
h.Set("Content-Type", "application/json")
|
|
w.WriteHeader(code)
|
|
w.Write(msg)
|
|
}
|
|
|
|
// --------------------------------------------------------------------
|
|
|
|
type FooRet struct {
|
|
A int `json:"a"`
|
|
B string `json:"b"`
|
|
C string `json:"c"`
|
|
}
|
|
|
|
type HandleRet map[string]string
|
|
|
|
type FooServer struct{}
|
|
|
|
func (p *FooServer) foo(w http.ResponseWriter, req *http.Request) {
|
|
reply(w, 200, &FooRet{1, req.Host, req.URL.Path})
|
|
}
|
|
|
|
func (p *FooServer) handle(w http.ResponseWriter, req *http.Request) {
|
|
reply(w, 200, HandleRet{"foo": "1", "bar": "2"})
|
|
}
|
|
|
|
func (p *FooServer) postDump(w http.ResponseWriter, req *http.Request) {
|
|
req.Body.Close()
|
|
io.Copy(w, req.Body)
|
|
}
|
|
|
|
func (p *FooServer) RegisterHandlers(mux *http.ServeMux) {
|
|
mux.HandleFunc("/foo", func(w http.ResponseWriter, req *http.Request) { p.foo(w, req) })
|
|
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { p.handle(w, req) })
|
|
mux.HandleFunc("/dump", func(w http.ResponseWriter, req *http.Request) { p.postDump(w, req) })
|
|
}
|
|
|
|
// --------------------------------------------------------------------
|
|
|
|
func TestBasic(t *testing.T) {
|
|
|
|
server := new(FooServer)
|
|
server.RegisterHandlers(http.DefaultServeMux)
|
|
|
|
mockhttp.ListenAndServe("foo.com", nil)
|
|
|
|
c := rpc.Client{mockhttp.DefaultClient}
|
|
{
|
|
var foo FooRet
|
|
err := c.Call(nil, &foo, "POST", "http://foo.com/foo")
|
|
if err != nil {
|
|
t.Fatal("call foo failed:", err)
|
|
}
|
|
if foo.A != 1 || foo.B != "foo.com" || foo.C != "/foo" {
|
|
t.Fatal("call foo: invalid ret")
|
|
}
|
|
fmt.Println(foo)
|
|
}
|
|
{
|
|
var ret map[string]string
|
|
err := c.Call(nil, &ret, "POST", "http://foo.com/bar")
|
|
if err != nil {
|
|
t.Fatal("call foo failed:", err)
|
|
}
|
|
if ret["foo"] != "1" || ret["bar"] != "2" {
|
|
t.Fatal("call bar: invalid ret")
|
|
}
|
|
fmt.Println(ret)
|
|
}
|
|
{
|
|
resp, err := c.Post("http://foo.com/dump", "", nil)
|
|
if err != nil {
|
|
t.Fatal("post foo failed:", err)
|
|
}
|
|
resp.Body.Close()
|
|
resp, err = c.Post("http://foo.com/dump", "", strings.NewReader("abc"))
|
|
if err != nil {
|
|
t.Fatal("post foo failed:", err)
|
|
}
|
|
defer resp.Body.Close()
|
|
b, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
t.Fatal("ioutil.ReadAll:", err)
|
|
}
|
|
if len(b) != 0 {
|
|
t.Fatal("body should be empty:", string(b))
|
|
}
|
|
}
|
|
}
|
|
|
|
// --------------------------------------------------------------------
|
|
|