~j5-dev/+junk/routes-1.10.3

« back to all changes in this revision

Viewing changes to tests/test_functional/test_generation.py

  • Committer: Bazaar Package Importer
  • Author(s): Piotr Ożarowski
  • Date: 2009-02-16 20:27:07 UTC
  • mfrom: (1.1.12 upstream) (6.1.2 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090216202707-755smauitbc569xd
Tags: 1.10.3-2
Add python-webob to Recommends (closes: #515548)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
"""test_generation"""
2
 
import sys, time, unittest
3
 
import urllib
4
 
 
5
 
from nose.tools import eq_
6
 
from routes import *
7
 
 
8
 
class TestGeneration(unittest.TestCase):
9
 
    
10
 
    def test_all_static_no_reqs(self):
11
 
        m = Mapper()
12
 
        m.connect('hello/world')
13
 
        
14
 
        assert '/hello/world' == m.generate()
15
 
    
16
 
    def test_basic_dynamic(self):
17
 
        for path in ['hi/:fred', 'hi/:(fred)']:
18
 
            m = Mapper()
19
 
            m.connect(path)
20
 
        
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()
25
 
    
26
 
    def test_dynamic_with_default(self):
27
 
        for path in ['hi/:action', 'hi/:(action)']:
28
 
            m = Mapper()
29
 
            m.connect(path)
30
 
        
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()
35
 
    
36
 
    def test_dynamic_with_false_equivs(self):
37
 
        m = Mapper()
38
 
        m.connect('article/:page', page=False)
39
 
        m.connect(':controller/:action/:id')
40
 
        
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)
48
 
        
49
 
        m = Mapper()
50
 
        m.connect('view/:home/:area', home="austere", area=None)
51
 
        
52
 
        assert '/view/sumatra' == m.generate(home='sumatra')
53
 
        assert '/view/austere/chicago' == m.generate(area='chicago')
54
 
        
55
 
        m = Mapper()
56
 
        m.connect('view/:home/:area', home=None, area=None)
57
 
        
58
 
        assert '/view/None/chicago' == m.generate(home=None, area='chicago')
59
 
    
60
 
    def test_dynamic_with_underscore_parts(self):
61
 
        m = Mapper()
62
 
        m.connect('article/:small_page', small_page=False)
63
 
        m.connect(':(controller)/:(action)/:(id)')
64
 
        
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')
70
 
        
71
 
    def test_dynamic_with_false_equivs_and_splits(self):
72
 
        m = Mapper()
73
 
        m.connect('article/:(page)', page=False)
74
 
        m.connect(':(controller)/:(action)/:(id)')
75
 
        
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)
83
 
        
84
 
        m = Mapper()
85
 
        m.connect('view/:(home)/:(area)', home="austere", area=None)
86
 
        
87
 
        assert '/view/sumatra' == m.generate(home='sumatra')
88
 
        assert '/view/austere/chicago' == m.generate(area='chicago')
89
 
        
90
 
        m = Mapper()
91
 
        m.connect('view/:(home)/:(area)', home=None, area=None)
92
 
        
93
 
        assert '/view/None/chicago' == m.generate(home=None, area='chicago')
94
 
 
95
 
    def test_dynamic_with_regexp_condition(self):
96
 
        for path in ['hi/:name', 'hi/:(name)']:
97
 
            m = Mapper()
98
 
            m.connect(path, requirements = {'name':'[a-z]+'})
99
 
        
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()
105
 
    
106
 
    def test_dynamic_with_default_and_regexp_condition(self):
107
 
        for path in ['hi/:action', 'hi/:(action)']:
108
 
            m = Mapper()
109
 
            m.connect(path, requirements = {'action':'[a-z]+'})
110
 
        
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()
117
 
    
118
 
    def test_path(self):
119
 
        for path in ['hi/*file', 'hi/*(file)']:
120
 
            m = Mapper()
121
 
            m.connect(path)
122
 
        
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')
126
 
    
127
 
    def test_path_backwards(self):
128
 
        for path in ['*file/hi', '*(file)/hi']:
129
 
            m = Mapper()
130
 
            m.connect(path)
131
 
 
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')
135
 
    
136
 
    def test_controller(self):
137
 
        for path in ['hi/:controller', 'hi/:(controller)']:
138
 
            m = Mapper()
139
 
            m.connect(path)
140
 
        
141
 
            assert '/hi/content' == m.generate(controller='content')
142
 
            assert '/hi/admin/user' == m.generate(controller='admin/user')
143
 
    
144
 
    def test_controller_with_static(self):
145
 
        for path in ['hi/:controller', 'hi/:(controller)']:
146
 
            m = Mapper()
147
 
            m.connect(path)
148
 
            m.connect('google', 'http://www.google.com', _static=True)
149
 
        
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')
153
 
    
154
 
    def test_standard_route(self):
155
 
        for path in [':controller/:action/:id', ':(controller)/:(action)/:(id)']:
156
 
            m = Mapper()
157
 
            m.connect(path)
158
 
        
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')
162
 
        
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')
166
 
    
167
 
    def test_multiroute(self):
168
 
        m = Mapper()
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')
173
 
        
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)
179
 
    
180
 
    def test_multiroute_with_splits(self):
181
 
        m = Mapper()
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)')
186
 
        
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)
192
 
    
193
 
    def test_big_multiroute(self):
194
 
        m = Mapper()
195
 
        m.connect('', controller='articles', action='index')
196
 
        m.connect('admin', controller='admin/general', action='index')
197
 
 
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')
201
 
 
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')
205
 
 
206
 
        m.connect('articles', controller='articles', action='index')
207
 
        m.connect('articles/page/:page', controller='articles', action='index', requirements = {'page':'\d+'})
208
 
 
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')
213
 
        
214
 
        
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')
229
 
        
230
 
        assert None == m.generate(controller='admin/comments', id=2)
231
 
        assert None == m.generate(controller='articles', action='find_by_date', year=2004)
232
 
    
233
 
    def test_big_multiroute_with_splits(self):
234
 
        m = Mapper()
235
 
        m.connect('', controller='articles', action='index')
236
 
        m.connect('admin', controller='admin/general', action='index')
237
 
 
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')
241
 
 
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')
245
 
 
246
 
        m.connect('articles', controller='articles', action='index')
247
 
        m.connect('articles/page/:(page).myt', controller='articles', action='index', requirements = {'page':'\d+'})
248
 
 
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')
253
 
        
254
 
        
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')
269
 
        
270
 
        assert None == m.generate(controller='admin/comments', id=2)
271
 
        assert None == m.generate(controller='articles', action='find_by_date', year=2004)
272
 
 
273
 
    def test_big_multiroute_with_nomin(self):
274
 
        m = Mapper()
275
 
        m.minimization = False
276
 
        m.connect('', controller='articles', action='index')
277
 
        m.connect('admin', controller='admin/general', action='index')
278
 
 
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')
282
 
 
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')
286
 
 
287
 
        m.connect('articles', controller='articles', action='index')
288
 
        m.connect('articles/page/:page', controller='articles', action='index', requirements = {'page':'\d+'})
289
 
 
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')
294
 
        
295
 
        
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')
309
 
        
310
 
        assert None == m.generate(controller='admin/comments', id=2)
311
 
        assert None == m.generate(controller='articles', action='find_by_date', year=2004)
312
 
 
313
 
    def test_no_extras(self):
314
 
        m = Mapper()
315
 
        m.connect(':controller/:action/:id')
316
 
        m.connect('archive/:year/:month/:day', controller='blog', action='view', month=None, day=None)
317
 
        
318
 
        assert '/archive/2004' == m.generate(controller='blog', action='view', year=2004)
319
 
    
320
 
    def test_no_extras_with_splits(self):
321
 
        m = Mapper()
322
 
        m.connect(':(controller)/:(action)/:(id)')
323
 
        m.connect('archive/:(year)/:(month)/:(day)', controller='blog', action='view', month=None, day=None)
324
 
        
325
 
        assert '/archive/2004' == m.generate(controller='blog', action='view', year=2004)
326
 
    
327
 
    def test_the_smallest_route(self):
328
 
        for path in ['pages/:title', 'pages/:(title)']:
329
 
            m = Mapper()
330
 
            m.connect('', controller='page', action='view', title='HomePage')
331
 
            m.connect(path, controller='page', action='view')
332
 
        
333
 
            assert '/' == m.generate(controller='page', action='view', title='HomePage')
