diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-01-05 23:36:27 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-01-05 23:36:27 +0000 |
| commit | 7ae0c2522bbb2b026bc0370dbb1b1608f146137d (patch) | |
| tree | d46aa3e872eaf70d900af720b7458efd2ed0a189 /repoze/bfg/tests | |
| parent | 96d8a517bf195a1ce0787e6ec16c3db82bef98f5 (diff) | |
| download | pyramid-7ae0c2522bbb2b026bc0370dbb1b1608f146137d.tar.gz pyramid-7ae0c2522bbb2b026bc0370dbb1b1608f146137d.tar.bz2 pyramid-7ae0c2522bbb2b026bc0370dbb1b1608f146137d.zip | |
New Modules
- A new module ``repoze.bfg.url`` has been added. It contains the
``model_url`` API (moved from ``repoze.bfg.traversal``) and an
implementation of ``urlencode`` (like Python's
``urllib.urlencode``) which can handle Unicode keys and values in
parameters to the ``query`` argument.
Deprecations
- The ``model_url`` function has been moved from
``repoze.bfg.traversal`` into ``repoze.bfg.url``. It can still
be imported from ``repoze.bfg.traversal`` but an import from
``repoze.bfg.traversal`` will emit a DeprecationWarning.
Features
- The ``repoze.bfg.url.model_url`` API (nee'
``repoze.bfg.traversal.model_url``) now accepts and honors a
keyword argument named ``query``. The value of this argument
will be used to compose a query string, which will be attached to
the generated URL before it is returned. See the API docs (in
the docs directory or `on the web
<http://static.repoze.org/bfgdocs>`_) for more information.
Diffstat (limited to 'repoze/bfg/tests')
| -rw-r--r-- | repoze/bfg/tests/test_traversal.py | 80 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_url.py | 134 |
2 files changed, 134 insertions, 80 deletions
diff --git a/repoze/bfg/tests/test_traversal.py b/repoze/bfg/tests/test_traversal.py index 70938cbf6..dcb47e6ed 100644 --- a/repoze/bfg/tests/test_traversal.py +++ b/repoze/bfg/tests/test_traversal.py @@ -225,86 +225,6 @@ class FindInterfaceTests(unittest.TestCase): result = self._callFUT(baz, IFoo) self.assertEqual(result.__name__, 'root') -class ModelURLTests(unittest.TestCase): - def _callFUT(self, model, request, *elements): - from repoze.bfg.traversal import model_url - return model_url(model, request, *elements) - - def test_extra_args(self): - baz = DummyContext() - bar = DummyContext(baz) - foo = DummyContext(bar) - root = DummyContext(foo) - root.__parent__ = None - root.__name__ = None - foo.__parent__ = root - foo.__name__ = 'foo ' - bar.__parent__ = foo - bar.__name__ = 'bar' - baz.__parent__ = bar - baz.__name__ = 'baz' - request = DummyRequest() - result = self._callFUT(baz, request, 'this/theotherthing', 'that') - - self.assertEqual( - result, - 'http://example.com:5432/foo%20/bar/baz/this/theotherthing/that') - - def test_root_default_app_url(self): - root = DummyContext() - root.__parent__ = None - root.__name__ = None - request = DummyRequest() - result = self._callFUT(root, request) - self.assertEqual(result, 'http://example.com:5432/') - - def test_nonroot_default_app_url(self): - root = DummyContext() - root.__parent__ = None - root.__name__ = None - other = DummyContext() - other.__parent__ = root - other.__name__ = 'nonroot object' - request = DummyRequest() - result = self._callFUT(other, request) - self.assertEqual(result, 'http://example.com:5432/nonroot%20object/') - - def test_unicode_mixed_with_bytes_in_model_names(self): - root = DummyContext() - root.__parent__ = None - root.__name__ = None - one = DummyContext() - one.__parent__ = root - one.__name__ = unicode('La Pe\xc3\xb1a', 'utf-8') - two = DummyContext() - two.__parent__ = one - two.__name__ = 'La Pe\xc3\xb1a' - request = DummyRequest() - result = self._callFUT(two, request) - self.assertEqual(result, - 'http://example.com:5432/La%20Pe%C3%B1a/La%20Pe%C3%B1a/') - - def test_unicode_in_element_names(self): - uc = unicode('La Pe\xc3\xb1a', 'utf-8') - root = DummyContext() - root.__parent__ = None - root.__name__ = None - one = DummyContext() - one.__parent__ = root - one.__name__ = uc - request = DummyRequest() - result = self._callFUT(one, request, uc) - self.assertEqual(result, - 'http://example.com:5432/La%20Pe%C3%B1a/La%20Pe%C3%B1a') - - def test_element_names_url_quoted(self): - root = DummyContext() - root.__parent__ = None - root.__name__ = None - request = DummyRequest() - result = self._callFUT(root, request, 'a b c') - self.assertEqual(result, 'http://example.com:5432/a%20b%20c') - class FindRootTests(unittest.TestCase): def _callFUT(self, context): from repoze.bfg.traversal import find_root diff --git a/repoze/bfg/tests/test_url.py b/repoze/bfg/tests/test_url.py new file mode 100644 index 000000000..2a47068cd --- /dev/null +++ b/repoze/bfg/tests/test_url.py @@ -0,0 +1,134 @@ +import unittest + +class ModelURLTests(unittest.TestCase): + def _callFUT(self, model, request, *elements, **kw): + from repoze.bfg.url import model_url + return model_url(model, request, *elements, **kw) + + def test_extra_args(self): + baz = DummyContext() + bar = DummyContext(baz) + foo = DummyContext(bar) + root = DummyContext(foo) + root.__parent__ = None + root.__name__ = None + foo.__parent__ = root + foo.__name__ = 'foo ' + bar.__parent__ = foo + bar.__name__ = 'bar' + baz.__parent__ = bar + baz.__name__ = 'baz' + request = DummyRequest() + result = self._callFUT(baz, request, 'this/theotherthing', 'that') + + self.assertEqual( + result, + 'http://example.com:5432/foo%20/bar/baz/this/theotherthing/that') + + def test_root_default_app_url(self): + root = DummyContext() + root.__parent__ = None + root.__name__ = None + request = DummyRequest() + result = self._callFUT(root, request) + self.assertEqual(result, 'http://example.com:5432/') + + def test_nonroot_default_app_url(self): + root = DummyContext() + root.__parent__ = None + root.__name__ = None + other = DummyContext() + other.__parent__ = root + other.__name__ = 'nonroot object' + request = DummyRequest() + result = self._callFUT(other, request) + self.assertEqual(result, 'http://example.com:5432/nonroot%20object/') + + def test_unicode_mixed_with_bytes_in_model_names(self): + root = DummyContext() + root.__parent__ = None + root.__name__ = None + one = DummyContext() + one.__parent__ = root + one.__name__ = unicode('La Pe\xc3\xb1a', 'utf-8') + two = DummyContext() + two.__parent__ = one + two.__name__ = 'La Pe\xc3\xb1a' + request = DummyRequest() + result = self._callFUT(two, request) + self.assertEqual(result, + 'http://example.com:5432/La%20Pe%C3%B1a/La%20Pe%C3%B1a/') + + def test_unicode_in_element_names(self): + uc = unicode('La Pe\xc3\xb1a', 'utf-8') + root = DummyContext() + root.__parent__ = None + root.__name__ = None + one = DummyContext() + one.__parent__ = root + one.__name__ = uc + request = DummyRequest() + result = self._callFUT(one, request, uc) + self.assertEqual(result, + 'http://example.com:5432/La%20Pe%C3%B1a/La%20Pe%C3%B1a') + + def test_element_names_url_quoted(self): + root = DummyContext() + root.__parent__ = None + root.__name__ = None + request = DummyRequest() + result = self._callFUT(root, request, 'a b c') + self.assertEqual(result, 'http://example.com:5432/a%20b%20c') + + def test_with_query(self): + root = DummyContext() + root.__parent__ = None + root.__name__ = None + request = DummyRequest() + result = self._callFUT(root, request, 'a', query=[('a', 1), ('b', 2)]) + self.assertEqual(result, 'http://example.com:5432/a?a=1&b=2') + + +class UrlEncodeTests(unittest.TestCase): + def _callFUT(self, query, doseq=False): + from repoze.bfg.url import urlencode + return urlencode(query, doseq) + + def test_ascii_only(self): + result = self._callFUT([('a',1), ('b',2)]) + self.assertEqual(result, 'a=1&b=2') + + def test_unicode_key(self): + la = unicode('LaPe\xc3\xb1a', 'utf-8') + result = self._callFUT([(la, 1), ('b',2)]) + self.assertEqual(result, 'LaPe%C3%B1a=1&b=2') + + def test_unicode_val_single(self): + la = unicode('LaPe\xc3\xb1a', 'utf-8') + result = self._callFUT([('a', la), ('b',2)]) + self.assertEqual(result, 'a=LaPe%C3%B1a&b=2') + + def test_unicode_val_multiple(self): + la = [unicode('LaPe\xc3\xb1a', 'utf-8')] * 2 + result = self._callFUT([('a', la), ('b',2)], doseq=True) + self.assertEqual(result, 'a=LaPe%C3%B1a&a=LaPe%C3%B1a&b=2') + + def test_dict(self): + result = self._callFUT({'a':1}) + self.assertEqual(result, 'a=1') + +class DummyContext(object): + def __init__(self, next=None): + self.next = next + + def __getitem__(self, name): + if self.next is None: + raise KeyError, name + return self.next + +class DummyRequest: + application_url = 'http://example.com:5432' # app_url never ends with slash + +class DummySettings: + def __init__(self, **kw): + self.__dict__.update(kw) |
