Revision 6ee6677e

b/snf-django-lib/snf_django/utils/testing.py
132 132
    with patch("snf_django.lib.api.get_token") as get_token:
133 133
        get_token.return_value = "DummyToken"
134 134
        with patch('astakosclient.AstakosClient.get_user_info') as m:
135
            m.return_value = {"uuid": user}
135
            m.return_value = {"uuid": unicode(user, 'utf8')}
136 136
            with patch('astakosclient.AstakosClient.get_quotas') as m2:
137 137
                m2.return_value = {
138 138
                    "system": {
b/snf-pithos-app/pithos/api/test/__init__.py
36 36

  
37 37
from urlparse import urlunsplit, urlsplit
38 38
from xml.dom import minidom
39
from urllib import quote, unquote
39 40

  
40 41
from snf_django.utils.testing import with_settings, astakos_user
41 42

  
......
127 128
    pithos_settings.BACKEND_DB_CONNECTION = db_connection
128 129

  
129 130

  
131
def filter_headers(headers, prefix):
132
    meta = {}
133
    for k, v in headers.iteritems():
134
        if not k.startswith(prefix):
135
            continue
136
        meta[unquote(k[len(prefix):])] = unquote(v)
137
    return meta
138

  
139

  
130 140
class PithosTestSuiteRunner(DjangoTestSuiteRunner):
131 141
    def setup_databases(self, **kwargs):
132 142
        old_names, mirrors = super(PithosTestSuiteRunner,
......
161 171
            self.delete_container_content(c['name'])
162 172
            self.delete_container(c['name'])
163 173

  
164
    def head(self, url, user='user', *args, **kwargs):
174
    def head(self, url, user='user', data={}, follow=False, **extra):
165 175
        with astakos_user(user):
166
            response = self.client.head(url, *args, **kwargs)
176
            extra = dict((quote(k), quote(v)) for k, v in extra.items())
177
            response = self.client.head(url, data, follow, **extra)
167 178
        return response
168 179

  
169
    def get(self, url, user='user', *args, **kwargs):
180
    def get(self, url, user='user', data={}, follow=False, **extra):
170 181
        with astakos_user(user):
171
            response = self.client.get(url, *args, **kwargs)
182
            extra = dict((quote(k), quote(v)) for k, v in extra.items())
183
            response = self.client.get(url, data, follow, **extra)
172 184
        return response
173 185

  
174
    def delete(self, url, user='user', *args, **kwargs):
186
    def delete(self, url, user='user', data={}, follow=False, **extra):
175 187
        with astakos_user(user):
176
            response = self.client.delete(url, *args, **kwargs)
188
            extra = dict((quote(k), quote(v)) for k, v in extra.items())
189
            response = self.client.delete(url, data, follow, **extra)
177 190
        return response
178 191

  
179
    def post(self, url, user='user', *args, **kwargs):
192
    def post(self, url, user='user', data={},
193
             content_type='application/octet-stream', follow=False, **extra):
180 194
        with astakos_user(user):
181
            kwargs.setdefault('content_type', 'application/octet-stream')
182
            response = self.client.post(url, *args, **kwargs)
195
            extra = dict((quote(k), quote(v)) for k, v in extra.items())
196
            response = self.client.post(url, data, content_type, follow,
197
                                        **extra)
183 198
        return response
184 199

  
185
    def put(self, url, user='user', *args, **kwargs):
200
    def put(self, url, user='user', data={},
201
            content_type='application/octet-stream', follow=False, **extra):
186 202
        with astakos_user(user):
187
            kwargs.setdefault('content_type', 'application/octet-stream')
188
            response = self.client.put(url, *args, **kwargs)
203
            extra = dict((quote(k), quote(v)) for k, v in extra.items())
204
            response = self.client.put(url, data, content_type, follow,
205
                                       **extra)
189 206
        return response
190 207

  
191
    def update_account_meta(self, meta):
192
        kwargs = dict(
193
            ('HTTP_X_ACCOUNT_META_%s' % k, str(v)) for k, v in meta.items())
194
        url = join_urls(self.pithos_path, self.user)
195
        r = self.post('%s?update=' % url, **kwargs)
196
        self.assertEqual(r.status_code, 202)
197
        account_meta = self.get_account_meta()
198
        (self.assertTrue('X-Account-Meta-%s' % k in account_meta) for
199
            k in meta.keys())
200
        (self.assertEqual(account_meta['X-Account-Meta-%s' % k], v) for
201
            k, v in meta.items())
202

  
203
    def reset_account_meta(self, meta):
208
    def update_account_meta(self, meta, user=None):
209
        user = user or self.user
204 210
        kwargs = dict(
205 211
            ('HTTP_X_ACCOUNT_META_%s' % k, str(v)) for k, v in meta.items())
206
        url = join_urls(self.pithos_path, self.user)
207
        r = self.post(url, **kwargs)
212
        url = join_urls(self.pithos_path, user)
213
        r = self.post('%s?update=' % url, user=user, **kwargs)
208 214
        self.assertEqual(r.status_code, 202)
209 215
        account_meta = self.get_account_meta()
210
        (self.assertTrue('X-Account-Meta-%s' % k in account_meta) for
211
            k in meta.keys())
212
        (self.assertEqual(account_meta['X-Account-Meta-%s' % k], v) for
213
            k, v in meta.items())
216
        (self.assertTrue(k in account_meta) for k in meta.keys())
217
        (self.assertEqual(account_meta[k], v) for k, v in meta.items())
214 218

  
215
    def delete_account_meta(self, meta):
216
        transform = lambda k: 'HTTP_%s' % k.replace('-', '_').upper()
219
    def delete_account_meta(self, meta, user=None):
220
        user = user or self.user
221
        transform = lambda k: 'HTTP_X_ACCOUNT_META_%s' % k.replace('-', '_').upper()
217 222
        kwargs = dict((transform(k), '') for k, v in meta.items())
218
        url = join_urls(self.pithos_path, self.user)
219
        r = self.post('%s?update=' % url, **kwargs)
223
        url = join_urls(self.pithos_path, user)
224
        r = self.post('%s?update=' % url, user=user, **kwargs)
220 225
        self.assertEqual(r.status_code, 202)
221 226
        account_meta = self.get_account_meta()
222
        (self.assertTrue('X-Account-Meta-%s' % k not in account_meta) for
223
            k in meta.keys())
227
        (self.assertTrue(k not in account_meta) for k in meta.keys())
224 228
        return r
225 229

  
226
    def delete_account_groups(self, groups):
227
        url = join_urls(self.pithos_path, self.user)
228
        r = self.post('%s?update=' % url, **groups)
230
    def delete_account_groups(self, groups, user=None):
231
        user = user or self.user
232
        url = join_urls(self.pithos_path, user)
233
        transform = lambda k: 'HTTP_X_ACCOUNT_GROUP_%s' % k.replace('-', '_').upper()
234
        kwargs = dict((transform(k), '') for k, v in groups.items())
235
        r = self.post('%s?update=' % url, user=user, **kwargs)
229 236
        self.assertEqual(r.status_code, 202)
237
        account_groups = self.get_account_groups()
238
        (self.assertTrue(k not in account_groups) for k in groups.keys())
230 239
        return r
231 240

  
232
    def get_account_info(self, until=None):
233
        url = join_urls(self.pithos_path, self.user)
241
    def get_account_info(self, until=None, user=None):
242
        user = user or self.user
243
        url = join_urls(self.pithos_path, user)
234 244
        if until is not None:
235 245
            parts = list(urlsplit(url))
236 246
            parts[3] = urlencode({
237 247
                'until': until
238 248
            })
239 249
            url = urlunsplit(parts)
240
        r = self.head(url)
250
        r = self.head(url, user=user)
241 251
        self.assertEqual(r.status_code, 204)
242 252
        return r
243 253

  
244
    def get_account_meta(self, until=None):
245
        r = self.get_account_info(until=until)
254
    def get_account_meta(self, until=None, user=None):
255
        prefix = 'X-Account-Meta-'
256
        r = self.get_account_info(until=until, user=user)
246 257
        headers = dict(r._headers.values())
247
        map(headers.pop,
248
            [k for k in headers.keys()
249
                if not k.startswith('X-Account-Meta-')])
250
        return headers
258
        return filter_headers(headers, prefix)
251 259

  
252
    def get_account_groups(self, until=None):
253
        r = self.get_account_info(until=until)
260
    def get_account_groups(self, until=None, user=None):
261
        prefix = 'X-Account-Group-'
262
        r = self.get_account_info(until=until, user=user)
254 263
        headers = dict(r._headers.values())
255
        map(headers.pop,
256
            [k for k in headers.keys()
257
                if not k.startswith('X-Account-Group-')])
258
        return headers
264
        return filter_headers(headers, prefix)
259 265

  
260
    def get_container_info(self, container, until=None):
261
        url = join_urls(self.pithos_path, self.user, container)
266
    def get_container_info(self, container, until=None, user=None):
267
        user = user or self.user
268
        url = join_urls(self.pithos_path, user, container)
262 269
        if until is not None:
263 270
            parts = list(urlsplit(url))
264 271
            parts[3] = urlencode({
265 272
                'until': until
266 273
            })
267 274
            url = urlunsplit(parts)
268
        r = self.head(url)
275
        r = self.head(url, user=user)
269 276
        self.assertEqual(r.status_code, 204)
270 277
        return r
271 278

  
272
    def get_container_meta(self, container, until=None):
273
        r = self.get_container_info(container, until=until)
279
    def get_container_meta(self, container, until=None, user=None):
280
        prefix = 'X-Container-Meta-'
281
        r = self.get_container_info(container, until=until, user=user)
274 282
        headers = dict(r._headers.values())
275
        map(headers.pop,
276
            [k for k in headers.keys()
277
                if not k.startswith('X-Container-Meta-')])
278
        return headers
283
        return filter_headers(headers, prefix)
279 284

  
280
    def update_container_meta(self, container, meta):
285
    def update_container_meta(self, container, meta, user=None):
286
        user = user or self.user
281 287
        kwargs = dict(
282 288
            ('HTTP_X_CONTAINER_META_%s' % k, str(v)) for k, v in meta.items())
283
        url = join_urls(self.pithos_path, self.user, container)
284
        r = self.post('%s?update=' % url, **kwargs)
289
        url = join_urls(self.pithos_path, user, container)
290
        r = self.post('%s?update=' % url, user=user, **kwargs)
285 291
        self.assertEqual(r.status_code, 202)
286 292
        container_meta = self.get_container_meta(container)
287 293
        (self.assertTrue('X-Container-Meta-%s' % k in container_meta) for
......
289 295
        (self.assertEqual(container_meta['X-Container-Meta-%s' % k], v) for
290 296
            k, v in meta.items())
291 297

  
292
    def list_containers(self, format='json', headers={}, **params):
293
        _url = join_urls(self.pithos_path, self.user)
298
    def list_containers(self, format='json', headers={}, user=None, **params):
299
        user = user or self.user
300
        _url = join_urls(self.pithos_path, user)
294 301
        parts = list(urlsplit(_url))
295 302
        params['format'] = format
296 303
        parts[3] = urlencode(params)
297 304
        url = urlunsplit(parts)
298 305
        _headers = dict(('HTTP_%s' % k.upper(), str(v))
299 306
                        for k, v in headers.items())
300
        r = self.get(url, **_headers)
307
        r = self.get(url, user=user, **_headers)
301 308

  
302 309
        if format is None:
303 310
            containers = r.content.split('\n')
......
313 320
        elif format == 'xml':
314 321
            return minidom.parseString(r.content)
315 322

  
316
    def delete_container_content(self, cname):
317
        url = join_urls(self.pithos_path, self.user, cname)
318
        r = self.delete('%s?delimiter=/' % url)
323
    def delete_container_content(self, cname, user=None):
324
        user = user or self.user
325
        url = join_urls(self.pithos_path, user, cname)
326
        r = self.delete('%s?delimiter=/' % url, user=user)
319 327
        self.assertEqual(r.status_code, 204)
320 328
        return r
321 329

  
322
    def delete_container(self, cname):
323
        url = join_urls(self.pithos_path, self.user, cname)
324
        r = self.delete(url)
330
    def delete_container(self, cname, user=None):
331
        user = user or self.user
332
        url = join_urls(self.pithos_path, user, cname)
333
        r = self.delete(url, user=user)
325 334
        self.assertEqual(r.status_code, 204)
326 335
        return r
327 336

  
328
    def create_container(self, cname=None):
337
    def create_container(self, cname=None, user=None):
329 338
        cname = cname or get_random_name()
330
        url = join_urls(self.pithos_path, self.user, cname)
331
        r = self.put(url, data='')
339
        user = user or self.user
340
        url = join_urls(self.pithos_path, user, cname)
341
        r = self.put(url, user=user, data='')
332 342
        self.assertTrue(r.status_code in (202, 201))
333 343
        return cname, r
334 344

  
335 345
    def upload_object(self, cname, oname=None, length=None, verify=True,
336
                      **meta):
346
                      user=None, **meta):
337 347
        oname = oname or get_random_name()
338 348
        length = length or random.randint(TEST_BLOCK_SIZE, 2 * TEST_BLOCK_SIZE)
349
        user = user or self.user
339 350
        data = get_random_data(length=length)
340 351
        headers = dict(('HTTP_X_OBJECT_META_%s' % k.upper(), v)
341 352
                       for k, v in meta.iteritems())
342
        url = join_urls(self.pithos_path, self.user, cname, oname)
343
        r = self.put(url, data=data, **headers)
353
        url = join_urls(self.pithos_path, user, cname, oname)
354
        r = self.put(url, user=user, data=data, **headers)
344 355
        if verify:
345 356
            self.assertEqual(r.status_code, 201)
346 357
        return oname, data, r
347 358

  
348 359
    def update_object_data(self, cname, oname=None, length=None,
349 360
                           content_type=None, content_range=None,
350
                           verify=True, **meta):
361
                           verify=True, user=None, **meta):
351 362
        oname = oname or get_random_name()
352 363
        length = length or random.randint(TEST_BLOCK_SIZE, 2 * TEST_BLOCK_SIZE)
353 364
        content_type = content_type or 'application/octet-stream'
365
        user = user or self.user
354 366
        data = get_random_data(length=length)
355 367
        headers = dict(('HTTP_X_OBJECT_META_%s' % k.upper(), v)
356 368
                       for k, v in meta.iteritems())
357 369
        if content_range:
358 370
            headers['HTTP_CONTENT_RANGE'] = content_range
359
        url = join_urls(self.pithos_path, self.user, cname, oname)
360
        r = self.post(url, data=data, content_type=content_type, **headers)
371
        url = join_urls(self.pithos_path, user, cname, oname)
372
        r = self.post(url, user=user, data=data, content_type=content_type,
373
                      **headers)
361 374
        if verify:
362 375
            self.assertEqual(r.status_code, 204)
363 376
        return oname, data, r
364 377

  
365 378
    def append_object_data(self, cname, oname=None, length=None,
366
                           content_type=None):
379
                           content_type=None, user=None):
367 380
        return self.update_object_data(cname, oname=oname,
368 381
                                       length=length,
369 382
                                       content_type=content_type,
370
                                       content_range='bytes */*')
383
                                       content_range='bytes */*',
384
                                       user=user)