334
 
            assert '/pages/joe' == m.generate(controller='page', action='view', title='joe')
335
 
    
336
 
    def test_extras(self):
337
 
        m = Mapper()
338
 
        m.connect('viewpost/:id', controller='post', action='view')
339
 
        m.connect(':controller/:action/:id')
340
 
        
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)
344
 
    
345
 
    def test_extras_with_splits(self):
346
 
        m = Mapper()
347
 
        m.connect('viewpost/:(id)', controller='post', action='view')
348
 
        m.connect(':(controller)/:(action)/:(id)')
349
 
        
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)
352
 
    
353
 
    def test_static(self):
354
 
        m = Mapper()
355
 
        m.connect('hello/world',known='known_value',controller='content',action='index')
356
 
        
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')
359
 
        
360
 
        assert None == m.generate(known='foo')
361
 
    
362
 
    def test_typical(self):
363
 
        for path in [':controller/:action/:id', ':(controller)/:(action)/:(id)']:
364
 
            m = Mapper()
365
 
            m.connect(path, action = 'index', id = None)
366
 
        
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)
370
 
        
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)
374
 
        
375
 
            assert '/content' == m.generate(controller='content')
376
 
    
377
 
    def test_route_with_fixnum_default(self):
378
 
        m = Mapper()
379
 
        m.connect('page/:id', controller='content', action='show_page', id =1)
380
 
        m.connect(':controller/:action/:id')
381
 
        
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)
386
 
        
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')
391
 
    
392
 
    def test_route_with_fixnum_default_with_splits(self):
393
 
        m = Mapper()
394
 
        m.connect('page/:(id)', controller='content', action='show_page', id =1)
395
 
        m.connect(':(controller)/:(action)/:(id)')
396
 
        
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)
401
 
        
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')
406
 
    
407
 
    def test_uppercase_recognition(self):
408
 
        for path in [':controller/:action/:id', ':(controller)/:(action)/:(id)']:
409
 
            m = Mapper()
410
 
            m.connect(path)
411
 
 
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')
415
 
 
416
 
            assert '/Admin/NewsFeed' == m.generate(controller='Admin/NewsFeed', action='index')
417
 
    
418
 
    def test_backwards(self):
419
 
        m = Mapper()
420
 
        m.connect('page/:id/:action', controller='pages', action='show')
421
 
        m.connect(':controller/:action/:id')
422
 
 
423
 
        assert '/page/20' == m.generate(controller='pages', action='show', id=20)
424
 
        assert '/pages/boo' == m.generate(controller='pages', action='boo')
425
 
 
426
 
    def test_backwards_with_splits(self):
427
 
        m = Mapper()
428
 
        m.connect('page/:(id)/:(action)', controller='pages', action='show')
429
 
        m.connect(':(controller)/:(action)/:(id)')
430
 
 
431
 
        assert '/page/20' == m.generate(controller='pages', action='show', id=20)
432
 
        assert '/pages/boo' == m.generate(controller='pages', action='boo')
433
 
    
434
 
    def test_both_requirement_and_optional(self):
435
 
        m = Mapper()
436
 
        m.connect('test/:year', controller='post', action='show', year=None, requirements = {'year':'\d{4}'})
437
 
 
438
 
        assert '/test' == m.generate(controller='post', action='show')
439
 
        assert '/test' == m.generate(controller='post', action='show', year=None)
440
 
    
441
 
    def test_set_to_nil_forgets(self):
442
 
        m = Mapper()
443
 
        m.connect('pages/:year/:month/:day', controller='content', action='list_pages', month=None, day=None)
444
 
        m.connect(':controller/:action/:id')
445
 
 
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)
449
 
    
450
 
    def test_url_with_no_action_specified(self):
451
 
        m = Mapper()
452
 
        m.connect('', controller='content')
453
 
        m.connect(':controller/:action/:id')
454
 
 
455
 
        assert '/' == m.generate(controller='content', action='index')
456
 
        assert '/' == m.generate(controller='content')
457
 
    
458
 
    def test_url_with_prefix(self):
459
 
        m = Mapper()
460
 
        m.prefix = '/blog'
461
 
        m.connect(':controller/:action/:id')
462
 
        m.create_regs(['content','blog','admin/comments'])
