1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
import unittest
from zope.testing.cleanup import cleanUp
class ModelURLTests(unittest.TestCase):
def setUp(self):
cleanUp()
def tearDown(self):
cleanUp()
def _callFUT(self, model, request, *elements, **kw):
from repoze.bfg.url import model_url
return model_url(model, request, *elements, **kw)
def _registerContextURL(self):
from repoze.bfg.interfaces import IContextURL
from zope.interface import Interface
from zope.component import getGlobalSiteManager
class DummyContextURL(object):
def __init__(self, context, request):
pass
def __call__(self):
return 'http://example.com/context/'
gsm = getGlobalSiteManager()
gsm.registerAdapter(DummyContextURL, (Interface, Interface),
IContextURL)
def test_root_default(self):
self._registerContextURL()
root = DummyContext()
request = DummyRequest()
result = self._callFUT(root, request)
self.assertEqual(result, 'http://example.com/context/')
def test_extra_args(self):
self._registerContextURL()
context = DummyContext()
request = DummyRequest()
result = self._callFUT(context, request, 'this/theotherthing', 'that')
self.assertEqual(
result,
'http://example.com/context/this%2Ftheotherthing/that')
def test_unicode_in_element_names(self):
self._registerContextURL()
uc = unicode('La Pe\xc3\xb1a', 'utf-8')
context = DummyContext()
request = DummyRequest()
result = self._callFUT(context, request, uc)
self.assertEqual(result,
'http://example.com/context/La%20Pe%C3%B1a')
def test_element_names_url_quoted(self):
self._registerContextURL()
context = DummyContext()
request = DummyRequest()
result = self._callFUT(context, request, 'a b c')
self.assertEqual(result, 'http://example.com/context/a%20b%20c')
def test_with_query_dict(self):
self._registerContextURL()
context = DummyContext()
request = DummyRequest()
uc = unicode('La Pe\xc3\xb1a', 'utf-8')
result = self._callFUT(context, request, 'a', query={'a':uc})
self.assertEqual(result,
'http://example.com/context/a?a=La+Pe%C3%B1a')
def test_with_query_seq(self):
self._registerContextURL()
context = DummyContext()
request = DummyRequest()
uc = unicode('La Pe\xc3\xb1a', 'utf-8')
result = self._callFUT(context, request, 'a', query=[('a', 'hi there'),
('b', uc)])
self.assertEqual(result,
'http://example.com/context/a?a=hi+there&b=La+Pe%C3%B1a')
def test_no_IContextURL_registered(self):
# falls back to TraversalContextURL
root = DummyContext()
root.__name__ = ''
root.__parent__ = None
request = DummyRequest()
request.environ = {}
result = self._callFUT(root, request)
self.assertEqual(result, 'http://example.com:5432/')
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
class DummyRequest:
application_url = 'http://example.com:5432' # app_url never ends with slash
|