1 | var wayfarer = require('../')
|
2 | var noop = require('noop2')
|
3 | var tape = require('tape')
|
4 |
|
5 | tape('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 | })
|