2
import sys, time, unittest
5
from nose.tools import eq_
8
class TestGeneration(unittest.TestCase):
10
def test_all_static_no_reqs(self):
12
m.connect('hello/world')
14
assert '/hello/world' == m.generate()
16
def test_basic_dynamic(self):
17
for path in ['hi/:fred', 'hi/:(fred)']:
21
assert '/hi/index' == m.generate(fred='index')
22
assert '/hi/show' == m.generate(fred='show')
23
assert '/hi/list%20people' == m.generate(fred='list people')
24
assert None == m.generate()
26
def test_dynamic_with_default(self):
27
for path in ['hi/:action', 'hi/:(action)']:
31
assert '/hi' == m.generate(action='index')
32
assert '/hi/show' == m.generate(action='show')
33
assert '/hi/list%20people' == m.generate(action='list people')
34
assert '/hi' == m.generate()
36
def test_dynamic_with_false_equivs(self):
38
m.connect('article/:page', page=False)
39
m.connect(':controller/:action/:id')
41
assert '/blog/view/0' == m.generate(controller="blog", action="view", id="0")
42
assert '/blog/view/0' == m.generate(controller="blog", action="view", id=0)
43
assert '/blog/view/False' == m.generate(controller="blog", action="view", id=False)
44
assert '/blog/view/False' == m.generate(controller="blog", action="view", id='False')
45
assert '/blog/view' == m.generate(controller="blog", action="view", id=None)
46
assert '/blog/view' == m.generate(controller="blog", action="view", id='None')
47
assert '/article' == m.generate(page=None)
50
m.connect('view/:home/:area', home="austere", area=None)
52
assert '/view/sumatra' == m.generate(home='sumatra')
53
assert '/view/austere/chicago' == m.generate(area='chicago')
56
m.connect('view/:home/:area', home=None, area=None)
58
assert '/view/None/chicago' == m.generate(home=None, area='chicago')
60
def test_dynamic_with_underscore_parts(self):
62
m.connect('article/:small_page', small_page=False)
63
m.connect(':(controller)/:(action)/:(id)')
65
assert '/blog/view/0' == m.generate(controller="blog", action="view", id="0")
66
assert '/blog/view/False' == m.generate(controller="blog", action="view", id='False')
67
assert '/blog/view' == m.generate(controller="blog", action="view", id='None')
68
assert '/article' == m.generate(small_page=None)
69
assert '/article/hobbes' == m.generate(small_page='hobbes')
71
def test_dynamic_with_false_equivs_and_splits(self):
73
m.connect('article/:(page)', page=False)
74
m.connect(':(controller)/:(action)/:(id)')
76
assert '/blog/view/0' == m.generate(controller="blog", action="view", id="0")
77
assert '/blog/view/0' == m.generate(controller="blog", action="view", id=0)
78
assert '/blog/view/False' == m.generate(controller="blog", action="view", id=False)
79
assert '/blog/view/False' == m.generate(controller="blog", action="view", id='False')
80
assert '/blog/view' == m.generate(controller="blog", action="view", id=None)
81
assert '/blog/view' == m.generate(controller="blog", action="view", id='None')
82
assert '/article' == m.generate(page=None)
85
m.connect('view/:(home)/:(area)', home="austere", area=None)
87
assert '/view/sumatra' == m.generate(home='sumatra')
88
assert '/view/austere/chicago' == m.generate(area='chicago')
91
m.connect('view/:(home)/:(area)', home=None, area=None)
93
assert '/view/None/chicago' == m.generate(home=None, area='chicago')
95
def test_dynamic_with_regexp_condition(self):
96
for path in ['hi/:name', 'hi/:(name)']:
98
m.connect(path, requirements = {'name':'[a-z]+'})
100
assert '/hi/index' == m.generate(name='index')
101
assert None == m.generate(name='fox5')
102
assert None == m.generate(name='something_is_up')
103
assert '/hi/abunchofcharacter' == m.generate(name='abunchofcharacter')
104
assert None == m.generate()
106
def test_dynamic_with_default_and_regexp_condition(self):
107
for path in ['hi/:action', 'hi/:(action)']:
109
m.connect(path, requirements = {'action':'[a-z]+'})
111
assert '/hi' == m.generate(action='index')
112
assert None == m.generate(action='fox5')
113
assert None == m.generate(action='something_is_up')
114
assert None == m.generate(action='list people')
115
assert '/hi/abunchofcharacter' == m.generate(action='abunchofcharacter')
116
assert '/hi' == m.generate()
119
for path in ['hi/*file', 'hi/*(file)']:
123
assert '/hi' == m.generate(file=None)
124
assert '/hi/books/learning_python.pdf' == m.generate(file='books/learning_python.pdf')
125
assert '/hi/books/development%26whatever/learning_python.pdf' == m.generate(file='books/development&whatever/learning_python.pdf')
127
def test_path_backwards(self):
128
for path in ['*file/hi', '*(file)/hi']:
132
assert '/hi' == m.generate(file=None)
133
assert '/books/learning_python.pdf/hi' == m.generate(file='books/learning_python.pdf')
134
assert '/books/development%26whatever/learning_python.pdf/hi' == m.generate(file='books/development&whatever/learning_python.pdf')
136
def test_controller(self):
137
for path in ['hi/:controller', 'hi/:(controller)']:
141
assert '/hi/content' == m.generate(controller='content')
142
assert '/hi/admin/user' == m.generate(controller='admin/user')
144
def test_controller_with_static(self):
145
for path in ['hi/:controller', 'hi/:(controller)']:
148
m.connect('google', 'http://www.google.com', _static=True)
150
assert '/hi/content' == m.generate(controller='content')
151
assert '/hi/admin/user' == m.generate(controller='admin/user')
152
assert 'http://www.google.com' == url_for('google')
154
def test_standard_route(self):
155
for path in [':controller/:action/:id', ':(controller)/:(action)/:(id)']:
159
assert '/content' == m.generate(controller='content', action='index')
160
assert '/content/list' == m.generate(controller='content', action='list')
161
assert '/content/show/10' == m.generate(controller='content', action='show', id ='10')
163
assert '/admin/user' == m.generate(controller='admin/user', action='index')
164
assert '/admin/user/list' == m.generate(controller='admin/user', action='list')
165
assert '/admin/user/show/10' == m.generate(controller='admin/user', action='show', id='10')
167
def test_multiroute(self):
169
m.connect('archive/:year/:month/:day', controller='blog', action='view', month=None, day=None,
170
requirements={'month':'\d{1,2}','day':'\d{1,2}'})
171
m.connect('viewpost/:id', controller='post', action='view')
172
m.connect(':controller/:action/:id')
174
assert '/blog/view?year=2004&month=blah' == m.generate(controller='blog', action='view', year=2004, month='blah')
175
assert '/archive/2004/11' == m.generate(controller='blog', action='view', year=2004, month=11)
176
assert '/archive/2004/11' == m.generate(controller='blog', action='view', year=2004, month='11')
177
assert '/archive/2004' == m.generate(controller='blog', action='view', year=2004)
178
assert '/viewpost/3' == m.generate(controller='post', action='view', id=3)
180
def test_multiroute_with_splits(self):
182
m.connect('archive/:(year)/:(month)/:(day)', controller='blog', action='view', month=None, day=None,
183
requirements={'month':'\d{1,2}','day':'\d{1,2}'})
184
m.connect('viewpost/:(id)', controller='post', action='view')
185
m.connect(':(controller)/:(action)/:(id)')
187
assert '/blog/view?year=2004&month=blah' == m.generate(controller='blog', action='view', year=2004, month='blah')
188
assert '/archive/2004/11' == m.generate(controller='blog', action='view', year=2004, month=11)
189
assert '/archive/2004/11' == m.generate(controller='blog', action='view', year=2004, month='11')
190
assert '/archive/2004' == m.generate(controller='blog', action='view', year=2004)
191
assert '/viewpost/3' == m.generate(controller='post', action='view', id=3)
193
def test_big_multiroute(self):
195
m.connect('', controller='articles', action='index')
196
m.connect('admin', controller='admin/general', action='index')
198
m.connect('admin/comments/article/:article_id/:action/:id', controller = 'admin/comments', action=None, id=None)
199
m.connect('admin/trackback/article/:article_id/:action/:id', controller='admin/trackback', action=None, id=None)
200
m.connect('admin/content/:action/:id', controller='admin/content')
202
m.connect('xml/:action/feed.xml', controller='xml')
203
m.connect('xml/articlerss/:id/feed.xml', controller='xml', action='articlerss')
204
m.connect('index.rdf', controller='xml', action='rss')
206
m.connect('articles', controller='articles', action='index')
207
m.connect('articles/page/:page', controller='articles', action='index', requirements = {'page':'\d+'})
209
m.connect('articles/:year/:month/:day/page/:page', controller='articles', action='find_by_date', month = None, day = None,
210
requirements = {'year':'\d{4}', 'month':'\d{1,2}','day':'\d{1,2}'})
211
m.connect('articles/category/:id', controller='articles', action='category')
212
m.connect('pages/*name', controller='articles', action='view_page')
215
assert '/pages/the/idiot/has/spoken' == m.generate(controller='articles', action='view_page',
216
name='the/idiot/has/spoken')
217
assert '/' == m.generate(controller='articles', action='index')
218
assert '/xml/articlerss/4/feed.xml' == m.generate(controller='xml', action='articlerss', id=4)
219
assert '/xml/rss/feed.xml' == m.generate(controller='xml', action='rss')
220
assert '/admin/comments/article/4/view/2' == m.generate(controller='admin/comments', action='view', article_id=4, id=2)
221
assert '/admin' == m.generate(controller='admin/general')
222
assert '/admin/comments/article/4/index' == m.generate(controller='admin/comments', article_id=4)
223
assert '/admin/comments/article/4' == m.generate(controller='admin/comments', action=None, article_id=4)
224
assert '/articles/2004/2/20/page/1' == m.generate(controller='articles', action='find_by_date',
225
year=2004, month=2, day=20, page=1)
226
assert '/articles/category' == m.generate(controller='articles', action='category')
227
assert '/xml/index/feed.xml' == m.generate(controller='xml')
228
assert '/xml/articlerss/feed.xml' == m.generate(controller='xml', action='articlerss')
230
assert None == m.generate(controller='admin/comments', id=2)
231
assert None == m.generate(controller='articles', action='find_by_date', year=2004)
233
def test_big_multiroute_with_splits(self):
235
m.connect('', controller='articles', action='index')
236
m.connect('admin', controller='admin/general', action='index')
238
m.connect('admin/comments/article/:(article_id)/:(action)/:(id).html', controller = 'admin/comments', action=None, id=None)
239
m.connect('admin/trackback/article/:(article_id)/:action/:(id).html', controller='admin/trackback', action=None, id=None)
240
m.connect('admin/content/:(action)/:(id)', controller='admin/content')
242
m.connect('xml/:(action)/feed.xml', controller='xml')
243
m.connect('xml/articlerss/:(id)/feed.xml', controller='xml', action='articlerss')
244
m.connect('index.rdf', controller='xml', action='rss')
246
m.connect('articles', controller='articles', action='index')
247
m.connect('articles/page/:(page).myt', controller='articles', action='index', requirements = {'page':'\d+'})
249
m.connect('articles/:(year)/:month/:(day)/page/:page', controller='articles', action='find_by_date', month = None, day = None,
250
requirements = {'year':'\d{4}', 'month':'\d{1,2}','day':'\d{1,2}'})
251
m.connect('articles/category/:id', controller='articles', action='category')
252
m.connect('pages/*name', controller='articles', action='view_page')
255
assert '/pages/the/idiot/has/spoken' == m.generate(controller='articles', action='view_page',
256
name='the/idiot/has/spoken')
257
assert '/' == m.generate(controller='articles', action='index')
258
assert '/xml/articlerss/4/feed.xml' == m.generate(controller='xml', action='articlerss', id=4)
259
assert '/xml/rss/feed.xml' == m.generate(controller='xml', action='rss')
260
assert '/admin/comments/article/4/view/2.html' == m.generate(controller='admin/comments', action='view', article_id=4, id=2)
261
assert '/admin' == m.generate(controller='admin/general')
262
assert '/admin/comments/article/4/edit/3.html' == m.generate(controller='admin/comments', article_id=4, action='edit', id=3)
263
assert None == m.generate(controller='admin/comments', action=None, article_id=4)
264
assert '/articles/2004/2/20/page/1' == m.generate(controller='articles', action='find_by_date',
265
year=2004, month=2, day=20, page=1)
266
assert '/articles/category' == m.generate(controller='articles', action='category')
267
assert '/xml/index/feed.xml' == m.generate(controller='xml')
268
assert '/xml/articlerss/feed.xml' == m.generate(controller='xml', action='articlerss')
270
assert None == m.generate(controller='admin/comments', id=2)
271
assert None == m.generate(controller='articles', action='find_by_date', year=2004)
273
def test_big_multiroute_with_nomin(self):
275
m.minimization = False
276
m.connect('', controller='articles', action='index')
277
m.connect('admin', controller='admin/general', action='index')
279
m.connect('admin/comments/article/:article_id/:action/:id', controller = 'admin/comments', action=None, id=None)
280
m.connect('admin/trackback/article/:article_id/:action/:id', controller='admin/trackback', action=None, id=None)
281
m.connect('admin/content/:action/:id', controller='admin/content')
283
m.connect('xml/:action/feed.xml', controller='xml')
284
m.connect('xml/articlerss/:id/feed.xml', controller='xml', action='articlerss')
285
m.connect('index.rdf', controller='xml', action='rss')
287
m.connect('articles', controller='articles', action='index')
288
m.connect('articles/page/:page', controller='articles', action='index', requirements = {'page':'\d+'})
290
m.connect('articles/:year/:month/:day/page/:page', controller='articles', action='find_by_date', month = None, day = None,
291
requirements = {'year':'\d{4}', 'month':'\d{1,2}','day':'\d{1,2}'})
292
m.connect('articles/category/:id', controller='articles', action='category')
293
m.connect('pages/*name', controller='articles', action='view_page')
296
assert '/pages/the/idiot/has/spoken' == m.generate(controller='articles', action='view_page',
297
name='the/idiot/has/spoken')
298
assert '/' == m.generate(controller='articles', action='index')
299
assert '/xml/articlerss/4/feed.xml' == m.generate(controller='xml', action='articlerss', id=4)
300
assert '/xml/rss/feed.xml' == m.generate(controller='xml', action='rss')
301
assert '/admin/comments/article/4/view/2' == m.generate(controller='admin/comments', action='view', article_id=4, id=2)
302
assert '/admin' == m.generate(controller='admin/general')
303
assert '/articles/2004/2/20/page/1' == m.generate(controller='articles', action='find_by_date',
304
year=2004, month=2, day=20, page=1)
305
assert None == m.generate(controller='articles', action='category')
306
assert '/articles/category/4' == m.generate(controller='articles', action='category', id=4)
307
assert '/xml/index/feed.xml' == m.generate(controller='xml')
308
assert '/xml/articlerss/feed.xml' == m.generate(controller='xml', action='articlerss')
310
assert None == m.generate(controller='admin/comments', id=2)
311
assert None == m.generate(controller='articles', action='find_by_date', year=2004)
313
def test_no_extras(self):
315
m.connect(':controller/:action/:id')
316
m.connect('archive/:year/:month/:day', controller='blog', action='view', month=None, day=None)
318
assert '/archive/2004' == m.generate(controller='blog', action='view', year=2004)
320
def test_no_extras_with_splits(self):
322
m.connect(':(controller)/:(action)/:(id)')
323
m.connect('archive/:(year)/:(month)/:(day)', controller='blog', action='view', month=None, day=None)
325
assert '/archive/2004' == m.generate(controller='blog', action='view', year=2004)
327
def test_the_smallest_route(self):
328
for path in ['pages/:title', 'pages/:(title)']:
330
m.connect('', controller='page', action='view', title='HomePage')
331
m.connect(path, controller='page', action='view')
333
assert '/' == m.generate(controller='page', action='view', title='HomePage')
334
assert '/pages/joe' == m.generate(controller='page', action='view', title='joe')
336
def test_extras(self):
338
m.connect('viewpost/:id', controller='post', action='view')
339
m.connect(':controller/:action/:id')
341
assert '/viewpost/2?extra=x%2Fy' == m.generate(controller='post', action='view', id=2, extra='x/y')
342
assert '/blog?extra=3' == m.generate(controller='blog', action='index', extra=3)
343
assert '/viewpost/2?extra=3' == m.generate(controller='post', action='view', id=2, extra=3)
345
def test_extras_with_splits(self):
347
m.connect('viewpost/:(id)', controller='post', action='view')
348
m.connect(':(controller)/:(action)/:(id)')
350
assert '/blog?extra=3' == m.generate(controller='blog', action='index', extra=3)
351
assert '/viewpost/2?extra=3' == m.generate(controller='post', action='view', id=2, extra=3)
353
def test_static(self):
355
m.connect('hello/world',known='known_value',controller='content',action='index')
357
assert '/hello/world' == m.generate(controller='content',action= 'index',known ='known_value')
358
assert '/hello/world?extra=hi' == m.generate(controller='content',action='index',known='known_value',extra='hi')
360
assert None == m.generate(known='foo')
362
def test_typical(self):
363
for path in [':controller/:action/:id', ':(controller)/:(action)/:(id)']:
365
m.connect(path, action = 'index', id = None)
367
assert '/content' == m.generate(controller='content', action='index')
368
assert '/content/list' == m.generate(controller='content', action='list')
369
assert '/content/show/10' == m.generate(controller='content', action='show', id=10)
371
assert '/admin/user' == m.generate(controller='admin/user', action='index')
372
assert '/admin/user' == m.generate(controller='admin/user')
373
assert '/admin/user/show/10' == m.generate(controller='admin/user', action='show', id=10)
375
assert '/content' == m.generate(controller='content')
377
def test_route_with_fixnum_default(self):
379
m.connect('page/:id', controller='content', action='show_page', id =1)
380
m.connect(':controller/:action/:id')
382
assert '/page' == m.generate(controller='content', action='show_page')
383
assert '/page' == m.generate(controller='content', action='show_page', id=1)
384
assert '/page' == m.generate(controller='content', action='show_page', id='1')
385
assert '/page/10' == m.generate(controller='content', action='show_page', id=10)
387
assert '/blog/show/4' == m.generate(controller='blog', action='show', id=4)
388
assert '/page' == m.generate(controller='content', action='show_page')
389
assert '/page/4' == m.generate(controller='content', action='show_page',id=4)
390
assert '/content/show' == m.generate(controller='content', action='show')
392
def test_route_with_fixnum_default_with_splits(self):
394
m.connect('page/:(id)', controller='content', action='show_page', id =1)
395
m.connect(':(controller)/:(action)/:(id)')
397
assert '/page' == m.generate(controller='content', action='show_page')
398
assert '/page' == m.generate(controller='content', action='show_page', id=1)
399
assert '/page' == m.generate(controller='content', action='show_page', id='1')
400
assert '/page/10' == m.generate(controller='content', action='show_page', id=10)
402
assert '/blog/show/4' == m.generate(controller='blog', action='show', id=4)
403
assert '/page' == m.generate(controller='content', action='show_page')
404
assert '/page/4' == m.generate(controller='content', action='show_page',id=4)
405
assert '/content/show' == m.generate(controller='content', action='show')
407
def test_uppercase_recognition(self):
408
for path in [':controller/:action/:id', ':(controller)/:(action)/:(id)']:
412
assert '/Content' == m.generate(controller='Content', action='index')
413
assert '/Content/list' == m.generate(controller='Content', action='list')
414
assert '/Content/show/10' == m.generate(controller='Content', action='show', id='10')
416
assert '/Admin/NewsFeed' == m.generate(controller='Admin/NewsFeed', action='index')
418
def test_backwards(self):
420
m.connect('page/:id/:action', controller='pages', action='show')
421
m.connect(':controller/:action/:id')
423
assert '/page/20' == m.generate(controller='pages', action='show', id=20)
424
assert '/pages/boo' == m.generate(controller='pages', action='boo')
426
def test_backwards_with_splits(self):
428
m.connect('page/:(id)/:(action)', controller='pages', action='show')
429
m.connect(':(controller)/:(action)/:(id)')
431
assert '/page/20' == m.generate(controller='pages', action='show', id=20)
432
assert '/pages/boo' == m.generate(controller='pages', action='boo')
434
def test_both_requirement_and_optional(self):
436
m.connect('test/:year', controller='post', action='show', year=None, requirements = {'year':'\d{4}'})
438
assert '/test' == m.generate(controller='post', action='show')
439
assert '/test' == m.generate(controller='post', action='show', year=None)
441
def test_set_to_nil_forgets(self):
443
m.connect('pages/:year/:month/:day', controller='content', action='list_pages', month=None, day=None)
444
m.connect(':controller/:action/:id')
446
assert '/pages/2005' == m.generate(controller='content', action='list_pages', year=2005)
447
assert '/pages/2005/6' == m.generate(controller='content', action='list_pages', year=2005, month=6)
448
assert '/pages/2005/6/12' == m.generate(controller='content', action='list_pages', year=2005, month=6, day=12)
450
def test_url_with_no_action_specified(self):
452
m.connect('', controller='content')
453
m.connect(':controller/:action/:id')
455
assert '/' == m.generate(controller='content', action='index')
456
assert '/' == m.generate(controller='content')
458
def test_url_with_prefix(self):
461
m.connect(':controller/:action/:id')
462
m.create_regs(['content','blog','admin/comments'])
464
assert '/blog/content/view' == m.generate(controller='content', action='view')
465
assert '/blog/content' == m.generate(controller='content')
466
assert '/blog/admin/comments' == m.generate(controller='admin/comments')
468
def test_url_with_prefix_deeper(self):
470
m.prefix = '/blog/phil'
471
m.connect(':controller/:action/:id')
472
m.create_regs(['content','blog','admin/comments'])
474
assert '/blog/phil/content/view' == m.generate(controller='content', action='view')
475
assert '/blog/phil/content' == m.generate(controller='content')
476
assert '/blog/phil/admin/comments' == m.generate(controller='admin/comments')
478
def test_url_with_environ_empty(self):
480
m.environ = dict(SCRIPT_NAME='')
481
m.connect(':controller/:action/:id')
482
m.create_regs(['content','blog','admin/comments'])
484
assert '/content/view' == m.generate(controller='content', action='view')
485
assert '/content' == m.generate(controller='content')
486
assert '/admin/comments' == m.generate(controller='admin/comments')
488
def test_url_with_environ(self):
490
m.environ = dict(SCRIPT_NAME='/blog')
491
m.connect(':controller/:action/:id')
492
m.create_regs(['content','blog','admin/comments'])
494
assert '/blog/content/view' == m.generate(controller='content', action='view')
495
assert '/blog/content' == m.generate(controller='content')
496
assert '/blog/content' == m.generate(controller='content')
497
assert '/blog/admin/comments' == m.generate(controller='admin/comments')
499
m.environ = dict(SCRIPT_NAME='/notblog')
501
assert '/notblog/content/view' == m.generate(controller='content', action='view')
502
assert '/notblog/content' == m.generate(controller='content')
503
assert '/notblog/content' == m.generate(controller='content')
504
assert '/notblog/admin/comments' == m.generate(controller='admin/comments')
507
def test_url_with_environ_and_absolute(self):
509
m.environ = dict(SCRIPT_NAME='/blog')
510
m.connect('image', 'image/:name', _absolute=True)
511
m.connect(':controller/:action/:id')
512
m.create_regs(['content','blog','admin/comments'])
514
assert '/blog/content/view' == m.generate(controller='content', action='view')
515
assert '/blog/content' == m.generate(controller='content')
516
assert '/blog/content' == m.generate(controller='content')
517
assert '/blog/admin/comments' == m.generate(controller='admin/comments')
518
assert '/image/topnav.jpg' == url_for('image', name='topnav.jpg')
520
def test_route_with_odd_leftovers(self):
522
m.connect(':controller/:(action)-:(id)')
523
m.create_regs(['content','blog','admin/comments'])
525
assert '/content/view-' == m.generate(controller='content', action='view')
526
assert '/content/index-' == m.generate(controller='content')
528
def test_route_with_end_extension(self):
530
m.connect(':controller/:(action)-:(id).html')
531
m.create_regs(['content','blog','admin/comments'])
533
assert None == m.generate(controller='content', action='view')
534
assert None == m.generate(controller='content')
536
assert '/content/view-3.html' == m.generate(controller='content', action='view', id=3)
537
assert '/content/index-2.html' == m.generate(controller='content', id=2)
539
def _assert_restful_routes(self, m, options, path_prefix=''):
540
baseroute = '/' + path_prefix + options['controller']
541
assert baseroute == m.generate(action='index', **options)
542
assert baseroute + '.xml' == m.generate(action='index', format='xml', **options)
543
assert baseroute + '/new' == m.generate(action='new', **options)
544
assert baseroute + '/1' == m.generate(action='show', id='1', **options)
545
assert baseroute + '/1/edit' == m.generate(action='edit',id='1', **options)
546
assert baseroute + '/1.xml' == m.generate(action='show', id='1',format='xml', **options)
548
assert baseroute == m.generate(action='create', method='post', **options)
549
assert baseroute + '/1' == m.generate(action='update', method='put', id='1', **options)
550
assert baseroute + '/1' == m.generate(action='delete', method='delete', id='1', **options)
552
def test_resources(self):
554
m.resource('message', 'messages')
555
m.create_regs(['messages'])
556
options = dict(controller='messages')
557
assert '/messages' == url_for('messages')
558
assert '/messages.xml' == url_for('formatted_messages', format='xml')
559
assert '/messages/1' == url_for('message', id=1)
560
assert '/messages/1.xml' == url_for('formatted_message', id=1, format='xml')
561
assert '/messages/new' == url_for('new_message')
562
assert '/messages/1.xml' == url_for('formatted_message', id=1, format='xml')
563
assert '/messages/1/edit' == url_for('edit_message', id=1)
564
assert '/messages/1/edit.xml' == url_for('formatted_edit_message', id=1, format='xml')
565
self._assert_restful_routes(m, options)
567
def test_resources_with_path_prefix(self):
569
m.resource('message', 'messages', path_prefix='/thread/:threadid')
570
m.create_regs(['messages'])
571
options = dict(controller='messages', threadid='5')
572
self._assert_restful_routes(m, options, path_prefix='thread/5/')
574
def test_resources_with_collection_action(self):
576
m.resource('message', 'messages', collection=dict(rss='GET'))
577
m.create_regs(['messages'])
578
options = dict(controller='messages')
579
self._assert_restful_routes(m, options)
580
assert '/messages/rss' == m.generate(controller='messages', action='rss')
581
assert '/messages/rss' == url_for('rss_messages')
582
assert '/messages/rss.xml' == m.generate(controller='messages', action='rss', format='xml')
583
assert '/messages/rss.xml' == url_for('formatted_rss_messages', format='xml')
585
def test_resources_with_member_action(self):
586
for method in ['put', 'post']:
588
m.resource('message', 'messages', member=dict(mark=method))
589
m.create_regs(['messages'])
590
options = dict(controller='messages')
591
self._assert_restful_routes(m, options)
592
assert '/messages/1/mark' == m.generate(method=method, action='mark', id='1', **options)
593
assert '/messages/1/mark.xml' == m.generate(method=method, action='mark', id='1', format='xml', **options)
595
def test_resources_with_new_action(self):
597
m.resource('message', 'messages/', new=dict(preview='POST'))
598
m.create_regs(['messages'])
599
options = dict(controller='messages')
600
self._assert_restful_routes(m, options)
601
assert '/messages/new/preview' == m.generate(controller='messages', action='preview', method='post')
602
assert '/messages/new/preview' == url_for('preview_new_message')
603
assert '/messages/new/preview.xml' == m.generate(controller='messages', action='preview', method='post', format='xml')
604
assert '/messages/new/preview.xml' == url_for('formatted_preview_new_message', format='xml')
606
def test_resources_with_name_prefix(self):
608
m.resource('message', 'messages', name_prefix='category_', new=dict(preview='POST'))
609
m.create_regs(['messages'])
610
options = dict(controller='messages')
611
self._assert_restful_routes(m, options)
612
assert '/messages/new/preview' == url_for('category_preview_new_message')
613
self.assertRaises(Exception, url_for, 'category_preview_new_message', method='get')
615
def test_unicode(self):
616
hoge = u'\u30c6\u30b9\u30c8' # the word test in Japanese
617
hoge_enc = urllib.quote(hoge.encode('utf-8'))
620
self.assertEqual("/%s" % hoge_enc, m.generate(hoge=hoge))
621
self.assert_(isinstance(m.generate(hoge=hoge), str))
623
def test_unicode_static(self):
624
hoge = u'\u30c6\u30b9\u30c8' # the word test in Japanese
625
hoge_enc = urllib.quote(hoge.encode('utf-8'))
627
m.connect('google-jp', 'http://www.google.co.jp/search', _static=True)
628
self.assertEqual("http://www.google.co.jp/search?q=" + hoge_enc,
629
url_for('google-jp', q=hoge))
630
self.assert_(isinstance(url_for('google-jp', q=hoge), str))
632
def test_other_special_chars(self):
634
m.connect('/:year/:(slug).:(format),:(locale)', locale='en', format='html')
635
m.create_regs(['content'])
637
assert '/2007/test' == m.generate(year=2007, slug='test')
638
assert '/2007/test.xml' == m.generate(year=2007, slug='test', format='xml')
639
assert '/2007/test.xml,ja' == m.generate(year=2007, slug='test', format='xml', locale='ja')
640
assert None == m.generate(year=2007, format='html')
642
if __name__ == '__main__':
645
def bench_gen(withcache = False):
647
m.connect('', controller='articles', action='index')
648
m.connect('admin', controller='admin/general', action='index')
650
m.connect('admin/comments/article/:article_id/:action/:id', controller = 'admin/comments', action = None, id=None)
651
m.connect('admin/trackback/article/:article_id/:action/:id', controller='admin/trackback', action=None, id=None)
652
m.connect('admin/content/:action/:id', controller='admin/content')
654
m.connect('xml/:action/feed.xml', controller='xml')
655
m.connect('xml/articlerss/:id/feed.xml', controller='xml', action='articlerss')
656
m.connect('index.rdf', controller='xml', action='rss')
658
m.connect('articles', controller='articles', action='index')
659
m.connect('articles/page/:page', controller='articles', action='index', requirements = {'page':'\d+'})
661
m.connect('articles/:year/:month/:day/page/:page', controller='articles', action='find_by_date', month = None, day = None,
662
requirements = {'year':'\d{4}', 'month':'\d{1,2}','day':'\d{1,2}'})
663
m.connect('articles/category/:id', controller='articles', action='category')
664
m.connect('pages/*name', controller='articles', action='view_page')
671
m.generate(controller='articles', action='index', page=4)
672
m.generate(controller='admin/general', action='index')
673
m.generate(controller='admin/comments', action='show', article_id=2)
675
m.generate(controller='articles', action='find_by_date', year=2004, page=1)
676
m.generate(controller='articles', action='category', id=4)
677
m.generate(controller='xml', action='articlerss', id=2)
680
for x in range(1,n*6):
683
total = end-start-(en-ts)
684
per_url = total / (n*6)
685
print "Generation (%s URLs)" % (n*6)
686
print "%s ms/url" % (per_url*1000)
687
print "%s urls/s\n" % (1.00/per_url)