summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2013-08-29 21:25:34 -0400
committerChris McDonough <chrism@plope.com>2013-08-29 21:25:34 -0400
commit60aeef08eb740a99aae54cd7797a20cd328e6413 (patch)
tree639134c9ac91674e6cbc462e2e9a20b14d5f18d0
parentdb0185ff8516b852aad0a1bdb0cbcee63d28c4d2 (diff)
downloadpyramid-60aeef08eb740a99aae54cd7797a20cd328e6413.tar.gz
pyramid-60aeef08eb740a99aae54cd7797a20cd328e6413.tar.bz2
pyramid-60aeef08eb740a99aae54cd7797a20cd328e6413.zip
resource_url coverage
-rw-r--r--pyramid/tests/test_url.py135
-rw-r--r--pyramid/url.py17
2 files changed, 142 insertions, 10 deletions
diff --git a/pyramid/tests/test_url.py b/pyramid/tests/test_url.py
index 8a55ab328..30dad86fd 100644
--- a/pyramid/tests/test_url.py
+++ b/pyramid/tests/test_url.py
@@ -46,11 +46,12 @@ class TestURLMethodsMixin(unittest.TestCase):
from pyramid.interfaces import IResourceURL
from zope.interface import Interface
class DummyResourceURL(object):
- def __init__(self, context, request):
- self.physical_path = '/context/'
- self.virtual_path = '/context/'
+ physical_path = '/context/'
+ virtual_path = '/context/'
+ def __init__(self, context, request): pass
reg.registerAdapter(DummyResourceURL, (Interface, Interface),
IResourceURL)
+ return DummyResourceURL
def test_resource_url_root_default(self):
request = self._makeOne()
@@ -255,6 +256,134 @@ class TestURLMethodsMixin(unittest.TestCase):
root.__resource_url__ = resource_url
result = request.resource_url(root)
self.assertEqual(result, 'http://example.com/contextabc/')
+
+ def test_resource_url_with_route_name_no_remainder_on_adapter(self):
+ from pyramid.interfaces import IRoutesMapper
+ environ = {
+ 'wsgi.url_scheme':'http',
+ 'SERVER_PORT':'8080',
+ 'SERVER_NAME':'example.com',
+ }
+ request = self._makeOne(environ)
+ adapter = self._registerResourceURL(request.registry)
+ # no virtual_path_tuple on adapter
+ adapter.virtual_path = '/a/b/c/'
+ route = DummyRoute('/1/2/3')
+ route.remainder_name = 'fred'
+ mapper = DummyRoutesMapper(route)
+ request.registry.registerUtility(mapper, IRoutesMapper)
+ root = DummyContext()
+ result = request.resource_url(root, route_name='foo')
+ self.assertEqual(result, 'http://example.com:5432/1/2/3')
+ self.assertEqual(route.kw, {'fred': ('', 'a', 'b', 'c', '')})
+
+ def test_resource_url_with_route_name_remainder_on_adapter(self):
+ from pyramid.interfaces import IRoutesMapper
+ environ = {
+ 'wsgi.url_scheme':'http',
+ 'SERVER_PORT':'8080',
+ 'SERVER_NAME':'example.com',
+ }
+ request = self._makeOne(environ)
+ adapter = self._registerResourceURL(request.registry)
+ # virtual_path_tuple on adapter
+ adapter.virtual_path_tuple = ('', 'a', 'b', 'c', '')
+ route = DummyRoute('/1/2/3')
+ route.remainder_name = 'fred'
+ mapper = DummyRoutesMapper(route)
+ request.registry.registerUtility(mapper, IRoutesMapper)
+ root = DummyContext()
+ result = request.resource_url(root, route_name='foo')
+ self.assertEqual(result, 'http://example.com:5432/1/2/3')
+ self.assertEqual(route.kw, {'fred': ('', 'a', 'b', 'c', '')})
+
+ def test_resource_url_with_route_name_and_app_url(self):
+ from pyramid.interfaces import IRoutesMapper
+ environ = {
+ 'wsgi.url_scheme':'http',
+ 'SERVER_PORT':'8080',
+ 'SERVER_NAME':'example.com',
+ }
+ request = self._makeOne(environ)
+ adapter = self._registerResourceURL(request.registry)
+ # virtual_path_tuple on adapter
+ adapter.virtual_path_tuple = ('', 'a', 'b', 'c', '')
+ route = DummyRoute('/1/2/3')
+ route.remainder_name = 'fred'
+ mapper = DummyRoutesMapper(route)
+ request.registry.registerUtility(mapper, IRoutesMapper)
+ root = DummyContext()
+ result = request.resource_url(root, route_name='foo', app_url='app_url')
+ self.assertEqual(result, 'app_url/1/2/3')
+ self.assertEqual(route.kw, {'fred': ('', 'a', 'b', 'c', '')})
+
+ def test_resource_url_with_route_name_and_scheme_host_port_etc(self):
+ from pyramid.interfaces import IRoutesMapper
+ environ = {
+ 'wsgi.url_scheme':'http',
+ 'SERVER_PORT':'8080',
+ 'SERVER_NAME':'example.com',
+ }
+ request = self._makeOne(environ)
+ adapter = self._registerResourceURL(request.registry)
+ # virtual_path_tuple on adapter
+ adapter.virtual_path_tuple = ('', 'a', 'b', 'c', '')
+ route = DummyRoute('/1/2/3')
+ route.remainder_name = 'fred'
+ mapper = DummyRoutesMapper(route)
+ request.registry.registerUtility(mapper, IRoutesMapper)
+ root = DummyContext()
+ result = request.resource_url(root, route_name='foo', scheme='scheme',
+ host='host', port='port', query={'a':'1'},
+ anchor='anchor')
+ self.assertEqual(result, 'scheme://host:port/1/2/3?a=1#anchor')
+ self.assertEqual(route.kw, {'fred': ('', 'a', 'b', 'c', '')})
+
+ def test_resource_url_with_route_name_and_route_kwargs(self):
+ from pyramid.interfaces import IRoutesMapper
+ environ = {
+ 'wsgi.url_scheme':'http',
+ 'SERVER_PORT':'8080',
+ 'SERVER_NAME':'example.com',
+ }
+ request = self._makeOne(environ)
+ adapter = self._registerResourceURL(request.registry)
+ # virtual_path_tuple on adapter
+ adapter.virtual_path_tuple = ('', 'a', 'b', 'c', '')
+ route = DummyRoute('/1/2/3')
+ route.remainder_name = 'fred'
+ mapper = DummyRoutesMapper(route)
+ request.registry.registerUtility(mapper, IRoutesMapper)
+ root = DummyContext()
+ result = request.resource_url(
+ root, route_name='foo', route_kw={'a':'1', 'b':'2'})
+ self.assertEqual(result, 'http://example.com:5432/1/2/3')
+ self.assertEqual(
+ route.kw,
+ {'fred': ('', 'a', 'b', 'c', ''),
+ 'a':'1',
+ 'b':'2'}
+ )
+
+ def test_resource_url_with_route_name_and_elements(self):
+ from pyramid.interfaces import IRoutesMapper
+ environ = {
+ 'wsgi.url_scheme':'http',
+ 'SERVER_PORT':'8080',
+ 'SERVER_NAME':'example.com',
+ }
+ request = self._makeOne(environ)
+ adapter = self._registerResourceURL(request.registry)
+ # virtual_path_tuple on adapter
+ adapter.virtual_path_tuple = ('', 'a', 'b', 'c', '')
+ route = DummyRoute('/1/2/3')
+ route.remainder_name = 'fred'
+ mapper = DummyRoutesMapper(route)
+ request.registry.registerUtility(mapper, IRoutesMapper)
+ root = DummyContext()
+ result = request.resource_url(root, 'e1', 'e2', route_name='foo')
+ self.assertEqual(result, 'http://example.com:5432/1/2/3/e1/e2')
+ self.assertEqual(route.kw, {'fred': ('', 'a', 'b', 'c', '')})
def test_resource_path(self):
request = self._makeOne()
diff --git a/pyramid/url.py b/pyramid/url.py
index c2009e773..d8fe997d9 100644
--- a/pyramid/url.py
+++ b/pyramid/url.py
@@ -453,8 +453,10 @@ class URLMethodsMixin(object):
**kw,
)
- If route_kw is passed, but route_name is not passed, a
- :exc:`ValueError` will be raised.
+ If ``route_kw`` is passed, but ``route_name`` is not passed,
+ ``route_kw`` will be ignored. If ``route_name`` is passed, the
+ ``__resource_url__`` method of the resource passed is ignored
+ unconditionally.
The ``route_name`` and ``route_kw`` arguments were added in Pyramid
1.5.
@@ -511,7 +513,7 @@ class URLMethodsMixin(object):
resource_url = url_adapter()
else:
- # newer-style IResourceURL adapter (Pyramid 1.3 and after)
+ # IResourceURL adapter (Pyramid 1.3 and after)
app_url = None
scheme = None
host = None
@@ -520,14 +522,16 @@ class URLMethodsMixin(object):
if 'route_name' in kw:
newkw = {}
route_name = kw['route_name']
- remainder = getattr(resource_url, 'virtual_path_tuple', None)
+ remainder = getattr(url_adapter, 'virtual_path_tuple', None)
if remainder is None:
# older user-supplied IResourceURL adapter without 1.5
# virtual_path_tuple
- remainder = tuple(resource_url.virtual_path.split('/'))
+ remainder = tuple(url_adapter.virtual_path.split('/'))
newkw['_remainder'] = remainder
- for name in ('app_url', 'scheme', 'host', 'port'):
+ for name in (
+ 'app_url', 'scheme', 'host', 'port', 'query', 'anchor'
+ ):
val = kw.get(name, None)
if val is not None:
newkw['_' + name] = val
@@ -536,7 +540,6 @@ class URLMethodsMixin(object):
route_kw = kw.get('route_kw')
if route_kw is not None:
newkw.update(route_kw)
-
return self.route_url(route_name, *elements, **newkw)
if 'app_url' in kw: