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) } } }