router/router_test.go

119 lines
2.2 KiB
Go
Executable File

package router
import (
"fmt"
"io/ioutil"
"net/http"
"net/http/httptest"
"strings"
"testing"
)
func TestRouter(t *testing.T) {
rt := New()
paths := []string{
"/not/found",
"/hello",
"/world",
"/hello/world",
"/hello/{}/other",
}
for i, p := range paths {
if i == 0 {
continue
}
if err := rt.Add(p, getHandler(p)); err != nil {
t.Errorf("router cannot add %v: %v", p, err)
}
}
if err := rt.Add(paths[len(paths)-1], getHandler(paths[len(paths)-1])); err == nil {
t.Errorf("router can re-add %v: %v", paths[len(paths)-1], err)
}
for i, p := range paths {
w := httptest.NewRecorder()
gpath := strings.Replace(p, "{}", "seq", -1)
if req, err := http.NewRequest("GET", gpath[1:]+"/", nil); err != nil {
t.Fatalf("cannot make http req: %v", err)
} else {
rt.ServeHTTP(w, req)
b, err := ioutil.ReadAll(w.Body)
if i > 0 && (err != nil || w.Code != 200 || string(b) != p) {
t.Errorf("did not check %v: %v %v %q %q", p, err, w.Code, b, p)
}
}
}
}
func getHandler(s string) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, s)
}
}
func TestParams(t *testing.T) {
var s string
cases := []struct {
actual int
put string
want int
assign *string
err bool
}{
{
put: "a",
assign: &s,
actual: 0,
want: 1,
err: true,
},
{
put: "a",
assign: &s,
actual: 1,
want: 0,
err: true,
},
{
put: "a",
assign: &s,
actual: 1,
want: 1,
err: false,
},
{
put: "i",
assign: nil,
actual: 1,
want: 1,
err: true,
},
{
put: "",
assign: &s,
actual: 1,
want: 1,
err: true,
},
}
for z, c := range cases {
r, _ := http.NewRequest("GET", "localhost:123", nil)
actual := []string{}
for i := 0; i < c.actual; i++ {
actual = append(actual, c.put)
}
r.Header[WildcardHeader] = actual
want := []*string{}
for i := 0; i < c.want; i++ {
want = append(want, c.assign)
}
err := Params(r, want...)
if (err != nil) != c.err {
t.Errorf("[%d] get params didn't find err %v when %v vs %v: %v", z, c.err, c.actual, c.want, err)
}
}
}