371 385

  
372
    def create_folder(self, cname, oname=None, **headers):
386
    def create_folder(self, cname, oname=None, user=None, **headers):
387
        user = user or self.user
373 388
        oname = oname or get_random_name()
374
        url = join_urls(self.pithos_path, self.user, cname, oname)
375
        r = self.put(url, data='', content_type='application/directory',
376
                     **headers)
389
        url = join_urls(self.pithos_path, user, cname, oname)
390
        r = self.put(url, user=user, data='',
391
                     content_type='application/directory', **headers)
377 392
        self.assertEqual(r.status_code, 201)
378 393
        return oname, r
379 394

  
380
    def list_objects(self, cname, prefix=None):
381
        url = join_urls(self.pithos_path, self.user, cname)
395
    def list_objects(self, cname, prefix=None, user=None):
396
        user = user or self.user
397
        url = join_urls(self.pithos_path, user, cname)
382 398
        path = '%s?format=json' % url
383 399
        if prefix is not None:
384 400
            path = '%s&prefix=%s' % (path, prefix)
385
        r = self.get(path)
401
        r = self.get(path, user=user)
386 402
        self.assertTrue(r.status_code in (200, 204))
387 403
        try:
388 404
            objects = json.loads(r.content)
......
390 406
            self.fail('json format expected')
