roda 3.18.0 → 3.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,535 @@
1
+ require_relative "../spec_helper"
2
+
3
+ describe "hash_routes plugin - hash_routes DSL" do
4
+ before do
5
+ app(:bare) do
6
+ plugin :hash_routes
7
+
8
+ hash_routes "" do
9
+ on "a" do |r|
10
+ r.is "" do
11
+ "a0"
12
+ end
13
+
14
+ r.is "a" do
15
+ "a1"
16
+ end
17
+
18
+ r.hash_branches
19
+
20
+ "a2"
21
+ end
22
+
23
+ on "b" do |r|
24
+ r.is "" do
25
+ "b0"
26
+ end
27
+
28
+ r.is "a" do
29
+ "b1"
30
+ end
31
+
32
+ "b2"
33
+ end
34
+
35
+ is "c" do |r|
36
+ "c#{r.request_method}"
37
+ end
38
+
39
+ get 'd' do
40
+ 'dg'
41
+ end
42
+
43
+ post 'e' do
44
+ 'ep'
45
+ end
46
+ end
47
+
48
+ hash_routes "/a" do |hr|
49
+ hr.dispatch_from(:p, "r")
50
+
51
+ hr.dispatch_from(:p, "s") do |r|
52
+ r.is "a" do
53
+ "psa1"
54
+ end
55
+ end
56
+
57
+ hr.on "b" do |r|
58
+ r.is "" do
59
+ "ab0"
60
+ end
61
+
62
+ r.is "a" do
63
+ "ab1"
64
+ end
65
+
66
+ r.hash_branches
67
+
68
+ "ab2"
69
+ end
70
+ end
71
+
72
+ phr = hash_routes(:p)
73
+
74
+ phr.is true do
75
+ "pi"
76
+ end
77
+
78
+ phr.on "x" do |r|
79
+ r.is do
80
+ 'px'
81
+ end
82
+
83
+ 'pnx'
84
+ end
85
+
86
+ route do |r|
87
+ r.hash_routes
88
+
89
+ r.on 'p' do
90
+ r.hash_routes(:p)
91
+
92
+ r.hash_routes("")
93
+
94
+ "p"
95
+ end
96
+
97
+ "n"
98
+ end
99
+ end
100
+ end
101
+
102
+ it "adds support for routing via r.hash_routes" do
103
+ body.must_equal 'n'
104
+ body('/a').must_equal 'a2'
105
+ body('/a/').must_equal 'a0'
106
+ body('/a/a').must_equal 'a1'
107
+ body('/a/b').must_equal 'ab2'
108
+ body('/a/b/').must_equal 'ab0'
109
+ body('/a/b/a').must_equal 'ab1'
110
+ body('/b').must_equal 'b2'
111
+ body('/b/').must_equal 'b0'
112
+ body('/b/a').must_equal 'b1'
113
+ body('/c').must_equal 'cGET'
114
+ body('/c', 'REQUEST_METHOD'=>'POST').must_equal 'cPOST'
115
+ body('/c/').must_equal 'n'
116
+ body('/d').must_equal 'dg'
117
+ body('/d', 'REQUEST_METHOD'=>'POST').must_equal ''
118
+ body('/d/').must_equal 'n'
119
+ body('/e').must_equal ''
120
+ body('/e', 'REQUEST_METHOD'=>'POST').must_equal 'ep'
121
+ body('/e/').must_equal 'n'
122
+ body('/p').must_equal 'pi'
123
+ body('/p/x').must_equal 'px'
124
+ body('/p/x/1').must_equal 'pnx'
125
+
126
+ body('/p/a').must_equal 'a2'
127
+ body('/p/a/').must_equal 'a0'
128
+ body('/p/a/a').must_equal 'a1'
129
+ body('/p/a/b').must_equal 'a2'
130
+ body('/p/a/b/').must_equal 'a2'
131
+ body('/p/a/b/a').must_equal 'a2'
132
+ body('/p/b').must_equal 'b2'
133
+ body('/p/b/').must_equal 'b0'
134
+ body('/p/b/a').must_equal 'b1'
135
+ body('/p/c').must_equal 'cGET'
136
+ body('/p/c', 'REQUEST_METHOD'=>'POST').must_equal 'cPOST'
137
+ body('/p/c/').must_equal 'p'
138
+ body('/p/d').must_equal 'dg'
139
+ body('/p/d', 'REQUEST_METHOD'=>'POST').must_equal ''
140
+ body('/p/d/').must_equal 'p'
141
+ body('/p/e').must_equal ''
142
+ body('/p/e', 'REQUEST_METHOD'=>'POST').must_equal 'ep'
143
+ body('/p/e/').must_equal 'p'
144
+ body('/p/p').must_equal 'p'
145
+ body('/p/p/x').must_equal 'p'
146
+ body('/p/p/x/1').must_equal 'p'
147
+
148
+ body('/p/r/b').must_equal 'ab2'
149
+ body('/p/r/b/').must_equal 'ab0'
150
+ body('/p/r/b/a').must_equal 'ab1'
151
+
152
+ body('/p/s/a').must_equal 'psa1'
153
+ body('/p/s/b').must_equal 'ab2'
154
+ body('/p/s/b/').must_equal 'ab0'
155
+ body('/p/s/b/a').must_equal 'ab1'
156
+ end
157
+
158
+ it "works when freezing the app" do
159
+ app.freeze
160
+ body.must_equal 'n'
161
+ body('/a').must_equal 'a2'
162
+ body('/a/').must_equal 'a0'
163
+ proc{app.hash_branch("foo"){}}.must_raise
164
+ end
165
+
166
+ it "works when subclassing the app" do
167
+ old_app = app
168
+ @app = Class.new(app)
169
+ @app.route(&old_app.route_block)
170
+ body.must_equal 'n'
171
+ body('/a').must_equal 'a2'
172
+ body('/a/').must_equal 'a0'
173
+ body('/p/x').must_equal 'px'
174
+ end
175
+
176
+ it "handles loading the plugin multiple times correctly" do
177
+ app.plugin :hash_routes
178
+ body.must_equal 'n'
179
+ body('/a').must_equal 'a2'
180
+ body('/a/').must_equal 'a0'
181
+ body('/p/x').must_equal 'px'
182
+ end
183
+
184
+ it "r.hash_routes with verb handles loading the same route more than once" do
185
+ app.hash_routes "" do
186
+ get 'd' do
187
+ 'dg'
188
+ end
189
+ end
190
+
191
+ body('/d').must_equal 'dg'
192
+ body('/d', 'REQUEST_METHOD'=>'POST').must_equal ''
193
+ body('/d/').must_equal 'n'
194
+ end
195
+ end
196
+
197
+ describe "hash_routes plugin - hash_branch" do
198
+ before do
199
+ app(:bare) do
200
+ plugin :hash_routes
201
+
202
+ hash_branch("a") do |r|
203
+ r.is "" do
204
+ "a0"
205
+ end
206
+
207
+ r.is "a" do
208
+ "a1"
209
+ end
210
+
211
+ r.hash_branches
212
+
213
+ "a2"
214
+ end
215
+
216
+ hash_branch("/a", "b") do |r|
217
+ r.is "" do
218
+ "ab0"
219
+ end
220
+
221
+ r.is "a" do
222
+ "ab1"
223
+ end
224
+
225
+ r.hash_branches
226
+
227
+ "ab2"
228
+ end
229
+
230
+ hash_branch("", "b") do |r|
231
+ r.is "" do
232
+ "b0"
233
+ end
234
+
235
+ r.is "a" do
236
+ "b1"
237
+ end
238
+
239
+ "b2"
240
+ end
241
+
242
+ hash_branch(:p, "x") do |r|
243
+ r.is do
244
+ 'px'
245
+ end
246
+
247
+ 'pnx'
248
+ end
249
+
250
+ route do |r|
251
+ r.hash_branches
252
+
253
+ r.on 'p' do
254
+ r.hash_branches(:p)
255
+
256
+ r.hash_branches("")
257
+
258
+ "p"
259
+ end
260
+
261
+ "n"
262
+ end
263
+ end
264
+ end
265
+
266
+ it "adds support for routing via r.hash_branches" do
267
+ body.must_equal 'n'
268
+ body('/a').must_equal 'a2'
269
+ body('/a/').must_equal 'a0'
270
+ body('/a/a').must_equal 'a1'
271
+ body('/a/b').must_equal 'ab2'
272
+ body('/a/b/').must_equal 'ab0'
273
+ body('/a/b/a').must_equal 'ab1'
274
+ body('/b').must_equal 'b2'
275
+ body('/b/').must_equal 'b0'
276
+ body('/b/a').must_equal 'b1'
277
+ body('/p').must_equal 'p'
278
+ body('/p/x').must_equal 'px'
279
+ body('/p/x/1').must_equal 'pnx'
280
+
281
+ body('/p/a').must_equal 'a2'
282
+ body('/p/a/').must_equal 'a0'
283
+ body('/p/a/a').must_equal 'a1'
284
+ body('/p/a/b').must_equal 'a2'
285
+ body('/p/a/b/').must_equal 'a2'
286
+ body('/p/a/b/a').must_equal 'a2'
287
+ body('/p/b').must_equal 'b2'
288
+ body('/p/b/').must_equal 'b0'
289
+ body('/p/b/a').must_equal 'b1'
290
+ body('/p/p').must_equal 'p'
291
+ body('/p/p/x').must_equal 'p'
292
+ body('/p/p/x/1').must_equal 'p'
293
+ end
294
+
295
+ it "works when freezing the app" do
296
+ app.freeze
297
+ body.must_equal 'n'
298
+ body('/a').must_equal 'a2'
299
+ body('/a/').must_equal 'a0'
300
+ proc{app.hash_branch("foo"){}}.must_raise
301
+ end
302
+
303
+ it "works when subclassing the app" do
304
+ old_app = app
305
+ @app = Class.new(app)
306
+ @app.route(&old_app.route_block)
307
+ body.must_equal 'n'
308
+ body('/a').must_equal 'a2'
309
+ body('/a/').must_equal 'a0'
310
+ body('/p/x').must_equal 'px'
311
+ end
312
+
313
+ it "handles loading the plugin multiple times correctly" do
314
+ app.plugin :hash_routes
315
+ body.must_equal 'n'
316
+ body('/a').must_equal 'a2'
317
+ body('/a/').must_equal 'a0'
318
+ body('/p/x').must_equal 'px'
319
+ end
320
+
321
+ it "r.hash_branch handles loading the same route more than once" do
322
+ app.hash_branch(:p, "x") do |r|
323
+ 'px'
324
+ end
325
+
326
+ body('/p').must_equal 'p'
327
+ body('/p/x').must_equal 'px'
328
+ end
329
+ end
330
+
331
+ describe "hash_routes plugin - hash_path" do
332
+ before do
333
+ app(:bare) do
334
+ plugin :hash_routes
335
+
336
+ hash_path("/a") do |r|
337
+ r.get{"a"}
338
+ r.post{"ap"}
339
+ end
340
+
341
+ hash_path("", "/b") do |_|
342
+ "b"
343
+ end
344
+
345
+ hash_path("/c", "/b") do |_|
346
+ "cb"
347
+ end
348
+
349
+ hash_path(:p, "/x") do |_|
350
+ 'px'
351
+ end
352
+
353
+ route do |r|
354
+ r.hash_paths
355
+
356
+ r.on 'p' do
357
+ r.hash_paths(:p)
358
+
359
+ r.hash_paths("")
360
+
361
+ "p"
362
+ end
363
+
364
+ r.on "c" do
365
+ r.hash_paths
366
+
367
+ "c"
368
+ end
369
+
370
+ "n"
371
+ end
372
+ end
373
+ end
374
+
375
+ it "adds support for routing via r.hash_paths" do
376
+ body.must_equal 'n'
377
+ body('/a').must_equal 'a'
378
+ body('/a', 'REQUEST_METHOD'=>'POST').must_equal 'ap'
379
+ body('/a/').must_equal 'n'
380
+ body('/b').must_equal 'b'
381
+ body('/b/').must_equal 'n'
382
+ body('/c').must_equal 'c'
383
+ body('/c/').must_equal 'c'
384
+ body('/c/b').must_equal 'cb'
385
+ body('/c/b/').must_equal 'c'
386
+ body('/p').must_equal 'p'
387
+ body('/p/x').must_equal 'px'
388
+ body('/p/x/1').must_equal 'p'
389
+ end
390
+
391
+ it "works when freezing the app" do
392
+ app.freeze
393
+ body.must_equal 'n'
394
+ body('/a').must_equal 'a'
395
+ body('/a/').must_equal 'n'
396
+ body('/p/x').must_equal 'px'
397
+ proc{app.hash_path("foo"){}}.must_raise
398
+ end
399
+
400
+ it "works when subclassing the app" do
401
+ old_app = app
402
+ @app = Class.new(app)
403
+ @app.route(&old_app.route_block)
404
+ body.must_equal 'n'
405
+ body('/a').must_equal 'a'
406
+ body('/a/').must_equal 'n'
407
+ body('/p/x').must_equal 'px'
408
+ end
409
+
410
+ it "handles loading the plugin multiple times correctly" do
411
+ app.plugin :hash_routes
412
+ body.must_equal 'n'
413
+ body('/a').must_equal 'a'
414
+ body('/a/').must_equal 'n'
415
+ body('/p/x').must_equal 'px'
416
+ end
417
+
418
+ it "r.hash_path handles loading the same route more than once" do
419
+ app.hash_path(:p, "x") do |r|
420
+ 'px'
421
+ end
422
+
423
+ body('/p').must_equal 'p'
424
+ body('/p/x').must_equal 'px'
425
+ end
426
+ end
427
+
428
+ describe "hash_routes plugin" do
429
+ it "should work with route_block_args" do
430
+ app(:bare) do
431
+ plugin :hash_routes
432
+ plugin :route_block_args do
433
+ [request, response]
434
+ end
435
+
436
+ hash_branch 'a' do |r, res|
437
+ r.hash_paths
438
+
439
+ res.write('a')
440
+ end
441
+
442
+ hash_path '/a', '/b' do |r, res|
443
+ res.write('b')
444
+ end
445
+
446
+ route do |r|
447
+ r.hash_branches
448
+
449
+ 'n'
450
+ end
451
+ end
452
+
453
+ body.must_equal 'n'
454
+ body('/a').must_equal 'a'
455
+ body('/a/').must_equal 'a'
456
+ body('/a/b').must_equal 'b'
457
+ body('/a/b/').must_equal 'a'
458
+ end
459
+
460
+ it "should have r.hash_routes dispatch to both hash_paths and hash_branches" do
461
+ app(:bare) do
462
+ plugin :hash_routes
463
+ plugin :route_block_args do
464
+ [request, response]
465
+ end
466
+
467
+ hash_branch 'a' do |r|
468
+ r.root do
469
+ 'ar'
470
+ end
471
+
472
+ 'ab'
473
+ end
474
+
475
+ hash_path '/a' do |_|
476
+ 'ap'
477
+ end
478
+
479
+ hash_branch 'b' do |_|
480
+ 'b'
481
+ end
482
+
483
+ hash_path '/c' do |_|
484
+ 'c'
485
+ end
486
+
487
+ route do |r|
488
+ r.hash_routes
489
+
490
+ 'n'
491
+ end
492
+ end
493
+
494
+ body.must_equal 'n'
495
+ body('/a').must_equal 'ap'
496
+ body('/a/').must_equal 'ar'
497
+ body('/a/b').must_equal 'ab'
498
+ body('/a').must_equal 'ap'
499
+ body('/b').must_equal 'b'
500
+ body('/b/').must_equal 'b'
501
+ body('/c').must_equal 'c'
502
+ body('/c/').must_equal 'n'
503
+ end
504
+ end
505
+
506
+ begin
507
+ require 'tilt/erb'
508
+ rescue LoadError
509
+ warn "tilt not installed, skipping hash_routes plugin views test"
510
+ else
511
+ describe "hash routes plugin" do
512
+ it "supports easy rendering of multiple views by name" do
513
+ app(:bare) do
514
+ plugin :render, :views=>'spec/views', :layout=>'layout-yield'
515
+ plugin :hash_routes
516
+
517
+ hash_routes '/d' do
518
+ view true, 'a'
519
+ view '', 'b'
520
+ views %w'c'
521
+ end
522
+
523
+ route do |r|
524
+ r.on 'd' do
525
+ r.hash_routes
526
+ end
527
+ end
528
+ end
529
+
530
+ body('/d').gsub(/\s+/, '').must_equal "HeaderaFooter"
531
+ body('/d/').gsub(/\s+/, '').must_equal "HeaderbFooter"
532
+ body('/d/c').gsub(/\s+/, '').must_equal "HeadercFooter"
533
+ end
534
+ end
535
+ end