138 lines
3.2 KiB
Go
Raw Normal View History

2023-07-09 17:46:17 +02:00
package router_test
import (
"bufio"
"os"
"strings"
"testing"
"git.akyoto.dev/go/assert"
"git.akyoto.dev/go/router"
)
2023-07-09 21:24:24 +02:00
type route struct {
method string
path string
}
2023-07-09 17:46:17 +02:00
func TestHello(t *testing.T) {
2023-07-09 21:24:24 +02:00
router := router.New[string]()
2023-07-09 17:46:17 +02:00
2023-07-09 21:24:24 +02:00
router.Add("GET", "/hello", "Hello")
router.Add("GET", "/world", "World")
2023-07-09 17:46:17 +02:00
2023-07-09 21:24:24 +02:00
data, params := router.Lookup("GET", "/hello")
2023-07-09 17:46:17 +02:00
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "Hello")
2023-07-09 21:24:24 +02:00
data, params = router.Lookup("GET", "/world")
2023-07-09 17:46:17 +02:00
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "World")
2023-07-09 21:24:24 +02:00
data, params = router.Lookup("GET", "/404")
2023-07-09 17:46:17 +02:00
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "")
}
2023-07-10 11:59:21 +02:00
func TestParam(t *testing.T) {
2023-07-09 21:24:24 +02:00
router := router.New[string]()
2023-07-09 17:46:17 +02:00
2023-07-09 21:24:24 +02:00
router.Add("GET", "/blog/:slug", "Blog post")
router.Add("GET", "/blog/:slug/comments/:id", "Comment")
2023-07-09 17:46:17 +02:00
2023-07-09 21:24:24 +02:00
data, params := router.Lookup("GET", "/blog/hello-world")
2023-07-09 17:46:17 +02:00
assert.Equal(t, len(params), 1)
assert.Equal(t, params[0].Key, "slug")
assert.Equal(t, params[0].Value, "hello-world")
assert.Equal(t, data, "Blog post")
2023-07-09 21:24:24 +02:00
data, params = router.Lookup("GET", "/blog/hello-world/comments/123")
2023-07-09 17:46:17 +02:00
assert.Equal(t, len(params), 2)
assert.Equal(t, params[0].Key, "slug")
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) {
router := router.New[string]()
router.Add("GET", "/", "Front page")
2023-07-10 14:48:28 +02:00
router.Add("GET", "/:slug", "Blog post")
router.Add("GET", "/users/:id", "Parameter")
2023-07-10 11:59:21 +02:00
router.Add("GET", "/images/*path", "Wildcard")
data, params := router.Lookup("GET", "/")
assert.Equal(t, len(params), 0)
assert.Equal(t, data, "Front page")
2023-07-10 14:48:28 +02:00
data, params = router.Lookup("GET", "/blog-post")
assert.Equal(t, len(params), 1)
assert.Equal(t, params[0].Key, "slug")
assert.Equal(t, params[0].Value, "blog-post")
assert.Equal(t, data, "Blog post")
data, params = router.Lookup("GET", "/users/42")
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-07-10 11:59:21 +02:00
data, params = router.Lookup("GET", "/images/favicon/256.png")
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-07-09 17:46:17 +02:00
func TestGitHub(t *testing.T) {
2023-07-09 21:24:24 +02:00
tree := router.New[string]()
2023-07-09 17:46:17 +02:00
routes := loadRoutes("testdata/github.txt")
for _, route := range routes {
2023-07-09 21:24:24 +02:00
tree.Add(route.method, route.path, "octocat")
2023-07-09 17:46:17 +02:00
}
for _, route := range routes {
2023-07-09 21:24:24 +02:00
data, _ := tree.Lookup(route.method, route.path)
2023-07-09 17:46:17 +02:00
assert.Equal(t, data, "octocat")
}
}
2023-07-09 21:24:24 +02:00
func loadRoutes(fileName string) []route {
var routes []route
2023-07-09 17:46:17 +02:00
2023-07-09 21:24:24 +02:00
for line := range linesInFile(fileName) {
parts := strings.Split(line, " ")
routes = append(routes, route{
method: parts[0],
path: parts[1],
})
2023-07-09 17:46:17 +02:00
}
return routes
}
2023-07-09 21:24:24 +02:00
func linesInFile(fileName string) <-chan string {
lines := make(chan string)
2023-07-09 17:46:17 +02:00
go func() {
2023-07-09 21:24:24 +02:00
defer close(lines)
2023-07-09 17:46:17 +02:00
file, err := os.Open(fileName)
if err != nil {
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
2023-07-09 21:24:24 +02:00
lines <- strings.TrimSpace(scanner.Text())
2023-07-09 17:46:17 +02:00
}
}()
2023-07-09 21:24:24 +02:00
return lines
2023-07-09 17:46:17 +02:00
}