Revision b35e8daf

b/kamaki/clients/connection/kamakicon.py
135 135
        params = dict(self.params)
136 136
        params.update(extra_params)
137 137
        for i, (key, val) in enumerate(params.items()):
138
            if isinstance(val, unicode):
139
                val = quote(val.encode('utf-8'))
138 140
            url += '%s%s' % ('&' if i else '?', key)
139 141
            if val:
140 142
                url += '=%s' % val
b/kamaki/clients/connection/test.py
32 32
# or implied, of GRNET S.A.
33 33

  
34 34
from unittest import TestCase, TestSuite, makeSuite, TextTestRunner
35
from mock import Mock, patch
35
from mock import Mock, patch, call
36 36
from random import randrange
37
from urllib2 import quote
37 38

  
38 39
from kamaki.clients import connection
39 40
from kamaki.clients.connection import errors, kamakicon
40 41

  
41 42

  
43
def _encode(v):
44
    if v and isinstance(v, unicode):
45
        return quote(v.encode('utf-8'))
46
    return v
47

  
48

  
42 49
class KamakiConnection(TestCase):
43 50
    v_samples = {'title': 'value', 5: 'value'}
44 51
    n_samples = {'title': None, 5: None}
......
47 54
    def setUp(self):
48 55
        from kamaki.clients.connection import KamakiConnection as HTTPC
49 56
        self.conn = HTTPC()
57
        self.conn.reset_headers()
58
        self.conn.reset_params()
50 59

  
51 60
    def test_poolsize(self):
52 61

  
......
154 163

  
155 164
    def setUp(self):
156 165
        self.conn = kamakicon.KamakiHTTPConnection()
166
        self.conn.reset_params()
167
        self.conn.reset_headers()
157 168

  
158 169
    def test__retrieve_connection_info(self):
159 170
        async_params = dict(param1='val1', param2=None, param3=42)
......
188 199
            method='GET',
189 200
            async_headers=dict(),
190 201
            async_params=dict())
202
        utf_test = u'\u03a6\u03bf\u03cd\u03c4\u03c3\u03bf\u03c2'
203
        utf_dict = dict(utf=utf_test)
204
        ascii_dict = dict(ascii1='myAscii', ascii2=None)
205
        kwargs0 = dict(
206
            data='',
207
            method='get',
208
            async_headers=utf_dict,
209
            async_params=ascii_dict)
210

  
211
        def get_expected():
212
            expected = []
213
            for k, v in kwargs0['async_params'].items():
214
                v = _encode(v)
215
                expected.append(('%s=%s' % (k, v)) if v else ('%s' % k))
216
            return '&'.join(expected)
191 217

  
192 218
        KCError = errors.KamakiConnectionError
193 219
        fakecon = HTTPConnection('X', 'Y')
194 220

  
195 221
        with patch.object(http, 'get_http_connection', return_value=fakecon):
196
            with patch.object(HTTPConnection, 'request', return_value=None):
222
            with patch.object(HTTPConnection, 'request') as request:
197 223
                r = pr(**kwargs)
198 224
                self.assertTrue(isinstance(r, kamakicon.KamakiHTTPResponse))
225
                self.assertEquals(
226
                    request.mock_calls[-1],
227
                    call(body='', headers={}, url='/', method='GET'))
228

  
229
                pr(**kwargs0)
230

  
231
                exp_headers = dict(kwargs0['async_headers'])
232
                exp_headers['utf'] = _encode(exp_headers['utf'])
233

  
234
                self.assertEquals(
235
                    request.mock_calls[-1],
236
                    call(
237
                        body=kwargs0['data'],
238
                        headers=exp_headers,
239
                        url='/?%s' % get_expected(),
240
                        method=kwargs0['method'].upper()))
241

  
242
                self.conn = kamakicon.KamakiHTTPConnection()
243
                (kwargs0['async_params'], kwargs0['async_headers']) = (
244
                    kwargs0['async_headers'], kwargs0['async_params'])
245
                kwargs0['async_headers']['ascii2'] = 'None'
246
                self.conn.perform_request(**kwargs0)
247
                self.assertEquals(
248
                    request.mock_calls[-1],
249
                    call(
250
                        body=kwargs0['data'],
251
                        headers=kwargs0['async_headers'],
252
                        url='/?%s' % get_expected(),
253
                        method=kwargs0['method'].upper()))
199 254

  
200 255
            err = IOError('IO Error')
201 256
            with patch.object(HTTPConnection, 'request', side_effect=err):

Also available in: Unified diff