391 407
        return objects
392 408

  
393
    def get_object_info(self, container, object, version=None, until=None):
394
        url = join_urls(self.pithos_path, self.user, container, object)
409
    def get_object_info(self, container, object, version=None, until=None,
410
                        user=None):
411
        user = user or self.user
412
        url = join_urls(self.pithos_path, user, container, object)
395 413
        if until is not None:
396 414
            parts = list(urlsplit(url))
397 415
            parts[3] = urlencode({
......
400 418
            url = urlunsplit(parts)
401 419
        if version:
402 420
            url = '%s?version=%s' % (url, version)
403
        r = self.head(url)
421
        r = self.head(url, user=user)
404 422
        self.assertEqual(r.status_code, 200)
405 423
        return r
406 424

  
407
    def get_object_meta(self, container, object, version=None, until=None):
408
        r = self.get_object_info(container, object, version, until=until)
425
    def get_object_meta(self, container, object, version=None, until=None,
426
                        user=None):
427
        prefix = 'X-Object-Meta-'
428
        r = self.get_object_info(container, object, version, until=until,
429
                                 user=user)
409 430
        headers = dict(r._headers.values())
410
        map(headers.pop,
411
            [k for k in headers.keys()
412
                if not k.startswith('X-Object-Meta-')])
413
        return headers
431
        return filter_headers(headers, prefix)
414 432

  
415
    def update_object_meta(self, container, object, meta):
433
    def update_object_meta(self, container, object, meta, user=None):
434
        user = user or self.user
416 435
        kwargs = dict(
417 436
            ('HTTP_X_OBJECT_META_%s' % k, str(v)) for k, v in meta.items())
418
        url = join_urls(self.pithos_path, self.user, container, object)
419
        r = self.post('%s?update=' % url, content_type='', **kwargs)
437
        url = join_urls(self.pithos_path, user, container, object)
438
        r = self.post('%s?update=' % url, user=user, content_type='', **kwargs)
420 439
        self.assertEqual(r.status_code, 202)
421 440
        object_meta = self.get_object_meta(container, object)
422 441
        (self.assertTrue('X-Objecr-Meta-%s' % k in object_meta) for
b/snf-pithos-app/pithos/api/test/accounts.py
112 112
    def test_get_account_meta_until_invalid_date(self):
113 113
        self.update_account_meta({'quality': 'AAA'})
114 114
        meta = self.get_account_meta(until='-1')
115
        self.assertTrue('X-Account-Meta-Quality' in meta)
115
        self.assertTrue('Quality' in meta)
116 116

  
117 117

  
118 118
class AccountGet(PithosAPITest):
......
354 354

  
355 355
            meta.update(initial)
356 356
            account_meta = self.get_account_meta()
357
            (self.assertTrue('X-Account-Meta-%s' % k in account_meta) for
358
                k in meta.keys())
359
            (self.assertEqual(account_meta['X-Account-Meta-%s' % k], v) for
360
                k, v in meta.items())
357
            (self.assertTrue(k in account_meta) for k in meta.keys())
358
            (self.assertEqual(account_meta[k], v) for k, v in meta.items())
361 359

  
362 360
    def test_reset_meta(self):
363 361
        url = join_urls(self.pithos_path, self.user)
......
373 371
            self.assertEqual(r.status_code, 202)
374 372

  
375 373
            account_meta = self.get_account_meta()
376
            (self.assertTrue('X-Account-Meta-%s' % k in account_meta) for
377
                k in new_meta.keys())
378
            (self.assertEqual(account_meta['X-Account-Meta-%s' % k], v) for
379
                k, v in new_meta.items())
374
            (self.assertTrue(k in account_meta) for k in new_meta.keys())
375
            (self.assertEqual(account_meta[k], v) for k, v in new_meta.items())
380 376

  
381
            (self.assertTrue('X-Account-Meta-%s' % k not in account_meta) for
382
                k in meta.keys())
377
            (self.assertTrue(k not in account_meta) for k in meta.keys())
383 378

  
384 379
    def test_delete_meta(self):
385 380
        url = join_urls(self.pithos_path, self.user)
......
394 389

  
395 390
            account_meta = self.get_account_meta()
396 391

  
397
            (self.assertTrue('X-Account-Meta-%s' % k not in account_meta) for
398
                k in meta.keys())
392
            (self.assertTrue(k not in account_meta) for k in meta.keys())
399 393

  
400 394
    def test_set_account_groups(self):
401 395
        url = join_urls(self.pithos_path, self.user)
......
406 400
            self.assertEqual(r.status_code, 202)
407 401

  
408 402
            account_groups = self.get_account_groups()
409
            self.assertTrue(
410
                'X-Account-Group-Pithosdev' in self.get_account_groups())
411
            self.assertEqual(
412
                account_groups['X-Account-Group-Pithosdev'],
413
                ','.join(sorted(pithosdevs)))
403
            self.assertTrue('Pithosdev' in self.get_account_groups())
404
            self.assertEqual(account_groups['Pithosdev'],
405
                             ','.join(sorted(pithosdevs)))
414 406

  
415 407
            clientdevs = ['pkanavos', 'mvasilak']
416 408
            r = self.post('%s?update=' % url,
......
418 410
            self.assertEqual(r.status_code, 202)
419 411

  
420 412
            account_groups = self.get_account_groups()
421
            self.assertTrue(
422
                'X-Account-Group-Pithosdev' in account_groups)
423
            self.assertTrue(
424
                'X-Account-Group-Clientsdev' in account_groups)
425
            self.assertEqual(
426
                account_groups['X-Account-Group-Pithosdev'],
427
                ','.join(sorted(pithosdevs)))
428
            self.assertEqual(
429
                account_groups['X-Account-Group-Clientsdev'],
430
                ','.join(sorted(clientdevs)))
413
            self.assertTrue('Pithosdev' in account_groups)
414
            self.assertTrue('Clientsdev' in account_groups)
415
            self.assertEqual(account_groups['Pithosdev'],
416
                             ','.join(sorted(pithosdevs)))
417
            self.assertEqual(account_groups['Clientsdev'],
418
                             ','.join(sorted(clientdevs)))
431 419

  
432 420
            clientdevs = ['mvasilak']
433 421
            r = self.post('%s?update=' % url,
......
435 423
            self.assertEqual(r.status_code, 202)
436 424

  
437 425
            account_groups = self.get_account_groups()
438
            self.assertTrue(
439
                'X-Account-Group-Pithosdev' in account_groups)
440
            self.assertTrue(
441
                'X-Account-Group-Clientsdev' in account_groups)
442
            self.assertEqual(
443
                account_groups['X-Account-Group-Pithosdev'],
444
                ','.join(sorted(pithosdevs)))
445
            self.assertEqual(
446
                account_groups['X-Account-Group-Clientsdev'],
447
                ','.join(sorted(clientdevs)))
426
            self.assertTrue('Pithosdev' in account_groups)
427
            self.assertTrue('Clientsdev' in account_groups)
428
            self.assertEqual(account_groups['Pithosdev'],
429
                             ','.join(sorted(pithosdevs)))
430
            self.assertEqual(account_groups['Clientsdev'],
431
                             ','.join(sorted(clientdevs)))
448 432

  
449 433
    def test_reset_account_groups(self):
450 434
        url = join_urls(self.pithos_path, self.user)
......
463 447
            headers = dict(('HTTP_X_ACCOUNT_GROUP_%s' % k, ','.join(v))
464 448
                           for k, v in groups.iteritems())
465 449
            account_meta = self.get_account_meta()
466
            headers.update(dict(('HTTP_%s' % k.upper().replace('-', '_'), v)
467
                           for k, v in account_meta.iteritems()))
450
            headers.update(dict(('HTTP_X_ACCOUNT_META_%s' %
451
                                k.upper().replace('-', '_'), v) for
452
                                k, v in account_meta.iteritems()))
468 453
            r = self.post(url, **headers)
469 454
            self.assertEqual(r.status_code, 202)
470 455

  
471 456
            account_groups = self.get_account_groups()
472
            self.assertTrue(
473
                'X-Account-Group-Pithosdev' in account_groups)
474
            self.assertTrue(
475
                'X-Account-Group-Clientsdev' not in account_groups)
476
            self.assertEqual(
477
                account_groups['X-Account-Group-Pithosdev'],
478
                ','.join(sorted(groups['pithosdev'])))
457
            self.assertTrue('Pithosdev' in account_groups)
458
            self.assertTrue('Clientsdev' not in account_groups)
459
            self.assertEqual(account_groups['Pithosdev'],
460
                             ','.join(sorted(groups['pithosdev'])))
479 461

  
480 462
    def test_delete_account_groups(self):
481 463
        url = join_urls(self.pithos_path, self.user)
......
492 474
            self.assertEqual(r.status_code, 202)
493 475

  
494 476
            account_groups = self.get_account_groups()
495
            self.assertTrue(
496
                'X-Account-Group-Pithosdev' not in account_groups)
497
            self.assertTrue(
498
                'X-Account-Group-Clientsdev' not in account_groups)
477
            self.assertTrue('Pithosdev' not in account_groups)
478
            self.assertTrue('Clientsdev' not in account_groups)
b/snf-pithos-app/pithos/api/test/objects.py
124 124

  
125 125
        vserial, _ = l2[-2]
126 126
        self.assertEqual(self.get_object_meta(c, o, version=vserial),
127
                         {'X-Object-Meta-Quality': 'AAA'})
127
                         {'Quality': 'AAA'})
128 128

  
129 129
        # update data
130 130
        self.append_object_data(c, o)
......
171 171
        self.assertTrue(o != other_name)
172 172

  
173 173
        r = self.get('%s?version=%s' % (url, other_version))
174
        self.assertEqual(r.status_code, 403)
174
        self.assertEqual(r.status_code, 404)
175 175

  
176 176
        r = self.head('%s?version=%s' % (url, other_version))
177
        self.assertEqual(r.status_code, 403)
177
        self.assertEqual(r.status_code, 404)
178 178

  
179 179
    def test_objects_with_trailing_spaces(self):
180 180
        # create object
......
786 786
        append = objects.append
787 787
        append(self.upload_object(self.container,
788 788
                                  '%s/%s' % (folder, get_random_name()),
789
                                  HTTP_X_OBJECT_META_DEPTH='1')[0])
789
                                  depth='1')[0])
790 790
        append(self.upload_object(self.container,
791 791
                                  '%s/%s' % (subfolder, get_random_name()),
792
                                  HTTP_X_OBJECT_META_DEPTH='2')[0])
792
                                  depth='2')[0])
793 793
        other = self.upload_object(self.container, strnextling(folder))[0]
794 794

  
795 795
        # copy dir
......
810 810
            # assert metadata
811 811
            meta = self.get_object_meta(self.container, obj)
812 812
            for k in meta.keys():
813
                self.assertTrue(k in r)
814
                self.assertEqual(r[k], meta[k])
813
                key = 'X-Object-Meta-%s' % k
814
                self.assertTrue(key in r)
815
                self.assertEqual(r[key], meta[k])
815 816

  
816 817
        # assert other has not been created under copy folder
817 818
        url = join_urls(self.pithos_path, self.user, self.container,
......
865 866
            self.container, oname='%s/%s' % (folder, get_random_name()))[0]
866 867
        objects = [subfolder]
867 868
        append = objects.append
868
        meta = {}
869
        meta[objects[0]] = {}
870 869
        append(self.upload_object(self.container,
871 870
                                  '%s/%s' % (folder, get_random_name()),
872
                                  HTTP_X_OBJECT_META_DEPTH='1')[0])
873
        meta[objects[1]] = {'X-Object-Meta-Depth': '1'}
871
                                  depth='1')[0])
874 872
        append(self.upload_object(self.container,
875 873
                                  '%s/%s' % (subfolder, get_random_name()),
876
                                  HTTP_X_OBJECT_META_DEPTH='2')[0])
877
        meta[objects[1]] = {'X-Object-Meta-Depth': '2'}
874
                                  depth='1')[0])
878 875
        other = self.upload_object(self.container, strnextling(folder))[0]
879 876

  
880 877
        # move dir
......
897 894
            r = self.head(url)
898 895
            self.assertEqual(r.status_code, 200)
899 896

  
900
#            # assert metadata
901
#            for k in meta[obj].keys():
902
#                self.assertTrue(k in r)
903
#                self.assertEqual(r[k], meta[obj][k])
904

  
905 897
        # assert other has not been created under copy folder
906 898
        url = join_urls(self.pithos_path, self.user, self.container,
907 899
                        '%s/%s' % (copy_folder,
......
934 926
            meta = self.get_object_meta(self.container, self.object)
935 927

  
936 928
            for k, v in d.items():
937
                key = 'X-Object-Meta-%s' % k.title()
938
                self.assertTrue(key in meta)
939
                self.assertTrue(meta[key], v)
929
                self.assertTrue(k.title() in meta)
930
                self.assertTrue(meta[k.title()], v)
940 931

  
941 932
            # Header key too large
942 933
            d = {'a' * 115: 'b' * 256}
......
1066 1057
        range = 'bytes %s-%s/%s' % (first_byte_pos, last_byte_pos, length)
1067 1058
        kwargs = {'content_type': 'application/octet-stream',
1068 1059
                  'HTTP_CONTENT_RANGE': range,
1069
                  'CONTENT_LENGTH': partial + 1}
1060
                  'CONTENT_LENGTH': str(partial + 1)}
1070 1061

  
1071 1062
        url = join_urls(self.pithos_path, self.user, self.container, oname)
1072 1063
        r = self.post(url, data=data, **kwargs)
......
1315 1306
            self.container, oname='%s/%s' % (folder, get_random_name()))[0]
