Revision 6a6175c0

b/kamaki/clients/__init__.py
183 183
        E.g. in most queries the 'X-Auth-Token' header might be the same for
184 184
        all, but the 'Range' header might be different from request to request.
185 185
        """
186
        assert isinstance(method, str) or isinstance(method, unicode)
187
        assert method
188
        assert isinstance(path, str) or isinstance(path, unicode)
189
        assert path
186 190
        try:
187 191
            success = kwargs.pop('success', 200)
188

  
189 192
            data = kwargs.pop('data', None)
190 193
            self.http_client.headers.setdefault('X-Auth-Token', self.token)
191 194

  
......
236 239
                errstr = ('%s' % type(err))[7:-2]
237 240
            status = getattr(err, 'status', getattr(err, 'errno', 0))
238 241
            raise ClientError('%s\n' % errstr, status=status)
239

  
240
        self.http_client.reset_headers()
241
        self.http_client.reset_params()
242
        finally:
243
            self.http_client.reset_headers()
244
            self.http_client.reset_params()
242 245

  
243 246
        if success is not None:
244 247
            # Success can either be an int or a collection
b/kamaki/clients/test.py
150 150
                self.assertFalse(t.exception)
151 151

  
152 152

  
153
class FR(object):
154
    json = None
155
    text = None
156
    headers = dict()
157
    content = json
158
    status = None
159
    status_code = 200
160

  
161
    def release(self):
162
        pass
163

  
164

  
153 165
class FakeConnection(object):
154 166
    """A fake Connection class"""
155 167

  
168
    headers = dict()
169
    params = dict()
170

  
156 171
    def __init__(self):
157 172
        pass
158 173

  
159 174
    def set_header(self, name, value):
160 175
        pass
161 176

  
162
    def set_param(self, name, value):
163
        pass
164

  
177
    def reset_headers(self):
178
        self.headers = {}
165 179

  
166
class FR(object):
167
    json = None
168
    text = None
169
    headers = {}
170
    content = json
171
    status = None
172
    status_code = 200
180
    def set_param(self, name, value):
181
        self.params = {}
173 182

  
174
    def release(self):
183
    def reset_params(self):
175 184
        pass
176 185

  
186
    def perform_request(self, *args):
187
        return FR()
188

  
177 189

  
178 190
class Client(TestCase):
179 191

  
......
197 209
        FR.text = None
198 210
        FR.status = None
199 211
        FR.status_code = 200
212
        FakeConnection.headers = dict()
213
        self.client.token = self.token
200 214

  
201 215
    def test___init__(self):
202 216
        self.assertEqual(self.client.base_url, self.base_url)
......
299 313
            else:
300 314
                self.assertEqual(num_of_calls, len(SP.mock_calls))
301 315

  
316
    @patch('%s.FakeConnection.perform_request' % __name__, return_value=FR())
317
    def test_request(self, PR):
318
        for args in product(
319
                ('get', '', dict(method='get')),
320
                ('/some/path', None, ['some', 'path']),
321
                (dict(), dict(h1='v1'), dict(h1='v2', h2='v2')),
322
                (dict(), dict(p1='v1'), dict(p1='v2', p2=None, p3='v3')),
323
                (dict(), dict(data='some data'), dict(
324
                    success=400,
325
                    json=dict(k2='v2', k1='v1')))):
326
            method, path, kwargs = args[0], args[1], args[-1]
327
            args = args[:-1]
328
            if not (isinstance(method, str) and method and isinstance(
329
                    path, str) and path):
330
                self.assertRaises(
331
                    AssertionError,
332
                    self.client.request,
333
                    *args, **kwargs)
334
            else:
335
                atoken = 'a70k3n_%s' % randint(1, 30)
336
                self.client.token = atoken
337
                if 'success' in kwargs:
338
                    self.assertRaises(
339
                        self.CE,
340
                        self.client.request,
341
                        *args, **kwargs)
342
                    FR.status_code = kwargs['success']
343
                else:
344
                    FR.status_code = 200
345
                self.client.request(*args, **kwargs)
346
                data = kwargs.get(
347
                    'data',
348
                    '{"k2": "v2", "k1": "v1"}' if 'json' in kwargs else None)
349
                self.assertEqual(self.client.http_client.url, self.base_url)
350
                self.assertEqual(self.client.http_client.path, path)
351
                self.assertEqual(
352
                    PR.mock_calls[-1],
353
                    call(method, data, *args[2:]))
354
                self.assertEqual(self.client.http_client.headers, dict())
355
                self.assertEqual(self.client.http_client.params, dict())
356

  
357
    @patch('kamaki.clients.Client.request', return_value='lala')
358
    def _test_foo(self, foo, request):
359
        method = getattr(self.client, foo)
360
        r = method('path', k='v')
361
        self.assertEqual(r, 'lala')
362
        request.assert_called_once_with(foo, 'path', k='v')
363

  
364
    def test_delete(self):
365
        self._test_foo('delete')
366

  
367
    def test_get(self):
368
        self._test_foo('get')
369

  
370
    def test_head(self):
371
        self._test_foo('head')
372

  
373
    def test_post(self):
374
        self._test_foo('post')
375

  
376
    def test_put(self):
377
        self._test_foo('put')
378

  
379
    def test_copy(self):
380
        self._test_foo('copy')
381

  
382
    def test_move(self):
383
        self._test_foo('move')
384

  
302 385

  
303 386
#  TestCase auxiliary methods
304 387

  

Also available in: Unified diff