Michael Merickel
2018-10-15 10ddb6f08592c2740b966e98a6f98a5b83af1896
commit | author | age
8064bd 1 import os
7ae0c2 2 import unittest
CM 3
a00621 4 from pyramid import testing
CM 5
0c29cf 6 from pyramid.compat import text_, WIN
MM 7
925957 8
fb90f0 9 class TestURLMethodsMixin(unittest.TestCase):
e62e47 10     def setUp(self):
a00621 11         self.config = testing.setUp()
e62e47 12
CM 13     def tearDown(self):
a00621 14         testing.tearDown()
0c29cf 15
c51896 16     def _makeOne(self, environ=None):
fb90f0 17         from pyramid.url import URLMethodsMixin
0c29cf 18
c51896 19         if environ is None:
CM 20             environ = {}
0c29cf 21
fb90f0 22         class Request(URLMethodsMixin):
CM 23             application_url = 'http://example.com:5432'
c51896 24             script_name = ''
0c29cf 25
c51896 26             def __init__(self, environ):
CM 27                 self.environ = environ
0c29cf 28
c51896 29         request = Request(environ)
fb90f0 30         request.registry = self.config.registry
CM 31         return request
7ae0c2 32
c51896 33     def _registerResourceURL(self, reg):
CM 34         from pyramid.interfaces import IResourceURL
35         from zope.interface import Interface
0c29cf 36
c51896 37         class DummyResourceURL(object):
60aeef 38             physical_path = '/context/'
CM 39             virtual_path = '/context/'
0c29cf 40
MM 41             def __init__(self, context, request):
42                 pass
43
44         reg.registerAdapter(
45             DummyResourceURL, (Interface, Interface), IResourceURL
46         )
60aeef 47         return DummyResourceURL
c51896 48
fb90f0 49     def test_resource_url_root_default(self):
CM 50         request = self._makeOne()
c51896 51         self._registerResourceURL(request.registry)
7ae0c2 52         root = DummyContext()
fb90f0 53         result = request.resource_url(root)
c51896 54         self.assertEqual(result, 'http://example.com:5432/context/')
7ae0c2 55
fb90f0 56     def test_resource_url_extra_args(self):
CM 57         request = self._makeOne()
c51896 58         self._registerResourceURL(request.registry)
e62e47 59         context = DummyContext()
fb90f0 60         result = request.resource_url(context, 'this/theotherthing', 'that')
e62e47 61         self.assertEqual(
0c29cf 62             result, 'http://example.com:5432/context/this%2Ftheotherthing/that'
MM 63         )
7ae0c2 64
fb90f0 65     def test_resource_url_unicode_in_element_names(self):
CM 66         request = self._makeOne()
c51896 67         self._registerResourceURL(request.registry)
a84e17 68         uc = text_(b'La Pe\xc3\xb1a', 'utf-8')
e62e47 69         context = DummyContext()
fb90f0 70         result = request.resource_url(context, uc)
0c29cf 71         self.assertEqual(
MM 72             result, 'http://example.com:5432/context/La%20Pe%C3%B1a'
73         )
7ae0c2 74
fb90f0 75     def test_resource_url_at_sign_in_element_names(self):
CM 76         request = self._makeOne()
c51896 77         self._registerResourceURL(request.registry)
ab19ea 78         context = DummyContext()
fb90f0 79         result = request.resource_url(context, '@@myview')
0c29cf 80         self.assertEqual(result, 'http://example.com:5432/context/@@myview')
ab19ea 81
fb90f0 82     def test_resource_url_element_names_url_quoted(self):
CM 83         request = self._makeOne()
c51896 84         self._registerResourceURL(request.registry)
e62e47 85         context = DummyContext()
fb90f0 86         result = request.resource_url(context, 'a b c')
c51896 87         self.assertEqual(result, 'http://example.com:5432/context/a%20b%20c')
7ae0c2 88
e967a9 89     def test_resource_url_with_query_str(self):
MM 90         request = self._makeOne()
91         self._registerResourceURL(request.registry)
92         context = DummyContext()
93         result = request.resource_url(context, 'a', query='(openlayers)')
0c29cf 94         self.assertEqual(
MM 95             result, 'http://example.com:5432/context/a?(openlayers)'
96         )
e967a9 97
fb90f0 98     def test_resource_url_with_query_dict(self):
CM 99         request = self._makeOne()
c51896 100         self._registerResourceURL(request.registry)
e62e47 101         context = DummyContext()
a84e17 102         uc = text_(b'La Pe\xc3\xb1a', 'utf-8')
0c29cf 103         result = request.resource_url(context, 'a', query={'a': uc})
MM 104         self.assertEqual(
105             result, 'http://example.com:5432/context/a?a=La+Pe%C3%B1a'
106         )
7ae0c2 107
fb90f0 108     def test_resource_url_with_query_seq(self):
CM 109         request = self._makeOne()
c51896 110         self._registerResourceURL(request.registry)
e62e47 111         context = DummyContext()
a84e17 112         uc = text_(b'La Pe\xc3\xb1a', 'utf-8')
0c29cf 113         result = request.resource_url(
MM 114             context, 'a', query=[('a', 'hi there'), ('b', uc)]
115         )
116         self.assertEqual(
117             result,
118             'http://example.com:5432/context/a?a=hi+there&b=La+Pe%C3%B1a',
119         )
7ae0c2 120
0e0c83 121     def test_resource_url_with_query_empty(self):
CL 122         request = self._makeOne()
123         self._registerResourceURL(request.registry)
124         context = DummyContext()
125         result = request.resource_url(context, 'a', query=[])
0c29cf 126         self.assertEqual(result, 'http://example.com:5432/context/a')
0e0c83 127
effe0e 128     def test_resource_url_with_query_None(self):
MM 129         request = self._makeOne()
130         self._registerResourceURL(request.registry)
131         context = DummyContext()
132         result = request.resource_url(context, 'a', query=None)
0c29cf 133         self.assertEqual(result, 'http://example.com:5432/context/a')
effe0e 134
fb90f0 135     def test_resource_url_anchor_is_after_root_when_no_elements(self):
CM 136         request = self._makeOne()
c51896 137         self._registerResourceURL(request.registry)
e693ce 138         context = DummyContext()
fb90f0 139         result = request.resource_url(context, anchor='a')
0c29cf 140         self.assertEqual(result, 'http://example.com:5432/context/#a')
e693ce 141
fb90f0 142     def test_resource_url_anchor_is_after_elements_when_no_qs(self):
CM 143         request = self._makeOne()
c51896 144         self._registerResourceURL(request.registry)
e693ce 145         context = DummyContext()
fb90f0 146         result = request.resource_url(context, 'a', anchor='b')
0c29cf 147         self.assertEqual(result, 'http://example.com:5432/context/a#b')
e693ce 148
fb90f0 149     def test_resource_url_anchor_is_after_qs_when_qs_is_present(self):
CM 150         request = self._makeOne()
c51896 151         self._registerResourceURL(request.registry)
e693ce 152         context = DummyContext()
0c29cf 153         result = request.resource_url(
MM 154             context, 'a', query={'b': 'c'}, anchor='d'
155         )
156         self.assertEqual(result, 'http://example.com:5432/context/a?b=c#d')
e693ce 157
fb90f0 158     def test_resource_url_anchor_is_encoded_utf8_if_unicode(self):
CM 159         request = self._makeOne()
c51896 160         self._registerResourceURL(request.registry)
e693ce 161         context = DummyContext()
fc30e8 162         uc = text_(b'La Pe\xc3\xb1a', 'utf-8')
fb90f0 163         result = request.resource_url(context, anchor=uc)
0c29cf 164         self.assertEqual(
MM 165             result, 'http://example.com:5432/context/#La%20Pe%C3%B1a'
166         )
e693ce 167
af3134 168     def test_resource_url_anchor_is_urlencoded_safe(self):
fb90f0 169         request = self._makeOne()
c51896 170         self._registerResourceURL(request.registry)
e693ce 171         context = DummyContext()
af3134 172         result = request.resource_url(context, anchor=' /#?&+')
0c29cf 173         self.assertEqual(result, 'http://example.com:5432/context/#%20/%23?&+')
effe0e 174
MM 175     def test_resource_url_anchor_is_None(self):
176         request = self._makeOne()
177         self._registerResourceURL(request.registry)
178         context = DummyContext()
179         result = request.resource_url(context, anchor=None)
180         self.assertEqual(result, 'http://example.com:5432/context/')
e693ce 181
c51896 182     def test_resource_url_no_IResourceURL_registered(self):
CM 183         # falls back to ResourceURL
21ad66 184         root = DummyContext()
CM 185         root.__name__ = ''
186         root.__parent__ = None
fb90f0 187         request = self._makeOne()
21ad66 188         request.environ = {}
fb90f0 189         result = request.resource_url(root)
21ad66 190         self.assertEqual(result, 'http://example.com:5432/')
CM 191
fb90f0 192     def test_resource_url_no_registry_on_request(self):
CM 193         request = self._makeOne()
c51896 194         self._registerResourceURL(request.registry)
fb90f0 195         del request.registry
45d08c 196         root = DummyContext()
fb90f0 197         result = request.resource_url(root)
c51896 198         self.assertEqual(result, 'http://example.com:5432/context/')
0c29cf 199
c51896 200     def test_resource_url_with_app_url(self):
CM 201         request = self._makeOne()
202         self._registerResourceURL(request.registry)
203         root = DummyContext()
204         result = request.resource_url(root, app_url='http://somewhere.com')
205         self.assertEqual(result, 'http://somewhere.com/context/')
206
207     def test_resource_url_with_scheme(self):
208         environ = {
0c29cf 209             'wsgi.url_scheme': 'http',
MM 210             'SERVER_PORT': '8080',
211             'SERVER_NAME': 'example.com',
212         }
c51896 213         request = self._makeOne(environ)
CM 214         self._registerResourceURL(request.registry)
215         root = DummyContext()
216         result = request.resource_url(root, scheme='https')
217         self.assertEqual(result, 'https://example.com/context/')
218
219     def test_resource_url_with_host(self):
220         environ = {
0c29cf 221             'wsgi.url_scheme': 'http',
MM 222             'SERVER_PORT': '8080',
223             'SERVER_NAME': 'example.com',
224         }
c51896 225         request = self._makeOne(environ)
CM 226         self._registerResourceURL(request.registry)
227         root = DummyContext()
228         result = request.resource_url(root, host='someotherhost.com')
229         self.assertEqual(result, 'http://someotherhost.com:8080/context/')
230
231     def test_resource_url_with_port(self):
232         environ = {
0c29cf 233             'wsgi.url_scheme': 'http',
MM 234             'SERVER_PORT': '8080',
235             'SERVER_NAME': 'example.com',
236         }
c51896 237         request = self._makeOne(environ)
CM 238         self._registerResourceURL(request.registry)
239         root = DummyContext()
240         result = request.resource_url(root, port='8181')
241         self.assertEqual(result, 'http://example.com:8181/context/')
242
243     def test_resource_url_with_local_url(self):
244         environ = {
0c29cf 245             'wsgi.url_scheme': 'http',
MM 246             'SERVER_PORT': '8080',
247             'SERVER_NAME': 'example.com',
248         }
c51896 249         request = self._makeOne(environ)
CM 250         self._registerResourceURL(request.registry)
251         root = DummyContext()
0c29cf 252
c51896 253         def resource_url(req, info):
CM 254             self.assertEqual(req, request)
255             self.assertEqual(info['virtual_path'], '/context/')
256             self.assertEqual(info['physical_path'], '/context/')
257             self.assertEqual(info['app_url'], 'http://example.com:5432')
258             return 'http://example.com/contextabc/'
0c29cf 259
c51896 260         root.__resource_url__ = resource_url
CM 261         result = request.resource_url(root)
262         self.assertEqual(result, 'http://example.com/contextabc/')
60aeef 263
CM 264     def test_resource_url_with_route_name_no_remainder_on_adapter(self):
265         from pyramid.interfaces import IRoutesMapper
0c29cf 266
60aeef 267         environ = {
0c29cf 268             'wsgi.url_scheme': 'http',
MM 269             'SERVER_PORT': '8080',
270             'SERVER_NAME': 'example.com',
271         }
60aeef 272         request = self._makeOne(environ)
CM 273         adapter = self._registerResourceURL(request.registry)
274         # no virtual_path_tuple on adapter
275         adapter.virtual_path = '/a/b/c/'
276         route = DummyRoute('/1/2/3')
277         mapper = DummyRoutesMapper(route)
278         request.registry.registerUtility(mapper, IRoutesMapper)
279         root = DummyContext()
280         result = request.resource_url(root, route_name='foo')
281         self.assertEqual(result, 'http://example.com:5432/1/2/3')
c29603 282         self.assertEqual(route.kw, {'traverse': ('', 'a', 'b', 'c', '')})
60aeef 283
CM 284     def test_resource_url_with_route_name_remainder_on_adapter(self):
285         from pyramid.interfaces import IRoutesMapper
0c29cf 286
60aeef 287         environ = {
0c29cf 288             'wsgi.url_scheme': 'http',
MM 289             'SERVER_PORT': '8080',
290             'SERVER_NAME': 'example.com',
291         }
60aeef 292         request = self._makeOne(environ)
CM 293         adapter = self._registerResourceURL(request.registry)
294         # virtual_path_tuple on adapter
295         adapter.virtual_path_tuple = ('', 'a', 'b', 'c', '')
296         route = DummyRoute('/1/2/3')
297         mapper = DummyRoutesMapper(route)
298         request.registry.registerUtility(mapper, IRoutesMapper)
299         root = DummyContext()
300         result = request.resource_url(root, route_name='foo')
301         self.assertEqual(result, 'http://example.com:5432/1/2/3')
c29603 302         self.assertEqual(route.kw, {'traverse': ('', 'a', 'b', 'c', '')})
60aeef 303
CM 304     def test_resource_url_with_route_name_and_app_url(self):
305         from pyramid.interfaces import IRoutesMapper
306
307         environ = {
0c29cf 308             'wsgi.url_scheme': 'http',
MM 309             'SERVER_PORT': '8080',
310             'SERVER_NAME': 'example.com',
311         }
60aeef 312         request = self._makeOne(environ)
CM 313         adapter = self._registerResourceURL(request.registry)
314         # virtual_path_tuple on adapter
315         adapter.virtual_path_tuple = ('', 'a', 'b', 'c', '')
316         route = DummyRoute('/1/2/3')
317         mapper = DummyRoutesMapper(route)
318         request.registry.registerUtility(mapper, IRoutesMapper)
319         root = DummyContext()
320         result = request.resource_url(
0c29cf 321             root, route_name='foo', app_url='app_url'
MM 322         )
323         self.assertEqual(result, 'app_url/1/2/3')
324         self.assertEqual(route.kw, {'traverse': ('', 'a', 'b', 'c', '')})
325
326     def test_resource_url_with_route_name_and_scheme_host_port_etc(self):
327         from pyramid.interfaces import IRoutesMapper
328
329         environ = {
330             'wsgi.url_scheme': 'http',
331             'SERVER_PORT': '8080',
332             'SERVER_NAME': 'example.com',
333         }
334         request = self._makeOne(environ)
335         adapter = self._registerResourceURL(request.registry)
336         # virtual_path_tuple on adapter
337         adapter.virtual_path_tuple = ('', 'a', 'b', 'c', '')
338         route = DummyRoute('/1/2/3')
339         mapper = DummyRoutesMapper(route)
340         request.registry.registerUtility(mapper, IRoutesMapper)
341         root = DummyContext()
342         result = request.resource_url(
343             root,
344             route_name='foo',
345             scheme='scheme',
346             host='host',
347             port='port',
348             query={'a': '1'},
349             anchor='anchor',
350         )
351         self.assertEqual(result, 'scheme://host:port/1/2/3?a=1#anchor')
352         self.assertEqual(route.kw, {'traverse': ('', 'a', 'b', 'c', '')})
353
354     def test_resource_url_with_route_name_and_route_kwargs(self):
355         from pyramid.interfaces import IRoutesMapper
356
357         environ = {
358             'wsgi.url_scheme': 'http',
359             'SERVER_PORT': '8080',
360             'SERVER_NAME': 'example.com',
361         }
362         request = self._makeOne(environ)
363         adapter = self._registerResourceURL(request.registry)
364         # virtual_path_tuple on adapter
365         adapter.virtual_path_tuple = ('', 'a', 'b', 'c', '')
366         route = DummyRoute('/1/2/3')
367         mapper = DummyRoutesMapper(route)
368         request.registry.registerUtility(mapper, IRoutesMapper)
369         root = DummyContext()
370         result = request.resource_url(
371             root, route_name='foo', route_kw={'a': '1', 'b': '2'}
372         )
60aeef 373         self.assertEqual(result, 'http://example.com:5432/1/2/3')
CM 374         self.assertEqual(
0c29cf 375             route.kw, {'traverse': ('', 'a', 'b', 'c', ''), 'a': '1', 'b': '2'}
MM 376         )
60aeef 377
CM 378     def test_resource_url_with_route_name_and_elements(self):
379         from pyramid.interfaces import IRoutesMapper
0c29cf 380
60aeef 381         environ = {
0c29cf 382             'wsgi.url_scheme': 'http',
MM 383             'SERVER_PORT': '8080',
384             'SERVER_NAME': 'example.com',
385         }
60aeef 386         request = self._makeOne(environ)
CM 387         adapter = self._registerResourceURL(request.registry)
388         # virtual_path_tuple on adapter
389         adapter.virtual_path_tuple = ('', 'a', 'b', 'c', '')
390         route = DummyRoute('/1/2/3')
391         mapper = DummyRoutesMapper(route)
392         request.registry.registerUtility(mapper, IRoutesMapper)
393         root = DummyContext()
394         result = request.resource_url(root, 'e1', 'e2', route_name='foo')
0c29cf 395         self.assertEqual(result, 'http://example.com:5432/1/2/3/e1/e2')
c29603 396         self.assertEqual(route.kw, {'traverse': ('', 'a', 'b', 'c', '')})
0c29cf 397
c29603 398     def test_resource_url_with_route_name_and_remainder_name(self):
CM 399         from pyramid.interfaces import IRoutesMapper
0c29cf 400
c29603 401         environ = {
0c29cf 402             'wsgi.url_scheme': 'http',
MM 403             'SERVER_PORT': '8080',
404             'SERVER_NAME': 'example.com',
405         }
c29603 406         request = self._makeOne(environ)
CM 407         adapter = self._registerResourceURL(request.registry)
408         # virtual_path_tuple on adapter
409         adapter.virtual_path_tuple = ('', 'a', 'b', 'c', '')
410         route = DummyRoute('/1/2/3')
411         mapper = DummyRoutesMapper(route)
412         request.registry.registerUtility(mapper, IRoutesMapper)
413         root = DummyContext()
0c29cf 414         result = request.resource_url(
MM 415             root, route_name='foo', route_remainder_name='fred'
416         )
c29603 417         self.assertEqual(result, 'http://example.com:5432/1/2/3')
60aeef 418         self.assertEqual(route.kw, {'fred': ('', 'a', 'b', 'c', '')})
0c29cf 419
c51896 420     def test_resource_path(self):
CM 421         request = self._makeOne()
422         self._registerResourceURL(request.registry)
423         root = DummyContext()
424         result = request.resource_path(root)
425         self.assertEqual(result, '/context/')
426
427     def test_resource_path_kwarg(self):
428         request = self._makeOne()
429         self._registerResourceURL(request.registry)
430         root = DummyContext()
431         result = request.resource_path(root, anchor='abc')
432         self.assertEqual(result, '/context/#abc')
0c29cf 433
fb90f0 434     def test_route_url_with_elements(self):
b60bdb 435         from pyramid.interfaces import IRoutesMapper
0c29cf 436
fb90f0 437         request = self._makeOne()
70f1cd 438         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
6fec21 439         request.registry.registerUtility(mapper, IRoutesMapper)
fb90f0 440         result = request.route_url('flub', 'extra1', 'extra2')
0c29cf 441         self.assertEqual(result, 'http://example.com:5432/1/2/3/extra1/extra2')
c18e27 442
fb90f0 443     def test_route_url_with_elements_path_endswith_slash(self):
c18e27 444         from pyramid.interfaces import IRoutesMapper
0c29cf 445
fb90f0 446         request = self._makeOne()
c18e27 447         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3/'))
CM 448         request.registry.registerUtility(mapper, IRoutesMapper)
fb90f0 449         result = request.route_url('flub', 'extra1', 'extra2')
0c29cf 450         self.assertEqual(result, 'http://example.com:5432/1/2/3/extra1/extra2')
05c023 451
fb90f0 452     def test_route_url_no_elements(self):
b60bdb 453         from pyramid.interfaces import IRoutesMapper
0c29cf 454
fb90f0 455         request = self._makeOne()
70f1cd 456         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
6fec21 457         request.registry.registerUtility(mapper, IRoutesMapper)
0c29cf 458         result = request.route_url(
MM 459             'flub', a=1, b=2, c=3, _query={'a': 1}, _anchor=text_(b"foo")
460         )
461         self.assertEqual(result, 'http://example.com:5432/1/2/3?a=1#foo')
c18e27 462
effe0e 463     def test_route_url_with_query_None(self):
MM 464         from pyramid.interfaces import IRoutesMapper
0c29cf 465
effe0e 466         request = self._makeOne()
MM 467         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
468         request.registry.registerUtility(mapper, IRoutesMapper)
469         result = request.route_url('flub', a=1, b=2, c=3, _query=None)
470         self.assertEqual(result, 'http://example.com:5432/1/2/3')
471
a7c67c 472     def test_route_url_with_anchor_binary(self):
c18e27 473         from pyramid.interfaces import IRoutesMapper
0c29cf 474
fb90f0 475         request = self._makeOne()
c18e27 476         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
CM 477         request.registry.registerUtility(mapper, IRoutesMapper)
a7c67c 478         result = request.route_url('flub', _anchor=b"La Pe\xc3\xb1a")
CM 479
0c29cf 480         self.assertEqual(
MM 481             result, 'http://example.com:5432/1/2/3#La%20Pe%C3%B1a'
482         )
c18e27 483
fb90f0 484     def test_route_url_with_anchor_unicode(self):
c18e27 485         from pyramid.interfaces import IRoutesMapper
0c29cf 486
fb90f0 487         request = self._makeOne()
c18e27 488         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
CM 489         request.registry.registerUtility(mapper, IRoutesMapper)
a84e17 490         anchor = text_(b'La Pe\xc3\xb1a', 'utf-8')
fb90f0 491         result = request.route_url('flub', _anchor=anchor)
a7c67c 492
0c29cf 493         self.assertEqual(
MM 494             result, 'http://example.com:5432/1/2/3#La%20Pe%C3%B1a'
495         )
c18e27 496
effe0e 497     def test_route_url_with_anchor_None(self):
MM 498         from pyramid.interfaces import IRoutesMapper
0c29cf 499
effe0e 500         request = self._makeOne()
MM 501         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
502         request.registry.registerUtility(mapper, IRoutesMapper)
503         result = request.route_url('flub', _anchor=None)
504
505         self.assertEqual(result, 'http://example.com:5432/1/2/3')
506
fb90f0 507     def test_route_url_with_query(self):
c18e27 508         from pyramid.interfaces import IRoutesMapper
0c29cf 509
fb90f0 510         request = self._makeOne()
c18e27 511         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
CM 512         request.registry.registerUtility(mapper, IRoutesMapper)
0c29cf 513         result = request.route_url('flub', _query={'q': '1'})
MM 514         self.assertEqual(result, 'http://example.com:5432/1/2/3?q=1')
c18e27 515
e967a9 516     def test_route_url_with_query_str(self):
MM 517         from pyramid.interfaces import IRoutesMapper
0c29cf 518
e967a9 519         request = self._makeOne()
MM 520         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
521         request.registry.registerUtility(mapper, IRoutesMapper)
522         result = request.route_url('flub', _query='(openlayers)')
0c29cf 523         self.assertEqual(result, 'http://example.com:5432/1/2/3?(openlayers)')
e967a9 524
0e0c83 525     def test_route_url_with_empty_query(self):
CL 526         from pyramid.interfaces import IRoutesMapper
0c29cf 527
0e0c83 528         request = self._makeOne()
CL 529         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
530         request.registry.registerUtility(mapper, IRoutesMapper)
531         result = request.route_url('flub', _query={})
0c29cf 532         self.assertEqual(result, 'http://example.com:5432/1/2/3')
0e0c83 533
fb90f0 534     def test_route_url_with_app_url(self):
c18e27 535         from pyramid.interfaces import IRoutesMapper
0c29cf 536
fb90f0 537         request = self._makeOne()
c18e27 538         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
CM 539         request.registry.registerUtility(mapper, IRoutesMapper)
fb90f0 540         result = request.route_url('flub', _app_url='http://example2.com')
0c29cf 541         self.assertEqual(result, 'http://example2.com/1/2/3')
dc405b 542
c51896 543     def test_route_url_with_host(self):
CM 544         from pyramid.interfaces import IRoutesMapper
0c29cf 545
MM 546         environ = {'wsgi.url_scheme': 'http', 'SERVER_PORT': '5432'}
c51896 547         request = self._makeOne(environ)
CM 548         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
549         request.registry.registerUtility(mapper, IRoutesMapper)
550         result = request.route_url('flub', _host='someotherhost.com')
0c29cf 551         self.assertEqual(result, 'http://someotherhost.com:5432/1/2/3')
c51896 552
CM 553     def test_route_url_with_port(self):
554         from pyramid.interfaces import IRoutesMapper
0c29cf 555
c51896 556         environ = {
0c29cf 557             'wsgi.url_scheme': 'http',
MM 558             'SERVER_PORT': '5432',
559             'SERVER_NAME': 'example.com',
560         }
c51896 561         request = self._makeOne(environ)
CM 562         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
563         request.registry.registerUtility(mapper, IRoutesMapper)
564         result = request.route_url('flub', _port='8080')
0c29cf 565         self.assertEqual(result, 'http://example.com:8080/1/2/3')
c51896 566
CM 567     def test_route_url_with_scheme(self):
568         from pyramid.interfaces import IRoutesMapper
0c29cf 569
c51896 570         environ = {
0c29cf 571             'wsgi.url_scheme': 'http',
MM 572             'SERVER_PORT': '5432',
573             'SERVER_NAME': 'example.com',
574         }
c51896 575         request = self._makeOne(environ)
CM 576         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
577         request.registry.registerUtility(mapper, IRoutesMapper)
578         result = request.route_url('flub', _scheme='https')
0c29cf 579         self.assertEqual(result, 'https://example.com/1/2/3')
MM 580
fb90f0 581     def test_route_url_generation_error(self):
b60bdb 582         from pyramid.interfaces import IRoutesMapper
0c29cf 583
fb90f0 584         request = self._makeOne()
05c023 585         mapper = DummyRoutesMapper(raise_exc=KeyError)
6fec21 586         request.registry.registerUtility(mapper, IRoutesMapper)
05c023 587         mapper.raise_exc = KeyError
fb90f0 588         self.assertRaises(KeyError, request.route_url, 'flub', request, a=1)
750ce4 589
fb90f0 590     def test_route_url_generate_doesnt_receive_query_or_anchor(self):
b60bdb 591         from pyramid.interfaces import IRoutesMapper
0c29cf 592
fb90f0 593         request = self._makeOne()
70f1cd 594         route = DummyRoute(result='')
CM 595         mapper = DummyRoutesMapper(route=route)
fb90f0 596         request.registry.registerUtility(mapper, IRoutesMapper)
CM 597         result = request.route_url('flub', _query=dict(name='some_name'))
0c29cf 598         self.assertEqual(route.kw, {})  # shouldnt have anchor/query
9d9ffb 599         self.assertEqual(result, 'http://example.com:5432?name=some_name')
CM 600
fb90f0 601     def test_route_url_with_pregenerator(self):
b60bdb 602         from pyramid.interfaces import IRoutesMapper
0c29cf 603
fb90f0 604         request = self._makeOne()
70f1cd 605         route = DummyRoute(result='/1/2/3')
0c29cf 606
70f1cd 607         def pregenerator(request, elements, kw):
0c29cf 608             return ('a',), {'_app_url': 'http://example2.com'}
MM 609
70f1cd 610         route.pregenerator = pregenerator
CM 611         mapper = DummyRoutesMapper(route=route)
612         request.registry.registerUtility(mapper, IRoutesMapper)
fb90f0 613         result = request.route_url('flub')
0c29cf 614         self.assertEqual(result, 'http://example2.com/1/2/3/a')
MM 615         self.assertEqual(route.kw, {})  # shouldnt have anchor/query
b29429 616
fb90f0 617     def test_route_url_with_anchor_app_url_elements_and_query(self):
c18e27 618         from pyramid.interfaces import IRoutesMapper
0c29cf 619
fb90f0 620         request = self._makeOne()
c18e27 621         mapper = DummyRoutesMapper(route=DummyRoute(result='/1/2/3'))
CM 622         request.registry.registerUtility(mapper, IRoutesMapper)
0c29cf 623         result = request.route_url(
MM 624             'flub',
625             'element1',
626             _app_url='http://example2.com',
627             _anchor='anchor',
628             _query={'q': '1'},
629         )
630         self.assertEqual(
631             result, 'http://example2.com/1/2/3/element1?q=1#anchor'
632         )
db0185 633
fb90f0 634     def test_route_url_integration_with_real_request(self):
311ccc 635         # to try to replicate https://github.com/Pylons/pyramid/issues/213
CM 636         from pyramid.interfaces import IRoutesMapper
637         from pyramid.request import Request
0c29cf 638
311ccc 639         request = Request.blank('/')
CM 640         request.registry = self.config.registry
641         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
642         request.registry.registerUtility(mapper, IRoutesMapper)
fb90f0 643         result = request.route_url('flub', 'extra1', 'extra2')
0c29cf 644         self.assertEqual(result, 'http://localhost/1/2/3/extra1/extra2')
311ccc 645
fb90f0 646     def test_current_route_url_current_request_has_no_route(self):
CM 647         request = self._makeOne()
648         self.assertRaises(ValueError, request.current_route_url)
5653d1 649
fb90f0 650     def test_current_route_url_with_elements_query_and_anchor(self):
5653d1 651         from pyramid.interfaces import IRoutesMapper
0c29cf 652
fb90f0 653         request = self._makeOne()
5653d1 654         route = DummyRoute('/1/2/3')
CM 655         mapper = DummyRoutesMapper(route=route)
656         request.matched_route = route
657         request.matchdict = {}
658         request.registry.registerUtility(mapper, IRoutesMapper)
0c29cf 659         result = request.current_route_url(
MM 660             'extra1', 'extra2', _query={'a': 1}, _anchor=text_(b"foo")
661         )
662         self.assertEqual(
663             result, 'http://example.com:5432/1/2/3/extra1/extra2?a=1#foo'
664         )
5653d1 665
fb90f0 666     def test_current_route_url_with_route_name(self):
5653d1 667         from pyramid.interfaces import IRoutesMapper
0c29cf 668
fb90f0 669         request = self._makeOne()
5653d1 670         route = DummyRoute('/1/2/3')
CM 671         mapper = DummyRoutesMapper(route=route)
672         request.matched_route = route
673         request.matchdict = {}
674         request.registry.registerUtility(mapper, IRoutesMapper)
0c29cf 675         result = request.current_route_url(
MM 676             'extra1',
677             'extra2',
678             _query={'a': 1},
679             _anchor=text_(b"foo"),
680             _route_name='bar',
681         )
682         self.assertEqual(
683             result, 'http://example.com:5432/1/2/3/extra1/extra2?a=1#foo'
684         )
5653d1 685
fe8c0f 686     def test_current_route_url_with_request_query(self):
JV 687         from pyramid.interfaces import IRoutesMapper
688         from webob.multidict import GetDict
0c29cf 689
fe8c0f 690         request = self._makeOne()
JV 691         request.GET = GetDict([('q', '123')], {})
692         route = DummyRoute('/1/2/3')
693         mapper = DummyRoutesMapper(route=route)
694         request.matched_route = route
695         request.matchdict = {}
696         request.registry.registerUtility(mapper, IRoutesMapper)
697         result = request.current_route_url()
0c29cf 698         self.assertEqual(result, 'http://example.com:5432/1/2/3?q=123')
fe8c0f 699
6a4a34 700     def test_current_route_url_with_request_query_duplicate_entries(self):
JV 701         from pyramid.interfaces import IRoutesMapper
702         from webob.multidict import GetDict
0c29cf 703
6a4a34 704         request = self._makeOne()
db0185 705         request.GET = GetDict(
0c29cf 706             [('q', '123'), ('b', '2'), ('b', '2'), ('q', '456')], {}
MM 707         )
6a4a34 708         route = DummyRoute('/1/2/3')
JV 709         mapper = DummyRoutesMapper(route=route)
710         request.matched_route = route
711         request.matchdict = {}
712         request.registry.registerUtility(mapper, IRoutesMapper)
713         result = request.current_route_url()
0c29cf 714         self.assertEqual(
MM 715             result, 'http://example.com:5432/1/2/3?q=123&b=2&b=2&q=456'
716         )
6a4a34 717
fe8c0f 718     def test_current_route_url_with_query_override(self):
JV 719         from pyramid.interfaces import IRoutesMapper
720         from webob.multidict import GetDict
0c29cf 721
fe8c0f 722         request = self._makeOne()
JV 723         request.GET = GetDict([('q', '123')], {})
724         route = DummyRoute('/1/2/3')
725         mapper = DummyRoutesMapper(route=route)
726         request.matched_route = route
727         request.matchdict = {}
728         request.registry.registerUtility(mapper, IRoutesMapper)
0c29cf 729         result = request.current_route_url(_query={'a': 1})
MM 730         self.assertEqual(result, 'http://example.com:5432/1/2/3?a=1')
fe8c0f 731
12cef0 732     def test_current_route_path(self):
CM 733         from pyramid.interfaces import IRoutesMapper
0c29cf 734
12cef0 735         request = self._makeOne()
CM 736         route = DummyRoute('/1/2/3')
737         mapper = DummyRoutesMapper(route=route)
738         request.matched_route = route
739         request.matchdict = {}
5c6963 740         request.script_name = '/script_name'
12cef0 741         request.registry.registerUtility(mapper, IRoutesMapper)
0c29cf 742         result = request.current_route_path(
MM 743             'extra1', 'extra2', _query={'a': 1}, _anchor=text_(b"foo")
744         )
5c6963 745         self.assertEqual(result, '/script_name/1/2/3/extra1/extra2?a=1#foo')
6a4a34 746
fb90f0 747     def test_route_path_with_elements(self):
2c9d14 748         from pyramid.interfaces import IRoutesMapper
0c29cf 749
fb90f0 750         request = self._makeOne()
2c9d14 751         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
CM 752         request.registry.registerUtility(mapper, IRoutesMapper)
fb90f0 753         request.script_name = ''
0c29cf 754         result = request.route_path(
MM 755             'flub',
756             'extra1',
757             'extra2',
758             a=1,
759             b=2,
760             c=3,
761             _query={'a': 1},
762             _anchor=text_(b"foo"),
763         )
2c9d14 764         self.assertEqual(result, '/1/2/3/extra1/extra2?a=1#foo')
CM 765
fb90f0 766     def test_route_path_with_script_name(self):
0a0edf 767         from pyramid.interfaces import IRoutesMapper
0c29cf 768
fb90f0 769         request = self._makeOne()
0a0edf 770         request.script_name = '/foo'
CM 771         mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3'))
772         request.registry.registerUtility(mapper, IRoutesMapper)
0c29cf 773         result = request.route_path(
MM 774             'flub',
775             'extra1',
776             'extra2',
777             a=1,
778             b=2,
779             c=3,
780             _query={'a': 1},
781             _anchor=text_(b"foo"),
782         )
0a0edf 783         self.assertEqual(result, '/foo/1/2/3/extra1/extra2?a=1#foo')
0c29cf 784
fb90f0 785     def test_static_url_staticurlinfo_notfound(self):
CM 786         request = self._makeOne()
787         self.assertRaises(ValueError, request.static_url, 'static/foo.css')
750ce4 788
fb90f0 789     def test_static_url_abspath(self):
b8c797 790         from pyramid.interfaces import IStaticURLInfo
0c29cf 791
fb90f0 792         request = self._makeOne()
b8c797 793         info = DummyStaticURLInfo('abc')
CM 794         registry = request.registry
795         registry.registerUtility(info, IStaticURLInfo)
796         abspath = makeabs('static', 'foo.css')
797         result = request.static_url(abspath)
798         self.assertEqual(result, 'abc')
0c29cf 799         self.assertEqual(
MM 800             info.args, (makeabs('static', 'foo.css'), request, {})
801         )
b8c797 802         request = self._makeOne()
750ce4 803
fb90f0 804     def test_static_url_found_rel(self):
b60bdb 805         from pyramid.interfaces import IStaticURLInfo
0c29cf 806
fb90f0 807         request = self._makeOne()
b29429 808         info = DummyStaticURLInfo('abc')
CM 809         request.registry.registerUtility(info, IStaticURLInfo)
fb90f0 810         result = request.static_url('static/foo.css')
b29429 811         self.assertEqual(result, 'abc')
0c29cf 812         self.assertEqual(info.args, ('tests:static/foo.css', request, {}))
750ce4 813
fb90f0 814     def test_static_url_abs(self):
b60bdb 815         from pyramid.interfaces import IStaticURLInfo
0c29cf 816
fb90f0 817         request = self._makeOne()
b29429 818         info = DummyStaticURLInfo('abc')
CM 819         request.registry.registerUtility(info, IStaticURLInfo)
dd3cc8 820         result = request.static_url('tests:static/foo.css')
b29429 821         self.assertEqual(result, 'abc')
0c29cf 822         self.assertEqual(info.args, ('tests:static/foo.css', request, {}))
750ce4 823
fb90f0 824     def test_static_url_found_abs_no_registry_on_request(self):
b60bdb 825         from pyramid.interfaces import IStaticURLInfo
0c29cf 826
fb90f0 827         request = self._makeOne()
CM 828         registry = request.registry
b29429 829         info = DummyStaticURLInfo('abc')
CM 830         registry.registerUtility(info, IStaticURLInfo)
fb90f0 831         del request.registry
dd3cc8 832         result = request.static_url('tests:static/foo.css')
b29429 833         self.assertEqual(result, 'abc')
0c29cf 834         self.assertEqual(info.args, ('tests:static/foo.css', request, {}))
5c6963 835
b8c797 836     def test_static_url_abspath_integration_with_staticurlinfo(self):
CM 837         from pyramid.interfaces import IStaticURLInfo
53d9d4 838         from pyramid.config.views import StaticURLInfo
0c29cf 839
cda7f6 840         info = StaticURLInfo()
b8c797 841         here = os.path.abspath(os.path.dirname(__file__))
cda7f6 842         info.add(self.config, 'absstatic', here)
5c6963 843         request = self._makeOne()
b8c797 844         registry = request.registry
CM 845         registry.registerUtility(info, IStaticURLInfo)
846         abspath = os.path.join(here, 'test_url.py')
847         result = request.static_url(abspath)
0c29cf 848         self.assertEqual(
MM 849             result, 'http://example.com:5432/absstatic/test_url.py'
850         )
b8c797 851
ff41f8 852     def test_static_url_noscheme_uses_scheme_from_request(self):
WS 853         from pyramid.interfaces import IStaticURLInfo
854         from pyramid.config.views import StaticURLInfo
0c29cf 855
ff41f8 856         info = StaticURLInfo()
WS 857         here = os.path.abspath(os.path.dirname(__file__))
858         info.add(self.config, '//subdomain.example.com/static', here)
859         request = self._makeOne({'wsgi.url_scheme': 'https'})
860         registry = request.registry
861         registry.registerUtility(info, IStaticURLInfo)
862         abspath = os.path.join(here, 'test_url.py')
863         result = request.static_url(abspath)
0c29cf 864         self.assertEqual(
MM 865             result, 'https://subdomain.example.com/static/test_url.py'
866         )
ff41f8 867
b8c797 868     def test_static_path_abspath(self):
CM 869         from pyramid.interfaces import IStaticURLInfo
0c29cf 870
b8c797 871         request = self._makeOne()
CM 872         request.script_name = '/foo'
873         info = DummyStaticURLInfo('abc')
874         registry = request.registry
875         registry.registerUtility(info, IStaticURLInfo)
876         abspath = makeabs('static', 'foo.css')
877         result = request.static_path(abspath)
878         self.assertEqual(result, 'abc')
0c29cf 879         self.assertEqual(
MM 880             info.args,
881             (makeabs('static', 'foo.css'), request, {'_app_url': '/foo'}),
882         )
5c6963 883
CM 884     def test_static_path_found_rel(self):
885         from pyramid.interfaces import IStaticURLInfo
0c29cf 886
5c6963 887         request = self._makeOne()
CM 888         request.script_name = '/foo'
889         info = DummyStaticURLInfo('abc')
890         request.registry.registerUtility(info, IStaticURLInfo)
891         result = request.static_path('static/foo.css')
892         self.assertEqual(result, 'abc')
0c29cf 893         self.assertEqual(
MM 894             info.args, ('tests:static/foo.css', request, {'_app_url': '/foo'})
895         )
5c6963 896
CM 897     def test_static_path_abs(self):
898         from pyramid.interfaces import IStaticURLInfo
0c29cf 899
5c6963 900         request = self._makeOne()
CM 901         request.script_name = '/foo'
902         info = DummyStaticURLInfo('abc')
903         request.registry.registerUtility(info, IStaticURLInfo)
dd3cc8 904         result = request.static_path('tests:static/foo.css')
5c6963 905         self.assertEqual(result, 'abc')
0c29cf 906         self.assertEqual(
MM 907             info.args, ('tests:static/foo.css', request, {'_app_url': '/foo'})
908         )
5c6963 909
CM 910     def test_static_path(self):
911         from pyramid.interfaces import IStaticURLInfo
0c29cf 912
5c6963 913         request = self._makeOne()
CM 914         request.script_name = '/foo'
915         info = DummyStaticURLInfo('abc')
916         request.registry.registerUtility(info, IStaticURLInfo)
917         result = request.static_path('static/foo.css')
918         self.assertEqual(result, 'abc')
0c29cf 919         self.assertEqual(
MM 920             info.args, ('tests:static/foo.css', request, {'_app_url': '/foo'})
921         )
fb90f0 922
c51896 923     def test_partial_application_url_with_http_host_default_port_http(self):
0c29cf 924         environ = {'wsgi.url_scheme': 'http', 'HTTP_HOST': 'example.com:80'}
c51896 925         request = self._makeOne(environ)
5b1e2a 926         result = request._partial_application_url()
c51896 927         self.assertEqual(result, 'http://example.com')
CM 928
929     def test_partial_application_url_with_http_host_default_port_https(self):
0c29cf 930         environ = {'wsgi.url_scheme': 'https', 'HTTP_HOST': 'example.com:443'}
c51896 931         request = self._makeOne(environ)
5b1e2a 932         result = request._partial_application_url()
c51896 933         self.assertEqual(result, 'https://example.com')
CM 934
935     def test_partial_application_url_with_http_host_nondefault_port_http(self):
0c29cf 936         environ = {'wsgi.url_scheme': 'http', 'HTTP_HOST': 'example.com:8080'}
c51896 937         request = self._makeOne(environ)
5b1e2a 938         result = request._partial_application_url()
c51896 939         self.assertEqual(result, 'http://example.com:8080')
CM 940
0c29cf 941     def test_partial_application_url_with_http_host_nondefault_port_https(
MM 942         self
943     ):
944         environ = {'wsgi.url_scheme': 'https', 'HTTP_HOST': 'example.com:4443'}
c51896 945         request = self._makeOne(environ)
5b1e2a 946         result = request._partial_application_url()
c51896 947         self.assertEqual(result, 'https://example.com:4443')
CM 948
949     def test_partial_application_url_with_http_host_no_colon(self):
950         environ = {
0c29cf 951             'wsgi.url_scheme': 'http',
MM 952             'HTTP_HOST': 'example.com',
953             'SERVER_PORT': '80',
954         }
c51896 955         request = self._makeOne(environ)
5b1e2a 956         result = request._partial_application_url()
c51896 957         self.assertEqual(result, 'http://example.com')
CM 958
959     def test_partial_application_url_no_http_host(self):
960         environ = {
0c29cf 961             'wsgi.url_scheme': 'http',
MM 962             'SERVER_NAME': 'example.com',
963             'SERVER_PORT': '80',
964         }
c51896 965         request = self._makeOne(environ)
5b1e2a 966         result = request._partial_application_url()
c51896 967         self.assertEqual(result, 'http://example.com')
0c29cf 968
c51896 969     def test_partial_application_replace_port(self):
CM 970         environ = {
0c29cf 971             'wsgi.url_scheme': 'http',
MM 972             'SERVER_NAME': 'example.com',
973             'SERVER_PORT': '80',
974         }
c51896 975         request = self._makeOne(environ)
5b1e2a 976         result = request._partial_application_url(port=8080)
c51896 977         self.assertEqual(result, 'http://example.com:8080')
CM 978
979     def test_partial_application_replace_scheme_https_special_case(self):
980         environ = {
0c29cf 981             'wsgi.url_scheme': 'http',
MM 982             'SERVER_NAME': 'example.com',
983             'SERVER_PORT': '80',
984         }
c51896 985         request = self._makeOne(environ)
5b1e2a 986         result = request._partial_application_url(scheme='https')
c51896 987         self.assertEqual(result, 'https://example.com')
CM 988
989     def test_partial_application_replace_scheme_https_special_case_avoid(self):
990         environ = {
0c29cf 991             'wsgi.url_scheme': 'http',
MM 992             'SERVER_NAME': 'example.com',
993             'SERVER_PORT': '80',
994         }
c51896 995         request = self._makeOne(environ)
5b1e2a 996         result = request._partial_application_url(scheme='https', port='8080')
c51896 997         self.assertEqual(result, 'https://example.com:8080')
CM 998
999     def test_partial_application_replace_scheme_http_special_case(self):
1000         environ = {
0c29cf 1001             'wsgi.url_scheme': 'https',
MM 1002             'SERVER_NAME': 'example.com',
1003             'SERVER_PORT': '8080',
1004         }
c51896 1005         request = self._makeOne(environ)
5b1e2a 1006         result = request._partial_application_url(scheme='http')
c51896 1007         self.assertEqual(result, 'http://example.com')
CM 1008
1009     def test_partial_application_replace_scheme_http_special_case_avoid(self):
1010         environ = {
0c29cf 1011             'wsgi.url_scheme': 'https',
MM 1012             'SERVER_NAME': 'example.com',
1013             'SERVER_PORT': '8000',
1014         }
c51896 1015         request = self._makeOne(environ)
5b1e2a 1016         result = request._partial_application_url(scheme='http', port='8080')
c51896 1017         self.assertEqual(result, 'http://example.com:8080')
0c29cf 1018
c51896 1019     def test_partial_application_replace_host_no_port(self):
CM 1020         environ = {
0c29cf 1021             'wsgi.url_scheme': 'http',
MM 1022             'SERVER_NAME': 'example.com',
1023             'SERVER_PORT': '80',
1024         }
c51896 1025         request = self._makeOne(environ)
5b1e2a 1026         result = request._partial_application_url(host='someotherhost.com')
c51896 1027         self.assertEqual(result, 'http://someotherhost.com')
CM 1028
1029     def test_partial_application_replace_host_with_port(self):
1030         environ = {
0c29cf 1031             'wsgi.url_scheme': 'http',
MM 1032             'SERVER_NAME': 'example.com',
1033             'SERVER_PORT': '8000',
1034         }
c51896 1035         request = self._makeOne(environ)
0c29cf 1036         result = request._partial_application_url(
MM 1037             host='someotherhost.com:8080'
1038         )
c51896 1039         self.assertEqual(result, 'http://someotherhost.com:8080')
CM 1040
1041     def test_partial_application_replace_host_and_port(self):
1042         environ = {
0c29cf 1043             'wsgi.url_scheme': 'http',
MM 1044             'SERVER_NAME': 'example.com',
1045             'SERVER_PORT': '80',
1046         }
c51896 1047         request = self._makeOne(environ)
0c29cf 1048         result = request._partial_application_url(
MM 1049             host='someotherhost.com:8080', port='8000'
1050         )
c51896 1051         self.assertEqual(result, 'http://someotherhost.com:8000')
CM 1052
1053     def test_partial_application_replace_host_port_and_scheme(self):
1054         environ = {
0c29cf 1055             'wsgi.url_scheme': 'http',
MM 1056             'SERVER_NAME': 'example.com',
1057             'SERVER_PORT': '80',
1058         }
c51896 1059         request = self._makeOne(environ)
5b1e2a 1060         result = request._partial_application_url(
0c29cf 1061             host='someotherhost.com:8080', port='8000', scheme='https'
MM 1062         )
c51896 1063         self.assertEqual(result, 'https://someotherhost.com:8000')
0c29cf 1064
c51896 1065     def test_partial_application_url_with_custom_script_name(self):
CM 1066         environ = {
0c29cf 1067             'wsgi.url_scheme': 'http',
MM 1068             'SERVER_NAME': 'example.com',
1069             'SERVER_PORT': '8000',
1070         }
c51896 1071         request = self._makeOne(environ)
CM 1072         request.script_name = '/abc'
5b1e2a 1073         result = request._partial_application_url()
0c29cf 1074         self.assertEqual(result, 'http://example.com:8000/abc')
MM 1075
1076
fb90f0 1077 class Test_route_url(unittest.TestCase):
CM 1078     def _callFUT(self, route_name, request, *elements, **kw):
1079         from pyramid.url import route_url
0c29cf 1080
fb90f0 1081         return route_url(route_name, request, *elements, **kw)
CM 1082
1083     def _makeRequest(self):
1084         class Request(object):
1085             def route_url(self, route_name, *elements, **kw):
1086                 self.route_name = route_name
1087                 self.elements = elements
1088                 self.kw = kw
1089                 return 'route url'
0c29cf 1090
fb90f0 1091         return Request()
CM 1092
1093     def test_it(self):
1094         request = self._makeRequest()
1095         result = self._callFUT('abc', request, 'a', _app_url='')
1096         self.assertEqual(result, 'route url')
1097         self.assertEqual(request.route_name, 'abc')
1098         self.assertEqual(request.elements, ('a',))
0c29cf 1099         self.assertEqual(request.kw, {'_app_url': ''})
MM 1100
fb90f0 1101
CM 1102 class Test_route_path(unittest.TestCase):
1103     def _callFUT(self, route_name, request, *elements, **kw):
1104         from pyramid.url import route_path
0c29cf 1105
fb90f0 1106         return route_path(route_name, request, *elements, **kw)
CM 1107
1108     def _makeRequest(self):
1109         class Request(object):
1110             def route_path(self, route_name, *elements, **kw):
1111                 self.route_name = route_name
1112                 self.elements = elements
1113                 self.kw = kw
1114                 return 'route path'
0c29cf 1115
fb90f0 1116         return Request()
CM 1117
1118     def test_it(self):
1119         request = self._makeRequest()
1120         result = self._callFUT('abc', request, 'a', _app_url='')
1121         self.assertEqual(result, 'route path')
1122         self.assertEqual(request.route_name, 'abc')
1123         self.assertEqual(request.elements, ('a',))
0c29cf 1124         self.assertEqual(request.kw, {'_app_url': ''})
MM 1125
fb90f0 1126
CM 1127 class Test_resource_url(unittest.TestCase):
1128     def _callFUT(self, resource, request, *elements, **kw):
1129         from pyramid.url import resource_url
0c29cf 1130
fb90f0 1131         return resource_url(resource, request, *elements, **kw)
CM 1132
1133     def _makeRequest(self):
1134         class Request(object):
1135             def resource_url(self, resource, *elements, **kw):
1136                 self.resource = resource
1137                 self.elements = elements
1138                 self.kw = kw
1139                 return 'resource url'
0c29cf 1140
fb90f0 1141         return Request()
CM 1142
1143     def test_it(self):
1144         request = self._makeRequest()
1145         result = self._callFUT('abc', request, 'a', _app_url='')
1146         self.assertEqual(result, 'resource url')
1147         self.assertEqual(request.resource, 'abc')
1148         self.assertEqual(request.elements, ('a',))
0c29cf 1149         self.assertEqual(request.kw, {'_app_url': ''})
MM 1150
fb90f0 1151
CM 1152 class Test_static_url(unittest.TestCase):
1153     def _callFUT(self, path, request, **kw):
1154         from pyramid.url import static_url
0c29cf 1155
fb90f0 1156         return static_url(path, request, **kw)
CM 1157
1158     def _makeRequest(self):
1159         class Request(object):
1160             def static_url(self, path, **kw):
1161                 self.path = path
1162                 self.kw = kw
1163                 return 'static url'
0c29cf 1164
fb90f0 1165         return Request()
CM 1166
b5c0cb 1167     def test_it_abs(self):
CM 1168         request = self._makeRequest()
1169         result = self._callFUT('/foo/bar/abc', request, _app_url='')
1170         self.assertEqual(result, 'static url')
1171         self.assertEqual(request.path, '/foo/bar/abc')
0c29cf 1172         self.assertEqual(request.kw, {'_app_url': ''})
b5c0cb 1173
CM 1174     def test_it_absspec(self):
1175         request = self._makeRequest()
1176         result = self._callFUT('foo:abc', request, _anchor='anchor')
1177         self.assertEqual(result, 'static url')
1178         self.assertEqual(request.path, 'foo:abc')
0c29cf 1179         self.assertEqual(request.kw, {'_anchor': 'anchor'})
b5c0cb 1180
CM 1181     def test_it_rel(self):
fb90f0 1182         request = self._makeRequest()
CM 1183         result = self._callFUT('abc', request, _app_url='')
1184         self.assertEqual(result, 'static url')
dd3cc8 1185         self.assertEqual(request.path, 'tests:abc')
0c29cf 1186         self.assertEqual(request.kw, {'_app_url': ''})
MM 1187
fb90f0 1188
5c6963 1189 class Test_static_path(unittest.TestCase):
CM 1190     def _callFUT(self, path, request, **kw):
1191         from pyramid.url import static_path
0c29cf 1192
5c6963 1193         return static_path(path, request, **kw)
CM 1194
1195     def _makeRequest(self):
1196         class Request(object):
1197             def static_path(self, path, **kw):
1198                 self.path = path
1199                 self.kw = kw
1200                 return 'static path'
0c29cf 1201
5c6963 1202         return Request()
CM 1203
b5c0cb 1204     def test_it_abs(self):
5c6963 1205         request = self._makeRequest()
b5c0cb 1206         result = self._callFUT('/foo/bar/abc', request, _anchor='anchor')
5c6963 1207         self.assertEqual(result, 'static path')
b5c0cb 1208         self.assertEqual(request.path, '/foo/bar/abc')
0c29cf 1209         self.assertEqual(request.kw, {'_anchor': 'anchor'})
5c6963 1210
b5c0cb 1211     def test_it_absspec(self):
CM 1212         request = self._makeRequest()
1213         result = self._callFUT('foo:abc', request, _anchor='anchor')
1214         self.assertEqual(result, 'static path')
1215         self.assertEqual(request.path, 'foo:abc')
0c29cf 1216         self.assertEqual(request.kw, {'_anchor': 'anchor'})
b5c0cb 1217
CM 1218     def test_it_rel(self):
1219         request = self._makeRequest()
1220         result = self._callFUT('abc', request, _app_url='')
1221         self.assertEqual(result, 'static path')
dd3cc8 1222         self.assertEqual(request.path, 'tests:abc')
0c29cf 1223         self.assertEqual(request.kw, {'_app_url': ''})
MM 1224
b5c0cb 1225
fb90f0 1226 class Test_current_route_url(unittest.TestCase):
CM 1227     def _callFUT(self, request, *elements, **kw):
1228         from pyramid.url import current_route_url
0c29cf 1229
fb90f0 1230         return current_route_url(request, *elements, **kw)
CM 1231
1232     def _makeRequest(self):
1233         class Request(object):
1234             def current_route_url(self, *elements, **kw):
1235                 self.elements = elements
1236                 self.kw = kw
1237                 return 'current route url'
0c29cf 1238
fb90f0 1239         return Request()
CM 1240
1241     def test_it(self):
1242         request = self._makeRequest()
1243         result = self._callFUT(request, 'abc', _app_url='')
1244         self.assertEqual(result, 'current route url')
1245         self.assertEqual(request.elements, ('abc',))
0c29cf 1246         self.assertEqual(request.kw, {'_app_url': ''})
MM 1247
45d08c 1248
12cef0 1249 class Test_current_route_path(unittest.TestCase):
CM 1250     def _callFUT(self, request, *elements, **kw):
1251         from pyramid.url import current_route_path
0c29cf 1252
12cef0 1253         return current_route_path(request, *elements, **kw)
CM 1254
1255     def _makeRequest(self):
1256         class Request(object):
1257             def current_route_path(self, *elements, **kw):
1258                 self.elements = elements
1259                 self.kw = kw
1260                 return 'current route path'
0c29cf 1261
12cef0 1262         return Request()
CM 1263
1264     def test_it(self):
1265         request = self._makeRequest()
1266         result = self._callFUT(request, 'abc', _anchor='abc')
1267         self.assertEqual(result, 'current route path')
1268         self.assertEqual(request.elements, ('abc',))
0c29cf 1269         self.assertEqual(request.kw, {'_anchor': 'abc'})
MM 1270
12cef0 1271
33b638 1272 class Test_external_static_url_integration(unittest.TestCase):
TL 1273     def setUp(self):
1274         self.config = testing.setUp()
1275
1276     def tearDown(self):
1277         testing.tearDown()
1278
1279     def _makeRequest(self):
84367e 1280         from pyramid.request import Request
0c29cf 1281
33b638 1282         return Request.blank('/')
TL 1283
1284     def test_generate_external_url(self):
1285         self.config.add_route('acme', 'https://acme.org/path/{foo}')
1286         request = self._makeRequest()
1287         request.registry = self.config.registry
84367e 1288         self.assertEqual(
0c29cf 1289             request.route_url('acme', foo='bar'), 'https://acme.org/path/bar'
MM 1290         )
33b638 1291
TL 1292     def test_generate_external_url_without_scheme(self):
1293         self.config.add_route('acme', '//acme.org/path/{foo}')
1294         request = self._makeRequest()
1295         request.registry = self.config.registry
84367e 1296         self.assertEqual(
0c29cf 1297             request.route_url('acme', foo='bar'), 'http://acme.org/path/bar'
MM 1298         )
33b638 1299
TL 1300     def test_generate_external_url_with_explicit_scheme(self):
1301         self.config.add_route('acme', '//acme.org/path/{foo}')
1302         request = self._makeRequest()
1303         request.registry = self.config.registry
84367e 1304         self.assertEqual(
MM 1305             request.route_url('acme', foo='bar', _scheme='https'),
0c29cf 1306             'https://acme.org/path/bar',
MM 1307         )
33b638 1308
edbc1d 1309     def test_generate_external_url_with_explicit_app_url(self):
TL 1310         self.config.add_route('acme', 'http://acme.org/path/{foo}')
1311         request = self._makeRequest()
1312         request.registry = self.config.registry
0c29cf 1313         self.assertRaises(
MM 1314             ValueError,
1315             request.route_url,
1316             'acme',
1317             foo='bar',
1318             _app_url='http://fakeme.com',
1319         )
edbc1d 1320
df413c 1321     def test_generate_external_url_route_path(self):
TL 1322         self.config.add_route('acme', 'https://acme.org/path/{foo}')
1323         request = self._makeRequest()
1324         request.registry = self.config.registry
d07d16 1325         self.assertRaises(ValueError, request.route_path, 'acme', foo='bar')
df413c 1326
84367e 1327     def test_generate_external_url_with_pregenerator(self):
MM 1328         def pregenerator(request, elements, kw):
1329             kw['_query'] = {'q': 'foo'}
1330             return elements, kw
0c29cf 1331
MM 1332         self.config.add_route(
1333             'acme', 'https://acme.org/path/{foo}', pregenerator=pregenerator
1334         )
84367e 1335         request = self._makeRequest()
MM 1336         request.registry = self.config.registry
1337         self.assertEqual(
1338             request.route_url('acme', foo='bar'),
0c29cf 1339             'https://acme.org/path/bar?q=foo',
MM 1340         )
84367e 1341
MM 1342     def test_external_url_with_route_prefix(self):
1343         def includeme(config):
1344             config.add_route('acme', '//acme.org/{foo}')
0c29cf 1345
84367e 1346         self.config.include(includeme, route_prefix='some_prefix')
MM 1347         request = self._makeRequest()
1348         request.registry = self.config.registry
1349         self.assertEqual(
0c29cf 1350             request.route_url('acme', foo='bar'), 'http://acme.org/bar'
MM 1351         )
1352
df413c 1353
efd61e 1354 class Test_with_route_prefix(unittest.TestCase):
HS 1355     def setUp(self):
1356         self.config = testing.setUp()
1357
1358     def tearDown(self):
1359         testing.tearDown()
1360
1361     def _makeRequest(self, route):
1362         from pyramid.request import Request
0c29cf 1363
efd61e 1364         return Request.blank(route)
HS 1365
1366     def test_old_route_is_preserved(self):
1367         self.config.route_prefix = 'old_prefix'
1368         with self.config.route_prefix_context('new_addon'):
1369             assert 'new_addon' in self.config.route_prefix
1370
1371         assert 'old_prefix' == self.config.route_prefix
1372
1373     def test_route_prefix_none(self):
1374         self.config.route_prefix = 'old_prefix'
1375         with self.config.route_prefix_context(None):
1376             assert 'old_prefix' == self.config.route_prefix
1377
1378         assert 'old_prefix' == self.config.route_prefix
1379
1380     def test_route_prefix_empty(self):
1381         self.config.route_prefix = 'old_prefix'
1382         with self.config.route_prefix_context(''):
1383             assert 'old_prefix' == self.config.route_prefix
1384
1385         assert 'old_prefix' == self.config.route_prefix
1386
1387     def test_route_has_prefix(self):
1388         with self.config.route_prefix_context('bar'):
1389             self.config.add_route('acme', '/foo')
1390         request = self._makeRequest('/')
0c29cf 1391         self.assertEqual(request.route_url('acme'), 'http://localhost/bar/foo')
efd61e 1392
HS 1393     def test_route_does_not_have_prefix(self):
1394         with self.config.route_prefix_context('bar'):
1395             pass
1396
1397         self.config.add_route('acme', '/foo')
1398         request = self._makeRequest('/')
0c29cf 1399         self.assertEqual(request.route_url('acme'), 'http://localhost/foo')
efd61e 1400
HS 1401     def test_error_reset_prefix(self):
1402         self.config.route_prefix = 'old_prefix'
1403
1404         try:
1405             with self.config.route_prefix_context('new_prefix'):
1406                 raise RuntimeError
1407         except RuntimeError:
1408             pass
1409
1410         assert self.config.route_prefix == 'old_prefix'
1411
0c29cf 1412
7ae0c2 1413 class DummyContext(object):
CM 1414     def __init__(self, next=None):
1415         self.next = next
0c29cf 1416
MM 1417
5a11c0 1418 class DummyRoutesMapper:
05c023 1419     raise_exc = None
0c29cf 1420
70f1cd 1421     def __init__(self, route=None, raise_exc=False):
CM 1422         self.route = route
750ce4 1423
70f1cd 1424     def get_route(self, route_name):
CM 1425         return self.route
1426
0c29cf 1427
70f1cd 1428 class DummyRoute:
CM 1429     pregenerator = None
5653d1 1430     name = 'route'
0c29cf 1431
70f1cd 1432     def __init__(self, result='/1/2/3'):
CM 1433         self.result = result
1434
1435     def generate(self, kw):
f0b74a 1436         self.kw = kw
05c023 1437         return self.result
0c29cf 1438
MM 1439
b29429 1440 class DummyStaticURLInfo:
CM 1441     def __init__(self, result):
1442         self.result = result
1443
1444     def generate(self, path, request, **kw):
1445         self.args = path, request, kw
1446         return self.result
0c29cf 1447
MM 1448
b8c797 1449 def makeabs(*elements):
0c29cf 1450     if WIN:  # pragma: no cover
8064bd 1451         return r'c:\\' + os.path.sep.join(elements)
CM 1452     else:
1453         return os.path.sep + os.path.sep.join(elements)