229 lines
5.4 KiB
Go
Raw Normal View History

2023-07-09 17:46:17 +02:00
package router_test
import (
2023-09-06 16:52:22 +02:00
"strings"
2023-07-09 17:46:17 +02:00
"testing"
"git.akyoto.dev/go/assert"
"git.akyoto.dev/go/router"
)
2023-09-01 12:43:36 +02:00
func TestStatic(t *testing.T) {
2023-09-02 09:19:11 +02:00
r := router.New[string]()
r.Add("GET", "/hello", "Hello")
r.Add("GET", "/world", "World")
2023-07-09 17:46:17 +02:00
2023-09-02 09:19:11 +02:00
data, params := r.Lookup("GET", "/hello")
2023-07-09 17:46:17 +02:00
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "Hello")
2023-09-02 09:19:11 +02:00
data, params = r.Lookup("GET", "/world")
2023-07-09 17:46:17 +02:00
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "World")
2023-09-06 11:44:04 +02:00
notFound := []string{
"",
"?",
"/404",
"/hell",
"/hall",
"/helloo",
}
for _, path := range notFound {
data, params = r.Lookup("GET", path)
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "")
}
2023-07-09 17:46:17 +02:00
}
2023-09-01 12:43:36 +02:00
func TestParameter(t *testing.T) {
2023-09-02 09:19:11 +02:00
r := router.New[string]()
2023-09-06 11:44:04 +02:00
r.Add("GET", "/blog/:post", "Blog post")
r.Add("GET", "/blog/:post/comments/:id", "Comment")
2023-07-09 17:46:17 +02:00
2023-09-02 09:19:11 +02:00
data, params := r.Lookup("GET", "/blog/hello-world")
2023-07-09 17:46:17 +02:00
assert.Equal(t, len(params), 1)
2023-09-06 11:44:04 +02:00
assert.Equal(t, params[0].Key, "post")
2023-07-09 17:46:17 +02:00
assert.Equal(t, params[0].Value, "hello-world")
assert.Equal(t, data, "Blog post")
2023-09-02 09:19:11 +02:00
data, params = r.Lookup("GET", "/blog/hello-world/comments/123")
2023-07-09 17:46:17 +02:00
assert.Equal(t, len(params), 2)
2023-09-06 11:44:04 +02:00
assert.Equal(t, params[0].Key, "post")
2023-07-09 17:46:17 +02:00
assert.Equal(t, params[0].Value, "hello-world")
assert.Equal(t, params[1].Key, "id")
assert.Equal(t, params[1].Value, "123")
assert.Equal(t, data, "Comment")
}
2023-07-10 11:59:21 +02:00
func TestWildcard(t *testing.T) {
2023-09-02 09:19:11 +02:00
r := router.New[string]()
r.Add("GET", "/", "Front page")
2023-09-06 11:44:04 +02:00
r.Add("GET", "/:post", "Blog post")
2023-09-06 16:52:22 +02:00
r.Add("GET", "/*any", "Wildcard")
2023-09-02 09:19:11 +02:00
r.Add("GET", "/users/:id", "Parameter")
2023-09-06 11:44:04 +02:00
r.Add("GET", "/images/static", "Static")
2023-09-02 09:19:11 +02:00
r.Add("GET", "/images/*path", "Wildcard")
2023-07-10 11:59:21 +02:00
2023-09-02 09:19:11 +02:00
data, params := r.Lookup("GET", "/")
2023-07-10 11:59:21 +02:00
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "Front page")
2023-09-02 09:19:11 +02:00
data, params = r.Lookup("GET", "/blog-post")
2023-07-10 14:48:28 +02:00
assert.Equal(t, len(params), 1)
2023-09-06 11:44:04 +02:00
assert.Equal(t, params[0].Key, "post")
2023-07-10 14:48:28 +02:00
assert.Equal(t, params[0].Value, "blog-post")
assert.Equal(t, data, "Blog post")
2023-09-02 09:19:11 +02:00
data, params = r.Lookup("GET", "/users/42")
2023-07-10 14:48:28 +02:00
assert.Equal(t, len(params), 1)
assert.Equal(t, params[0].Key, "id")
assert.Equal(t, params[0].Value, "42")
assert.Equal(t, data, "Parameter")
2023-09-06 16:52:22 +02:00
data, _ = r.Lookup("GET", "/users/42/test.txt")
assert.Equal(t, data, "Wildcard")
2023-09-06 11:44:04 +02:00
data, params = r.Lookup("GET", "/images/static")
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "Static")
data, params = r.Lookup("GET", "/images/ste")
assert.Equal(t, len(params), 1)
assert.Equal(t, params[0].Key, "path")
assert.Equal(t, params[0].Value, "ste")
assert.Equal(t, data, "Wildcard")
data, params = r.Lookup("GET", "/images/sta")
assert.Equal(t, len(params), 1)
assert.Equal(t, params[0].Key, "path")
assert.Equal(t, params[0].Value, "sta")
assert.Equal(t, data, "Wildcard")
2023-09-02 09:19:11 +02:00
data, params = r.Lookup("GET", "/images/favicon/256.png")
2023-07-10 11:59:21 +02:00
assert.Equal(t, len(params), 1)
assert.Equal(t, params[0].Key, "path")
assert.Equal(t, params[0].Value, "favicon/256.png")
assert.Equal(t, data, "Wildcard")
}
2023-09-06 16:52:22 +02:00
func TestMap(t *testing.T) {
r := router.New[string]()
r.Add("GET", "/hello", "Hello")
r.Add("GET", "/world", "World")
r.Add("GET", "/user/:user", "User")
r.Add("GET", "/*path", "Path")
r.Map(func(data string) string {
return strings.Repeat(data, 2)
})
data, params := r.Lookup("GET", "/hello")
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "HelloHello")
data, params = r.Lookup("GET", "/world")
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "WorldWorld")
data, params = r.Lookup("GET", "/user/123")
assert.Equal(t, len(params), 1)
assert.Equal(t, data, "UserUser")
data, params = r.Lookup("GET", "/test.txt")
assert.Equal(t, len(params), 1)
assert.Equal(t, data, "PathPath")
}
2023-09-01 12:43:36 +02:00
func TestMethods(t *testing.T) {
methods := []string{
"GET",
"POST",
"DELETE",
"PUT",
"PATCH",
"HEAD",
"CONNECT",
"TRACE",
"OPTIONS",
2023-07-09 17:46:17 +02:00
}
2023-09-02 09:19:11 +02:00
r := router.New[string]()
2023-09-01 12:43:36 +02:00
for _, method := range methods {
2023-09-02 09:19:11 +02:00
r.Add(method, "/", method)
2023-07-09 17:46:17 +02:00
}
2023-09-01 12:43:36 +02:00
for _, method := range methods {
2023-09-02 09:19:11 +02:00
data, _ := r.Lookup(method, "/")
2023-09-01 12:43:36 +02:00
assert.Equal(t, data, method)
2023-07-09 17:46:17 +02:00
}
}
2023-09-01 12:43:36 +02:00
func TestGitHub(t *testing.T) {
routes := loadRoutes("testdata/github.txt")
2023-09-02 09:19:11 +02:00
r := router.New[string]()
2023-07-09 17:46:17 +02:00
2023-09-01 12:43:36 +02:00
for _, route := range routes {
2023-09-02 09:19:11 +02:00
r.Add(route.method, route.path, "octocat")
2023-09-01 12:43:36 +02:00
}
2023-07-09 17:46:17 +02:00
2023-09-01 12:43:36 +02:00
for _, route := range routes {
2023-09-02 09:19:11 +02:00
data, _ := r.Lookup(route.method, route.path)
2023-09-01 12:43:36 +02:00
assert.Equal(t, data, "octocat")
2023-09-06 11:44:04 +02:00
data = r.LookupNoAlloc(route.method, route.path, func(string, string) {})
assert.Equal(t, data, "octocat")
2023-09-01 12:43:36 +02:00
}
2023-07-09 17:46:17 +02:00
}
2023-09-02 09:19:11 +02:00
2023-09-06 16:52:22 +02:00
func TestTrailingSlash(t *testing.T) {
r := router.New[string]()
r.Add("GET", "/hello", "Hello 1")
r.Add("GET", "/hello/", "Hello 2")
data, params := r.Lookup("GET", "/hello")
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "Hello 1")
data, params = r.Lookup("GET", "/hello/")
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "Hello 2")
}
2023-09-06 11:44:04 +02:00
func TestOverwrite(t *testing.T) {
r := router.New[string]()
r.Add("GET", "/", "1")
r.Add("GET", "/", "2")
r.Add("GET", "/", "3")
r.Add("GET", "/", "4")
r.Add("GET", "/", "5")
data, params := r.Lookup("GET", "/")
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "5")
}
2023-09-06 16:52:22 +02:00
func TestInvalidMethod(t *testing.T) {
defer func() {
if recover() == nil {
t.FailNow()
}
}()
r := router.New[string]()
r.Add("?", "/hello", "Hello")
}
2023-09-02 09:19:11 +02:00
func TestMemoryUsage(t *testing.T) {
escape := func(a any) {}
result := testing.Benchmark(func(b *testing.B) {
r := router.New[string]()
escape(r)
})
t.Logf("%d bytes", result.MemBytes)
}