UNPKG

6.2 kBJavaScriptView Raw
1var wayfarer = require('../')
2var noop = require('noop2')
3var tape = require('tape')
4
5tape('trie', function (t) {
6 t.test('should match a path', function (t) {
7 t.plan(1)
8 var r = wayfarer()
9 r.on('/', function () {
10 t.pass('called')
11 })
12 r('/')
13 })
14
15 t.test('should match a nested path', function (t) {
16 t.plan(1)
17 var r = wayfarer()
18 r.on('/foo/bar', function () {
19 t.pass('called')
20 })
21 r('/foo/bar')
22 })
23
24 t.test('should match a default path', function (t) {
25 t.plan(1)
26 var r = wayfarer('/404')
27 r.on('/404', function () {
28 t.pass('default')
29 })
30 r('/nope')
31 })
32
33 t.test('should allow passing of extra values', function (t) {
34 t.plan(2)
35 var foo = {}
36 var bar = {}
37 var r = wayfarer()
38 r.on('/foo', function (params, arg1, arg2) {
39 t.equal(arg1, foo, 'arg1 was passed')
40 t.equal(arg2, bar, 'arg2 was passed')
41 })
42 r('/foo', foo, bar)
43 })
44
45 t.test('.on() should catch type errors', function (t) {
46 t.plan(2)
47 var r = wayfarer()
48 t.throws(r.on.bind(r, 123), /string/, 'string')
49 t.throws(r.on.bind(r, '/hi', 123), /function/, 'function')
50 })
51
52 t.test('.emit() should match paths', function (t) {
53 t.plan(2)
54 var r = wayfarer()
55 r.on('/foo/bar', function (param) {
56 t.pass('bar called')
57 })
58 r.on('/foo/baz', function (param) {
59 t.pass('baz called')
60 })
61 r('/foo/bar')
62 r('/foo/baz')
63 })
64
65 t.test('.emit() should match partials', function (t) {
66 t.plan(1)
67 var r = wayfarer()
68 r.on('/:user', function (param) {
69 t.equal(param.user, 'tobi', 'param matched')
70 })
71 r('/tobi')
72 })
73
74 t.test('.emit() should match paths before partials', function (t) {
75 t.plan(1)
76 var r = wayfarer()
77 r.on('/foo', function () {
78 t.pass('called')
79 })
80 r.on('/:user', noop)
81 r('/foo')
82 })
83
84 t.test('.emit() should allow path overriding', function (t) {
85 t.plan(1)
86 var r = wayfarer()
87 r.on('/:user', noop)
88 r.on('/:user', function () {
89 t.pass('called')
90 })
91 r('/foo')
92 })
93
94 t.test('.emit() should match nested partials', function (t) {
95 t.plan(2)
96 var r = wayfarer()
97 r.on('/:user/:name', function (param) {
98 t.equal(param.user, 'tobi', 'param matched')
99 t.equal(param.name, 'baz', 'param matched')
100 })
101 r('/tobi/baz')
102 })
103
104 t.test('.emit() should parse encoded params', function (t) {
105 t.plan(1)
106 var r = wayfarer()
107 r.on('/:channel', function (param) {
108 t.equal(param.channel, '#choo', 'param matched')
109 })
110 r('/%23choo')
111 })
112
113 t.test('.emit() should throw if no matches are found', function (t) {
114 t.plan(1)
115 var r1 = wayfarer()
116 t.throws(r1.bind(r1, '/woops'), /route/, 'no matches found')
117 })
118
119 t.test('.emit() should return values', function (t) {
120 t.plan(1)
121 var r1 = wayfarer()
122 r1.on('/foo', function () {
123 return 'hello'
124 })
125 t.equal(r1('foo'), 'hello', 'returns value')
126 })
127
128 t.test('.emit() mount subrouters', function (t) {
129 t.plan(5)
130
131 var r4 = wayfarer()
132 var r3 = wayfarer()
133 r4.on('/kidlette', function () { t.pass('nested 2 levels') })
134 r3.on('/mom', r4)
135 r3('/mom/kidlette')
136
137 var r1 = wayfarer()
138 var r2 = wayfarer()
139 r2.on('/', function () { t.pass('nested 1 level') })
140 r1.on('/home', r2)
141 r1('/home')
142
143 var r5 = wayfarer()
144 var r6 = wayfarer()
145 r6.on('/child', function (param) {
146 t.equal(typeof param, 'object', 'param is passed')
147 t.equal(param.parent, 'hello', 'nested 2 levels with params')
148 })
149 r5.on('/:parent', r6)
150 r5('/hello/child')
151
152 var r7 = wayfarer()
153 var r8 = wayfarer()
154 var r9 = wayfarer()
155 r9.on('/bar', function (param) { t.pass('called', 'nested 3 levels') })
156 r8.on('/bin', r9)
157 r7.on('/foo', r8)
158 r7('/foo/bin/bar')
159
160 // var r10 = wayfarer()
161 // var r11 = wayfarer()
162 // var r12 = wayfarer()
163 // r12.on('/:grandchild', function (param) {
164 // t.equal(param.parent, 'bin', 'nested 3 levels with params')
165 // t.equal(param.child, 'bar', 'nested 3 levels with params')
166 // t.equal(param.grandchild, 'baz', 'nested 3 levels with parmas')
167 // })
168 // r11.on('/:child', r12)
169 // r10.on('/foo/:parent', r11)
170 // r10('/foo/bin/bar/baz')
171 })
172
173 t.test('nested routes should call parent default route', function (t) {
174 t.plan(4)
175 var r1 = wayfarer('/404')
176 var r2 = wayfarer()
177 var r3 = wayfarer()
178
179 r2.on('/bar', r3)
180 r1.on('foo', r2)
181 r1.on('/404', pass)
182
183 r1('')
184 r1('foo')
185 r1('foo/bar')
186 r1('foo/beep/boop')
187
188 function pass (params) {
189 t.pass('called')
190 }
191 })
192
193 t.test('aliases', function (t) {
194 t.plan(1)
195 var r = wayfarer()
196 t.equal(r, r.emit)
197 })
198
199 t.test('wildcards', function (t) {
200 t.plan(3)
201 var r = wayfarer()
202
203 r.on('/bar/*', function (params) {
204 t.equal(params.wildcard, 'foo/beep/boop')
205 })
206
207 r.on('/foo/:match/*', function (params) {
208 t.equal(params.match, 'bar')
209 t.equal(params.wildcard, 'beep/boop')
210 })
211
212 r('/bar/foo/beep/boop')
213 r('/foo/bar/beep/boop')
214 })
215
216 t.test('safe decodeURIComponent', function (t) {
217 t.plan(1)
218 var r = wayfarer('/404')
219 r.on('/test/:id', function (params) {
220 t.fail('we should not be here')
221 })
222 r.on('/404', function () {
223 t.pass('called')
224 })
225 r('/test/hel%"Flo')
226 })
227
228 t.test('safe decodeURIComponent - nested route', function (t) {
229 t.plan(1)
230 var r = wayfarer('/404')
231 r.on('/test/hello/world/:id/blah', function (params) {
232 t.fail('we should not be here')
233 })
234 r.on('/404', function () {
235 t.pass('called')
236 })
237 r('/test/hello/world/hel%"Flo/blah')
238 })
239
240 t.test('safe decodeURIComponent - wildcard', function (t) {
241 t.plan(1)
242 var r = wayfarer('/404')
243 r.on('/test/*', function (params) {
244 t.fail('we should not be here')
245 })
246 r.on('/404', function () {
247 t.pass('called')
248 })
249 r('/test/hel%"Flo')
250 })
251
252 t.test('should expose .router property', function (t) {
253 t.plan(1)
254 var r = wayfarer()
255 r.on('/foo', function () {
256 t.equal(this.route, '/foo', 'exposes route property')
257 })
258 r('/foo')
259 })
260})