463
 
 
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')
467
 
 
468
 
    def test_url_with_prefix_deeper(self):
469
 
        m = Mapper()
470
 
        m.prefix = '/blog/phil'
471
 
        m.connect(':controller/:action/:id')
472
 
        m.create_regs(['content','blog','admin/comments'])
473
 
 
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')
477
 
 
478
 
    def test_url_with_environ_empty(self):
479
 
        m = Mapper()
480
 
        m.environ = dict(SCRIPT_NAME='')
481
 
        m.connect(':controller/:action/:id')
482
 
        m.create_regs(['content','blog','admin/comments'])
483
 
 
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')
487
 
 
488
 
    def test_url_with_environ(self):
489
 
        m = Mapper()
490
 
        m.environ = dict(SCRIPT_NAME='/blog')
491
 
        m.connect(':controller/:action/:id')
492
 
        m.create_regs(['content','blog','admin/comments'])
493
 
 
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')
498
 
 
499
 
        m.environ = dict(SCRIPT_NAME='/notblog')
500
 
 
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')
505
 
        
506
 
 
507
 
    def test_url_with_environ_and_absolute(self):
508
 
        m = Mapper()
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'])
513
 
 
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')
519
 
    
520
 
    def test_route_with_odd_leftovers(self):
521
 
        m = Mapper()
522
 
        m.connect(':controller/:(action)-:(id)')
523
 
        m.create_regs(['content','blog','admin/comments'])
524
 
        
525
 
        assert '/content/view-' == m.generate(controller='content', action='view')
526
 
        assert '/content/index-' == m.generate(controller='content')
527
 
    
528
 
    def test_route_with_end_extension(self):
529
 
        m = Mapper()
530
 
        m.connect(':controller/:(action)-:(id).html')
531
 
        m.create_regs(['content','blog','admin/comments'])
532
 
        
533
 
        assert None == m.generate(controller='content', action='view')
534
 
        assert None == m.generate(controller='content')
535
 
        
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)
538
 
    
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)
547
 
        
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)
551
 
    
552
 
    def test_resources(self):
553
 
        m = Mapper()
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)
566
 
    
567
 
    def test_resources_with_path_prefix(self):
568
 
        m = Mapper()
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/')
573
 
    
574
 
    def test_resources_with_collection_action(self):
575
 
        m = Mapper()
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')
584
 
    
585
 
    def test_resources_with_member_action(self):
586
 
        for method in ['put', 'post']:
587
 
            m = Mapper()
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)
594
 
    
595
 
    def test_resources_with_new_action(self):
596
 
        m = Mapper()
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')
605
 
    
606
 
    def test_resources_with_name_prefix(self):
607
 
        m = Mapper()
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')
614
 
 
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'))
618
 
        m = Mapper()
619
 
        m.connect(':hoge')
620
 
        self.assertEqual("/%s" % hoge_enc, m.generate(hoge=hoge))
621
 
        self.assert_(isinstance(m.generate(hoge=hoge), str))
622
 
 
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'))
626
 
        m = Mapper()
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))
631
 
 
632
 
    def test_other_special_chars(self):
633
 
        m = Mapper()
634
 
        m.connect('/:year/:(slug).:(format),:(locale)', locale='en', format='html')
635
 
        m.create_regs(['content'])
636
 
        
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')
641
 
 
642
 
if __name__ == '__main__':
643
 
    unittest.main()
644
 
else:
645
 
    def bench_gen(withcache = False):
646
 
        m = Mapper()
647
 
        m.connect('', controller='articles', action='index')
648
 
        m.connect('admin', controller='admin/general', action='index')
649
 
 
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')
653
 
 
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')
657
 
 
658
 
        m.connect('articles', controller='articles', action='index')
659
 
        m.connect('articles/page/:page', controller='articles', action='index', requirements = {'page':'\d+'})
660
 
 
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')
665
 
        if withcache:
666
 
            m.urlcache = {}
667
 
        m._create_gens()
668
 
        n = 5000
669
 
        start = time.time()
670
 
        for x in range(1,n):
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)
674
 
 
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)
678
 
        end = time.time()
679
 
        ts = time.time()
680
 
        for x in range(1,n*6):
681
 
            pass
682
 
        en = time.time()
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)