2021-09-27 23:30:43 +03:00
|
|
|
package http
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
2021-10-02 18:34:22 +03:00
|
|
|
func TestTrieFixedPattern(t *testing.T) {
|
|
|
|
type handler struct {
|
|
|
|
name string
|
|
|
|
}
|
|
|
|
tr := NewTrie()
|
|
|
|
tr.Insert([]string{http.MethodPut}, "/v1/create/{id}", &handler{name: "pattern"})
|
|
|
|
tr.Insert([]string{http.MethodPut}, "/v1/create/12", &handler{name: "fixed"})
|
|
|
|
h, _, ok := tr.Search(http.MethodPut, "/v1/create/12", IgnoreCase(false))
|
|
|
|
if !ok {
|
|
|
|
t.Fatalf("unexpected error")
|
|
|
|
}
|
|
|
|
if h.(*handler).name != "fixed" {
|
|
|
|
t.Fatalf("invalid handler %v", h)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-29 13:41:47 +03:00
|
|
|
func TestTrieIgnoreCase(t *testing.T) {
|
|
|
|
type handler struct {
|
|
|
|
name string
|
|
|
|
}
|
|
|
|
tr := NewTrie()
|
|
|
|
tr.Insert([]string{http.MethodPut}, "/v1/create/{id}", &handler{name: "test"})
|
|
|
|
|
|
|
|
_, _, ok := tr.Search(http.MethodPut, "/v1/CREATE/12", IgnoreCase(true))
|
|
|
|
if !ok {
|
|
|
|
t.Fatalf("unexpected error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-28 23:43:43 +03:00
|
|
|
func TestTrieContentType(t *testing.T) {
|
|
|
|
type handler struct {
|
|
|
|
name string
|
|
|
|
}
|
|
|
|
tr := NewTrie()
|
|
|
|
tr.Insert([]string{"application/json"}, "/v1/create/{id}", &handler{name: "test"})
|
|
|
|
|
|
|
|
h, _, ok := tr.Search("application/json", "/v1/create/12")
|
|
|
|
if !ok {
|
|
|
|
t.Fatalf("must be found error")
|
|
|
|
}
|
|
|
|
if h.(*handler).name != "test" {
|
|
|
|
t.Fatalf("invalid handler %v", h)
|
|
|
|
}
|
|
|
|
_, _, ok = tr.Search("text/xml", "/v1/create/12")
|
|
|
|
if ok {
|
|
|
|
t.Fatalf("must be not found error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-27 23:30:43 +03:00
|
|
|
func TestTrieNoMatchMethod(t *testing.T) {
|
|
|
|
tr := NewTrie()
|
|
|
|
tr.Insert([]string{http.MethodPut}, "/v1/create/{id}", nil)
|
|
|
|
|
|
|
|
_, _, ok := tr.Search(http.MethodPost, "/v1/create")
|
|
|
|
if ok {
|
|
|
|
t.Fatalf("must be not found error")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestTrieMatchRegexp(t *testing.T) {
|
2021-09-28 01:02:28 +03:00
|
|
|
type handler struct{}
|
2021-09-27 23:30:43 +03:00
|
|
|
tr := NewTrie()
|
|
|
|
tr.Insert([]string{http.MethodPut}, "/v1/create/{category}/{id:[0-9]+}", &handler{})
|
|
|
|
|
|
|
|
_, params, ok := tr.Search(http.MethodPut, "/v1/create/test_cat/12345")
|
2021-09-29 13:19:07 +03:00
|
|
|
switch {
|
|
|
|
case !ok:
|
2021-09-27 23:30:43 +03:00
|
|
|
t.Fatalf("route not found")
|
2021-09-29 13:19:07 +03:00
|
|
|
case len(params) != 2:
|
2021-09-27 23:30:43 +03:00
|
|
|
t.Fatalf("param matching error %v", params)
|
2021-09-29 13:19:07 +03:00
|
|
|
case params["category"] != "test_cat":
|
2021-09-27 23:30:43 +03:00
|
|
|
t.Fatalf("param matching error %v", params)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestTrieMatchRegexpFail(t *testing.T) {
|
2021-09-28 01:02:28 +03:00
|
|
|
type handler struct{}
|
2021-09-27 23:30:43 +03:00
|
|
|
tr := NewTrie()
|
|
|
|
tr.Insert([]string{http.MethodPut}, "/v1/create/{id:[a-z]+}", &handler{})
|
|
|
|
|
|
|
|
_, _, ok := tr.Search(http.MethodPut, "/v1/create/12345")
|
|
|
|
if ok {
|
|
|
|
t.Fatalf("route must not be not found")
|
|
|
|
}
|
|
|
|
}
|
2021-09-28 01:02:28 +03:00
|
|
|
|
|
|
|
func TestTrieMatchLongest(t *testing.T) {
|
|
|
|
type handler struct {
|
|
|
|
name string
|
|
|
|
}
|
|
|
|
tr := NewTrie()
|
|
|
|
tr.Insert([]string{http.MethodPut}, "/v1/create", &handler{name: "first"})
|
|
|
|
tr.Insert([]string{http.MethodPut}, "/v1/create/{id:[0-9]+}", &handler{name: "second"})
|
|
|
|
if h, _, ok := tr.Search(http.MethodPut, "/v1/create/12345"); !ok {
|
|
|
|
t.Fatalf("route must be found")
|
|
|
|
} else if h.(*handler).name != "second" {
|
|
|
|
t.Fatalf("invalid handler found: %s != %s", h.(*handler).name, "second")
|
|
|
|
}
|
|
|
|
if h, _, ok := tr.Search(http.MethodPut, "/v1/create"); !ok {
|
|
|
|
t.Fatalf("route must be found")
|
|
|
|
} else if h.(*handler).name != "first" {
|
|
|
|
t.Fatalf("invalid handler found: %s != %s", h.(*handler).name, "first")
|
|
|
|
}
|
|
|
|
}
|