package router_test import ( "bufio" "os" "strings" "testing" "git.akyoto.dev/go/assert" "git.akyoto.dev/go/router" ) func TestHello(t *testing.T) { tree := router.Tree[string]{} tree.Add("/hello", "Hello") tree.Add("/world", "World") data, params := tree.Lookup("/hello") assert.Equal(t, len(params), 0) assert.Equal(t, data, "Hello") data, params = tree.Lookup("/world") assert.Equal(t, len(params), 0) assert.Equal(t, data, "World") data, params = tree.Lookup("/404") assert.Equal(t, len(params), 0) assert.Equal(t, data, "") } func TestParams(t *testing.T) { tree := router.Tree[string]{} tree.Add("/blog/:slug", "Blog post") tree.Add("/blog/:slug/comments/:id", "Comment") data, params := tree.Lookup("/blog/hello-world") 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") data, params = tree.Lookup("/blog/hello-world/comments/123") 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") } func TestGitHub(t *testing.T) { tree := router.Tree[string]{} routes := loadRoutes("testdata/github.txt") for _, route := range routes { tree.Add(route, "octocat") } for _, route := range routes { data, _ := tree.Lookup(route) assert.Equal(t, data, "octocat") } } func loadRoutes(fileName string) []string { var routes []string for route := range routesInFile(fileName) { routes = append(routes, route) } return routes } func routesInFile(fileName string) <-chan string { routes := make(chan string) go func() { defer close(routes) file, err := os.Open(fileName) if err != nil { return } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { routes <- strings.TrimSpace(scanner.Text()) } }() return routes }