UNPKG

8.62 kBJavaScriptView Raw
1var wayfarer = require('../')
2var noop = require('noop2')
3var tape = require('tape')
4
5tape('router', 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('.match() should match paths', function (t) {
66 t.plan(2)
67 var r = wayfarer()
68 r.on('/foo/bar', function () {
69 t.fail('should not call callback')
70 })
71 r.on('/foo/baz', noop)
72
73 var bar = r.match('/foo/bar')
74 t.equal(bar.route, '/foo/bar')
75
76 var baz = r.match('/foo/baz')
77 t.equal(baz.route, '/foo/baz')
78 })
79
80 t.test('.emit() should match partials', function (t) {
81 t.plan(1)
82 var r = wayfarer()
83 r.on('/:user', function (param) {
84 t.equal(param.user, 'tobi', 'param matched')
85 })
86 r('/tobi')
87 })
88
89 t.test('.match() should match partials', function (t) {
90 t.plan(1)
91 var r = wayfarer()
92 r.on('/:user', noop)
93 var toby = r.match('/tobi')
94 t.equal(toby.params.user, 'tobi')
95 })
96
97 t.test('.emit() should match paths before partials', function (t) {
98 t.plan(1)
99 var r = wayfarer()
100 r.on('/foo', function () {
101 t.pass('called')
102 })
103 r.on('/:user', noop)
104 r('/foo')
105 })
106
107 t.test('.emit() should allow path overriding', function (t) {
108 t.plan(1)
109 var r = wayfarer()
110 r.on('/:user', function () {
111 t.fail('wrong callback called')
112 })
113 r.on('/:user', function () {
114 t.pass('called')
115 })
116 r('/foo')
117 })
118
119 t.test('.emit() should match nested partials', function (t) {
120 t.plan(2)
121 var r = wayfarer()
122 r.on('/:user/:name', function (param) {
123 t.equal(param.user, 'tobi', 'param matched')
124 t.equal(param.name, 'baz', 'param matched')
125 })
126 r('/tobi/baz')
127 })
128
129 t.test('.emit() should parse encoded params', function (t) {
130 t.plan(1)
131 var r = wayfarer()
132 r.on('/:channel', function (param) {
133 t.equal(param.channel, '#choo', 'param matched')
134 })
135 r('/%23choo')
136 })
137
138 t.test('.emit() should throw if no matches are found', function (t) {
139 t.plan(1)
140 var r1 = wayfarer()
141 t.throws(r1.bind(r1, '/woops'), /route/, 'no matches found')
142 })
143
144 t.test('.emit() should return values', function (t) {
145 t.plan(1)
146 var r1 = wayfarer()
147 r1.on('/foo', function () {
148 return 'hello'
149 })
150 t.equal(r1('foo'), 'hello', 'returns value')
151 })
152
153 t.test('.emit() mount subrouters', function (t) {
154 t.plan(5)
155
156 var r4 = wayfarer()
157 var r3 = wayfarer()
158 r4.on('/kidlette', function () { t.pass('nested 2 levels') })
159 r3.on('/mom', r4)
160 r3('/mom/kidlette')
161
162 var r1 = wayfarer()
163 var r2 = wayfarer()
164 r2.on('/', function () { t.pass('nested 1 level') })
165 r1.on('/home', r2)
166 r1('/home')
167
168 var r5 = wayfarer()
169 var r6 = wayfarer()
170 r6.on('/child', function (param) {
171 t.equal(typeof param, 'object', 'param is passed')
172 t.equal(param.parent, 'hello', 'nested 2 levels with params')
173 })
174 r5.on('/:parent', r6)
175 r5('/hello/child')
176
177 var r7 = wayfarer()
178 var r8 = wayfarer()
179 var r9 = wayfarer()
180 r9.on('/bar', function (param) { t.pass('called', 'nested 3 levels') })
181 r8.on('/bin', r9)
182 r7.on('/foo', r8)
183 r7('/foo/bin/bar')
184 })
185
186 t.test('.emit() should match nested partials of subrouters', function (t) {
187 t.plan(3)
188 var r1 = wayfarer()
189 var r2 = wayfarer()
190 var r3 = wayfarer()
191 r3.on('/:grandchild', function (param) {
192 t.equal(param.parent, 'bin', 'nested 3 levels with params')
193 t.equal(param.child, 'bar', 'nested 3 levels with params')
194 t.equal(param.grandchild, 'baz', 'nested 3 levels with parmas')
195 })
196 r2.on('/:child', r3)
197 r1.on('/foo/:parent', r2)
198 r1('/foo/bin/bar/baz')
199 })
200
201 t.test('.match() should return nested partials of subrouters', function (t) {
202 t.plan(3)
203 var r1 = wayfarer()
204 var r2 = wayfarer()
205 var r3 = wayfarer()
206 r3.on('/:grandchild', noop)
207 r2.on('/:child', r3)
208 r1.on('/foo/:parent', r2)
209 var matched = r1.match('/foo/bin/bar/baz')
210 t.equal(matched.params.parent, 'bin')
211 t.equal(matched.params.child, 'bar')
212 t.equal(matched.params.grandchild, 'baz')
213 })
214
215 t.test('.match() returns a handler of a route', function (t) {
216 t.plan(1)
217 var r = wayfarer()
218 r.on('/:user', function () {
219 t.pass('called')
220 })
221 var toby = r.match('/tobi')
222 toby.cb()
223 })
224
225 t.test('nested routes should call parent default route', function (t) {
226 t.plan(4)
227 var r1 = wayfarer('/404')
228 var r2 = wayfarer()
229 var r3 = wayfarer()
230
231 r2.on('/bar', r3)
232 r1.on('foo', r2)
233 r1.on('/404', pass)
234
235 r1('')
236 r1('foo')
237 r1('foo/bar')
238 r1('foo/beep/boop')
239
240 function pass (params) {
241 t.pass('called')
242 }
243 })
244
245 t.test('aliases', function (t) {
246 t.plan(1)
247 var r = wayfarer()
248 t.equal(r, r.emit)
249 })
250
251 t.test('wildcards', function (t) {
252 t.plan(3)
253 var r = wayfarer()
254
255 r.on('/bar/*', function (params) {
256 t.equal(params.wildcard, 'foo/beep/boop')
257 })
258
259 r.on('/foo/:match/*', function (params) {
260 t.equal(params.match, 'bar')
261 t.equal(params.wildcard, 'beep/boop')
262 })
263
264 r('/bar/foo/beep/boop')
265 r('/foo/bar/beep/boop')
266 })
267
268 t.test('wildcards dont conflict with params', function (t) {
269 t.plan(3)
270 var router
271
272 router = wayfarer()
273 router.on('/*', function (params) {
274 t.fail('wildcard called')
275 })
276 router.on('/:match', function (params) {
277 t.pass('param called')
278 })
279 router('/foo')
280
281 router = wayfarer()
282 router.on('/*', function (params) {
283 t.fail('wildcard called')
284 })
285 router.on('/:match/foo', function (params) {
286 t.pass('param called')
287 })
288 router('/foo/foo')
289
290 router = wayfarer()
291 router.on('/*', function (params) {
292 t.pass('wildcard called')
293 })
294 router.on('/:match/foo', function (params) {
295 t.fail('param called')
296 })
297 router('/foo/bar')
298 })
299
300 t.test('safe decodeURIComponent', function (t) {
301 t.plan(1)
302 var r = wayfarer('/404')
303 r.on('/test/:id', function (params) {
304 t.fail('we should not be here')
305 })
306 r.on('/404', function () {
307 t.pass('called')
308 })
309 r('/test/hel%"Flo')
310 })
311
312 t.test('safe decodeURIComponent - nested route', function (t) {
313 t.plan(1)
314 var r = wayfarer('/404')
315 r.on('/test/hello/world/:id/blah', function (params) {
316 t.fail('we should not be here')
317 })
318 r.on('/404', function () {
319 t.pass('called')
320 })
321 r('/test/hello/world/hel%"Flo/blah')
322 })
323
324 t.test('safe decodeURIComponent - wildcard', function (t) {
325 t.plan(1)
326 var r = wayfarer('/404')
327 r.on('/test/*', function (params) {
328 t.fail('we should not be here')
329 })
330 r.on('/404', function () {
331 t.pass('called')
332 })
333 r('/test/hel%"Flo')
334 })
335
336 t.test('should expose .route property', function (t) {
337 t.plan(1)
338 var r = wayfarer()
339 r.on('/foo', function () {
340 t.equal(this.route, '/foo', 'exposes route property')
341 })
342 r('/foo')
343 })
344
345 t.test('should not mutate callback parameter', function (t) {
346 t.plan(4)
347 var r = wayfarer()
348 var routes = ['/foo', '/bar']
349 r.on('/foo', callback)
350 r.on('/bar', callback)
351 r('/foo')
352 r('/bar')
353 function callback () {
354 t.notEqual(this, callback, 'callback was proxied')
355 t.equal(this.route, routes.shift(), 'proxy exposes route property')
356 }
357 })
358})