Router a good
This commit is contained in:
125
tree_test.go
Normal file
125
tree_test.go
Normal file
@@ -0,0 +1,125 @@
|
||||
package router
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
var nilHandle = func(w http.ResponseWriter, r *http.Request) {}
|
||||
|
||||
func TestNewTree(t *testing.T) {
|
||||
newTree()
|
||||
}
|
||||
|
||||
func TestTreeInsert(t *testing.T) {
|
||||
tree := newTree()
|
||||
if err := tree.Insert("/hello/world", nilHandle); err != nil {
|
||||
t.Errorf("failed to insert first path: %v", err)
|
||||
}
|
||||
if err := tree.Insert("/hello/world", nilHandle); err == nil {
|
||||
t.Errorf("succeeded to insert dupe path: %v", err)
|
||||
}
|
||||
if err := tree.Insert("/hello/", nilHandle); err != nil {
|
||||
t.Errorf("failed to insert sub path: %v", err)
|
||||
}
|
||||
if err := tree.Insert("/world/", nilHandle); err != nil {
|
||||
t.Errorf("failed to insert new path: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestTreeLookup(t *testing.T) {
|
||||
tree := newTree()
|
||||
subtree := newTree()
|
||||
checked := false
|
||||
subtree.handler = func(w http.ResponseWriter, r *http.Request) {
|
||||
checked = true
|
||||
}
|
||||
tree.next["hi"] = subtree
|
||||
foo := tree.Lookup("/hi/")
|
||||
if foo == nil {
|
||||
t.Errorf("cannot lookup path: %v", "/hi/")
|
||||
} else {
|
||||
foo(nil, nil)
|
||||
}
|
||||
if !checked {
|
||||
t.Errorf("lookup returned wrong function")
|
||||
}
|
||||
}
|
||||
|
||||
func TestTreeInsertLookup(t *testing.T) {
|
||||
tree := newTree()
|
||||
checked := false
|
||||
foo := func(_ http.ResponseWriter, _ *http.Request) {
|
||||
checked = true
|
||||
}
|
||||
|
||||
paths := []string{
|
||||
"/hello",
|
||||
"/hello/world",
|
||||
"/world",
|
||||
}
|
||||
|
||||
for _, p := range paths {
|
||||
if err := tree.Insert(p, foo); err != nil {
|
||||
t.Fatalf("cannot insert: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
for _, p := range paths {
|
||||
if bar := tree.Lookup(p[1:] + "/"); bar == nil {
|
||||
t.Fatalf("cannot lookup: %v", p)
|
||||
} else {
|
||||
checked = false
|
||||
bar(nil, nil)
|
||||
if !checked {
|
||||
t.Errorf("failed to call %v: %v", p, checked)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestTreeWildcard(t *testing.T) {
|
||||
tree := newTree()
|
||||
checked := false
|
||||
foo := func(w http.ResponseWriter, r *http.Request) {
|
||||
checked = true
|
||||
fmt.Fprintf(w, "%v", r.Header[WildcardHeader])
|
||||
}
|
||||
|
||||
paths := []string{
|
||||
"/hello/{}",
|
||||
"/hello/{}/{}/world",
|
||||
}
|
||||
|
||||
for _, p := range paths {
|
||||
if err := tree.Insert(p, foo); err != nil {
|
||||
t.Fatalf("cannot insert: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
for _, p := range paths {
|
||||
dpath := strings.Replace(p, "{}", "seq", -1)
|
||||
if bar := tree.Lookup(dpath[1:] + "/"); bar == nil {
|
||||
t.Fatalf("cannot lookup: %v", p)
|
||||
} else {
|
||||
checked = false
|
||||
w := httptest.NewRecorder()
|
||||
r, _ := http.NewRequest("GET", dpath, nil)
|
||||
bar(w, r)
|
||||
if !checked {
|
||||
t.Errorf("failed to call %v: %v", p, checked)
|
||||
}
|
||||
b, err := ioutil.ReadAll(w.Body)
|
||||
if err != nil {
|
||||
t.Errorf("failed to read all: %v", err)
|
||||
}
|
||||
if strings.Count(string(b), "seq") != strings.Count(p, "{}") {
|
||||
t.Errorf("failed to decode wildcards: %s", b)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user