about summary refs log tree commit diff
path: root/router_test.go
blob: 8ee2bccef9f1785484b79935e3285df40229022c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package mooh

import (
	"fmt"
	"net/http"
	"net/url"
	"testing"
)

func testRoute(req *Request) (Response, error) {
	resp := Response{}
	return resp, nil
}

func TestBasic(t *testing.T) {
	router := BuildDispatcher()
	router.AddRoute(&Route{Method: "GET", Path: "/", Code: testRoute})
	router.AddRoute(&Route{Method: "GET", Path: "/blog/:year/:month/:day", Code: testRoute})
	router.AddRoute(&Route{Method: "GET", Path: "/blog", Code: testRoute})

	if router.routes[0].Path != "/" {
		t.Fatal()
	}
	if router.routes[1].Path != "/blog/:year/:month/:day" {
		t.Fatal()
	}
	if router.routes[2].Path != "/blog" {
		t.Fatal()
	}
}

func TestMatch(t *testing.T) {
	router := BuildDispatcher()
	router.AddRoute(&Route{Method: "GET", Path: "/blog/:year/:month/:day", Code: testRoute})
	router.AddRoute(&Route{Method: "GET", Path: "/blog", Code: testRoute})

	pathToTests := []url.URL{
		url.URL{Path: "/blog"},
		url.URL{Path: "/blog"},
		url.URL{Path: "/blog/2013/4/21"},
		url.URL{Path: "/blog/2013/21/4"},
	}
	for _, p := range pathToTests {
		r := &http.Request{URL: &p, Method: "GET"}
		m, _ := router.Match(r)
		if m == nil {
			t.Fatal()
		} else {
			fmt.Println(fmt.Sprintf("%s match for %s", p.Path, m.Path))
		}
	}
}

func TestMatchOptional(t *testing.T) {
	router := BuildDispatcher()
	router.AddRoute(&Route{Path: "/blog/?:year", Method: "GET", Code: testRoute})
	router.AddRoute(&Route{Path: "/blog/:year/?:month", Method: "GET", Code: testRoute})

	pathToTests := []url.URL{
		url.URL{Path: "/blog"},
		url.URL{Path: "/blog"},
		url.URL{Path: "/blog/2013"},
		url.URL{Path: "/blog/2013/21"},
	}
	for _, p := range pathToTests {
		r := &http.Request{URL: &p, Method: "GET"}
		m, _ := router.Match(r)
		if m == nil {
			t.Fatal()
		} else {
			fmt.Println(fmt.Sprintf("%s match for %s", p.Path, m.Path))
		}
	}
}

func TestAmbigiousSimple(t *testing.T) {
	router := BuildDispatcher()
	router.AddRoute(&Route{Path: "/foo/bar", Method: "GET", Code: testRoute})
	router.AddRoute(&Route{Path: "/foo/:bar", Method: "GET", Code: testRoute})

	r := &http.Request{Method: "GET", URL: &url.URL{Path: "/foo/bar"}}
	m, _ := router.Match(r)
	if m == nil {
		t.Fatal()
	} else {
		fmt.Println(fmt.Sprintf("%s match for %s", r.URL.Path, m.Path))
	}
}

func TestAmbigiousFail(t *testing.T) {
	router := BuildDispatcher()
	router.AddRoute(&Route{Path: "/foo/:bar", Method: "GET", Code: testRoute})
	router.AddRoute(&Route{Path: "/:foo/bar", Method: "GET", Code: testRoute})

	r := &http.Request{Method: "GET", URL: &url.URL{Path: "/foo/bar"}}
	m, err := router.Match(r)
	if m != nil {
		t.Fatal()
	}
	if err == nil {
		t.Fatal()
	}
	fmt.Println(err)
}