1316 1307
        objects = [subfolder]
1317 1308
        append = objects.append
1318
        meta = {}
1319
        meta[objects[0]] = {}
1320 1309
        append(self.upload_object(self.container,
1321 1310
                                  '%s/%s' % (folder, get_random_name()),
1322
                                  HTTP_X_OBJECT_META_DEPTH='1')[0])
1323
        meta[objects[1]] = {'X-Object-Meta-Depth': '1'}
1311
                                  depth='1')[0])
1324 1312
        append(self.upload_object(self.container,
1325 1313
                                  '%s/%s' % (subfolder, get_random_name()),
1326
                                  HTTP_X_OBJECT_META_DEPTH='2')[0])
1327
        meta[objects[1]] = {'X-Object-Meta-Depth': '2'}
1314
                                  depth='2')[0])
1328 1315
        other = self.upload_object(self.container, strnextling(folder))[0]
1329 1316

  
1330 1317
        # move dir
b/snf-pithos-app/pithos/api/test/views.py
111 111

  
112 112
        vserial, _ = l2[-2]
113 113
        self.assertEqual(self.get_object_meta(c, o, version=vserial),
114
                         {'X-Object-Meta-Quality': 'AAA'})
114
                         {'Quality': 'AAA'})
115 115

  
116 116
        # update data
117 117
        self.append_object_data(c, o)
b/snf-pithos-app/pithos/api/tests.py
38 38
from pithos.api.test.permissions import *
39 39
from pithos.api.test.public import *
40 40
from pithos.api.test.views import *
41
from pithos.api.test.unicode import *

Also available in: Unified diff