Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / tests / api.py @ 7e24cd42

History | View | Annotate | Download (27.1 kB)

1
# Copyright 2011, 2012, 2013 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from astakos.im.tests.common import *
35
from astakos.im.settings import astakos_services, BASE_HOST
36
from synnefo.lib.services import get_service_path
37
from synnefo.lib import join_urls
38

    
39
from django.core.urlresolvers import reverse
40

    
41
from datetime import date
42

    
43
#from xml.dom import minidom
44

    
45
import json
46

    
47
ROOT = "/%s/%s/%s/" % (
48
    astakos_settings.BASE_PATH, astakos_settings.ACCOUNTS_PREFIX, 'v1.0')
49
u = lambda url: ROOT + url
50

    
51

    
52
class QuotaAPITest(TestCase):
53
    def test_0(self):
54
        client = Client()
55
        backend = activation_backends.get_backend()
56

    
57
        component1 = Component.objects.create(name="comp1")
58
        register.add_service(component1, "service1", "type1", [])
59
        # custom service resources
60
        resource11 = {"name": "service1.resource11",
61
                      "desc": "resource11 desc",
62
                      "service_type": "type1",
63
                      "service_origin": "service1",
64
                      "allow_in_projects": True}
65
        r, _ = register.add_resource(resource11)
66
        register.update_resource(r, 100)
67
        resource12 = {"name": "service1.resource12",
68
                      "desc": "resource11 desc",
69
                      "service_type": "type1",
70
                      "service_origin": "service1",
71
                      "unit": "bytes"}
72
        r, _ = register.add_resource(resource12)
73
        register.update_resource(r, 1024)
74

    
75
        # create user
76
        user = get_local_user('test@grnet.gr')
77
        backend.accept_user(user)
78
        non_moderated_user = get_local_user('nonmon@example.com',
79
                                            is_active=False)
80
        r_user = get_local_user('rej@example.com',
81
                                is_active=False, email_verified=True)
82
        backend.reject_user(r_user, "reason")
83

    
84
        component2 = Component.objects.create(name="comp2")
85
        register.add_service(component2, "service2", "type2", [])
86
        # create another service
87
        resource21 = {"name": "service2.resource21",
88
                      "desc": "resource11 desc",
89
                      "service_type": "type2",
90
                      "service_origin": "service2",
91
                      "allow_in_projects": False}
92
        r, _ = register.add_resource(resource21)
93
        register.update_resource(r, 3)
94

    
95
        resource_names = [r['name'] for r in
96
                          [resource11, resource12, resource21]]
97

    
98
        # get resources
99
        r = client.get(u('resources'))
100
        self.assertEqual(r.status_code, 200)
101
        body = json.loads(r.content)
102
        for name in resource_names:
103
            assertIn(name, body)
104

    
105
        # get quota
106
        r = client.get(u('quotas'))
107
        self.assertEqual(r.status_code, 401)
108

    
109
        headers = {'HTTP_X_AUTH_TOKEN': user.auth_token}
110
        r = client.get(u('quotas/'), **headers)
111
        self.assertEqual(r.status_code, 200)
112
        body = json.loads(r.content)
113
        system_quota = body['system']
114
        assertIn('system', body)
115
        for name in resource_names:
116
            assertIn(name, system_quota)
117

    
118
        nmheaders = {'HTTP_X_AUTH_TOKEN': non_moderated_user.auth_token}
119
        r = client.get(u('quotas/'), **nmheaders)
120
        self.assertEqual(r.status_code, 401)
121

    
122
        q = quotas.get_user_quotas(non_moderated_user)
123
        self.assertEqual(q, {})
124

    
125
        q = quotas.get_user_quotas(r_user)
126
        self.assertEqual(q, {})
127

    
128
        r = client.get(u('service_quotas'))
129
        self.assertEqual(r.status_code, 401)
130

    
131
        s1_headers = {'HTTP_X_AUTH_TOKEN': component1.auth_token}
132
        r = client.get(u('service_quotas'), **s1_headers)
133
        self.assertEqual(r.status_code, 200)
134
        body = json.loads(r.content)
135
        assertIn(user.uuid, body)
136

    
137
        r = client.get(u('commissions'), **s1_headers)
138
        self.assertEqual(r.status_code, 200)
139
        body = json.loads(r.content)
140
        self.assertEqual(body, [])
141

    
142
        # issue some commissions
143
        commission_request = {
144
            "force": False,
145
            "auto_accept": False,
146
            "name": "my commission",
147
            "provisions": [
148
                {
149
                    "holder": user.uuid,
150
                    "source": "system",
151
                    "resource": resource11['name'],
152
                    "quantity": 1
153
                },
154
                {
155
                    "holder": user.uuid,
156
                    "source": "system",
157
                    "resource": resource12['name'],
158
                    "quantity": 30000
159
                }]}
160

    
161
        post_data = json.dumps(commission_request)
162
        r = client.post(u('commissions'), post_data,
163
                        content_type='application/json', **s1_headers)
164
        self.assertEqual(r.status_code, 413)
165

    
166
        commission_request = {
167
            "force": False,
168
            "auto_accept": False,
169
            "name": "my commission",
170
            "provisions": [
171
                {
172
                    "holder": user.uuid,
173
                    "source": "system",
174
                    "resource": resource11['name'],
175
                    "quantity": 1
176
                },
177
                {
178
                    "holder": user.uuid,
179
                    "source": "system",
180
                    "resource": resource12['name'],
181
                    "quantity": 100
182
                }]}
183

    
184
        post_data = json.dumps(commission_request)
185
        r = client.post(u('commissions'), post_data,
186
                        content_type='application/json', **s1_headers)
187
        self.assertEqual(r.status_code, 201)
188
        body = json.loads(r.content)
189
        serial1 = body['serial']
190
        assertGreater(serial1, 0)
191

    
192
        post_data = json.dumps(commission_request)
193
        r = client.post(u('commissions'), post_data,
194
                        content_type='application/json', **s1_headers)
195
        self.assertEqual(r.status_code, 201)
196
        body = json.loads(r.content)
197
        serial2 = body['serial']
198
        assertGreater(serial2, serial1)
199

    
200
        post_data = json.dumps(commission_request)
201
        r = client.post(u('commissions'), post_data,
202
                        content_type='application/json', **s1_headers)
203
        self.assertEqual(r.status_code, 201)
204
        body = json.loads(r.content)
205
        serial3 = body['serial']
206
        assertGreater(serial3, serial2)
207

    
208
        r = client.get(u('commissions'), **s1_headers)
209
        self.assertEqual(r.status_code, 200)
210
        body = json.loads(r.content)
211
        self.assertEqual(len(body), 3)
212

    
213
        r = client.get(u('commissions/' + str(serial1)), **s1_headers)
214
        self.assertEqual(r.status_code, 200)
215
        body = json.loads(r.content)
216
        self.assertEqual(body['serial'], serial1)
217
        assertIn('issue_time', body)
218
        provisions = sorted(body['provisions'], key=lambda p: p['resource'])
219
        self.assertEqual(provisions, commission_request['provisions'])
220
        self.assertEqual(body['name'], commission_request['name'])
221

    
222
        r = client.get(u('service_quotas?user=' + user.uuid), **s1_headers)
223
        self.assertEqual(r.status_code, 200)
224
        body = json.loads(r.content)
225
        user_quota = body[user.uuid]
226
        system_quota = user_quota['system']
227
        r11 = system_quota[resource11['name']]
228
        self.assertEqual(r11['usage'], 3)
229
        self.assertEqual(r11['pending'], 3)
230

    
231
        # resolve pending commissions
232
        resolve_data = {
233
            "accept": [serial1, serial3],
234
            "reject": [serial2, serial3, serial3 + 1],
235
        }
236
        post_data = json.dumps(resolve_data)
237

    
238
        r = client.post(u('commissions/action'), post_data,
239
                        content_type='application/json', **s1_headers)
240
        self.assertEqual(r.status_code, 200)
241
        body = json.loads(r.content)
242
        self.assertEqual(body['accepted'], [serial1])
243
        self.assertEqual(body['rejected'], [serial2])
244
        failed = body['failed']
245
        self.assertEqual(len(failed), 2)
246

    
247
        r = client.get(u('commissions/' + str(serial1)), **s1_headers)
248
        self.assertEqual(r.status_code, 404)
249

    
250
        # auto accept
251
        commission_request = {
252
            "auto_accept": True,
253
            "name": "my commission",
254
            "provisions": [
255
                {
256
                    "holder": user.uuid,
257
                    "source": "system",
258
                    "resource": resource11['name'],
259
                    "quantity": 1
260
                },
261
                {
262
                    "holder": user.uuid,
263
                    "source": "system",
264
                    "resource": resource12['name'],
265
                    "quantity": 100
266
                }]}
267

    
268
        post_data = json.dumps(commission_request)
269
        r = client.post(u('commissions'), post_data,
270
                        content_type='application/json', **s1_headers)
271
        self.assertEqual(r.status_code, 201)
272
        body = json.loads(r.content)
273
        serial4 = body['serial']
274
        assertGreater(serial4, serial3)
275

    
276
        r = client.get(u('commissions/' + str(serial4)), **s1_headers)
277
        self.assertEqual(r.status_code, 404)
278

    
279
        # malformed
280
        commission_request = {
281
            "auto_accept": True,
282
            "name": "my commission",
283
            "provisions": [
284
                {
285
                    "holder": user.uuid,
286
                    "source": "system",
287
                    "resource": resource11['name'],
288
                }
289
            ]}
290

    
291
        post_data = json.dumps(commission_request)
292
        r = client.post(u('commissions'), post_data,
293
                        content_type='application/json', **s1_headers)
294
        self.assertEqual(r.status_code, 400)
295

    
296
        commission_request = {
297
            "auto_accept": True,
298
            "name": "my commission",
299
            "provisions": "dummy"}
300

    
301
        post_data = json.dumps(commission_request)
302
        r = client.post(u('commissions'), post_data,
303
                        content_type='application/json', **s1_headers)
304
        self.assertEqual(r.status_code, 400)
305

    
306
        r = client.post(u('commissions'), commission_request,
307
                        content_type='application/json', **s1_headers)
308
        self.assertEqual(r.status_code, 400)
309

    
310
        # no holding
311
        commission_request = {
312
            "auto_accept": True,
313
            "name": "my commission",
314
            "provisions": [
315
                {
316
                    "holder": user.uuid,
317
                    "source": "system",
318
                    "resource": "non existent",
319
                    "quantity": 1
320
                },
321
                {
322
                    "holder": user.uuid,
323
                    "source": "system",
324
                    "resource": resource12['name'],
325
                    "quantity": 100
326
                }]}
327

    
328
        post_data = json.dumps(commission_request)
329
        r = client.post(u('commissions'), post_data,
330
                        content_type='application/json', **s1_headers)
331
        self.assertEqual(r.status_code, 404)
332

    
333
        # release
334
        commission_request = {
335
            "provisions": [
336
                {
337
                    "holder": user.uuid,
338
                    "source": "system",
339
                    "resource": resource11['name'],
340
                    "quantity": -1
341
                }
342
            ]}
343

    
344
        post_data = json.dumps(commission_request)
345
        r = client.post(u('commissions'), post_data,
346
                        content_type='application/json', **s1_headers)
347
        self.assertEqual(r.status_code, 201)
348
        body = json.loads(r.content)
349
        serial = body['serial']
350

    
351
        accept_data = {'accept': ""}
352
        post_data = json.dumps(accept_data)
353
        r = client.post(u('commissions/' + str(serial) + '/action'), post_data,
354
                        content_type='application/json', **s1_headers)
355
        self.assertEqual(r.status_code, 200)
356

    
357
        reject_data = {'reject': ""}
358
        post_data = json.dumps(accept_data)
359
        r = client.post(u('commissions/' + str(serial) + '/action'), post_data,
360
                        content_type='application/json', **s1_headers)
361
        self.assertEqual(r.status_code, 404)
362

    
363
        # force
364
        commission_request = {
365
            "force": True,
366
            "provisions": [
367
                {
368
                    "holder": user.uuid,
369
                    "source": "system",
370
                    "resource": resource11['name'],
371
                    "quantity": 100
372
                }]}
373

    
374
        post_data = json.dumps(commission_request)
375
        r = client.post(u('commissions'), post_data,
376
                        content_type='application/json', **s1_headers)
377
        self.assertEqual(r.status_code, 201)
378

    
379
        commission_request = {
380
            "force": True,
381
            "provisions": [
382
                {
383
                    "holder": user.uuid,
384
                    "source": "system",
385
                    "resource": resource11['name'],
386
                    "quantity": -200
387
                }]}
388

    
389
        post_data = json.dumps(commission_request)
390
        r = client.post(u('commissions'), post_data,
391
                        content_type='application/json', **s1_headers)
392
        self.assertEqual(r.status_code, 413)
393

    
394
        r = client.get(u('quotas'), **headers)
395
        self.assertEqual(r.status_code, 200)
396
        body = json.loads(r.content)
397
        system_quota = body['system']
398
        r11 = system_quota[resource11['name']]
399
        self.assertEqual(r11['usage'], 102)
400
        self.assertEqual(r11['pending'], 101)
401

    
402
        # Bad Request
403
        r = client.head(u('commissions'))
404
        self.assertEqual(r.status_code, 400)
405

    
406

    
407
class TokensApiTest(TestCase):
408
    def setUp(self):
409
        backend = activation_backends.get_backend()
410

    
411
        self.user1 = AstakosUser.objects.create(
412
            email='test1', email_verified=True, moderated=True,
413
            is_rejected=False)
414
        backend.activate_user(self.user1)
415
        assert self.user1.is_active is True
416

    
417
        self.user2 = AstakosUser.objects.create(
418
            email='test2', email_verified=True, moderated=True,
419
            is_rejected=False)
420
        backend.activate_user(self.user2)
421
        assert self.user2.is_active is True
422

    
423
        c1 = Component(name='component1', url='http://localhost/component1')
424
        c1.save()
425
        s1 = Service(component=c1, type='type1', name='service1')
426
        s1.save()
427
        e1 = Endpoint(service=s1)
428
        e1.save()
429
        e1.data.create(key='versionId', value='v1.0')
430
        e1.data.create(key='publicURL', value='http://localhost:8000/s1/v1.0')
431

    
432
        s2 = Service(component=c1, type='type2', name='service2')
433
        s2.save()
434
        e2 = Endpoint(service=s2)
435
        e2.save()
436
        e2.data.create(key='versionId', value='v1.0')
437
        e2.data.create(key='publicURL', value='http://localhost:8000/s2/v1.0')
438

    
439
        c2 = Component(name='component2', url='http://localhost/component2')
440
        c2.save()
441
        s3 = Service(component=c2, type='type3', name='service3')
442
        s3.save()
443
        e3 = Endpoint(service=s3)
444
        e3.save()
445
        e3.data.create(key='versionId', value='v2.0')
446
        e3.data.create(key='publicURL', value='http://localhost:8000/s3/v2.0')
447

    
448
    def test_authenticate(self):
449
        client = Client()
450
        url = reverse('astakos.api.tokens.authenticate')
451

    
452
        # Check not allowed method
453
        r = client.get(url, post_data={})
454
        self.assertEqual(r.status_code, 400)
455

    
456
        # check public mode
457
        r = client.post(url, CONTENT_LENGTH=0)
458
        self.assertEqual(r.status_code, 200)
459
        self.assertTrue(r['Content-Type'].startswith('application/json'))
460
        try:
461
            body = json.loads(r.content)
462
        except Exception, e:
463
            self.fail(e)
464
        self.assertTrue('token' not in body.get('access'))
465
        self.assertTrue('user' not in body.get('access'))
466
        self.assertTrue('serviceCatalog' in body.get('access'))
467

    
468
        # Check unsupported xml input
469
        post_data = """
470
            <?xml version="1.0" encoding="UTF-8"?>
471
                <auth xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
472
                 xmlns="http://docs.openstack.org/identity/api/v2.0"
473
                 tenantName="%s">
474
                  <passwordCredentials username="%s" password="%s"/>
475
                </auth>""" % (self.user1.uuid, self.user1.uuid,
476
                              self.user1.auth_token)
477
        r = client.post(url, post_data, content_type='application/xml')
478
        self.assertEqual(r.status_code, 400)
479
        body = json.loads(r.content)
480
        self.assertEqual(body['badRequest']['message'],
481
                         "Unsupported Content-type: 'application/xml'")
482

    
483
        # Check malformed request: missing password
484
        post_data = """{"auth":{"passwordCredentials":{"username":"%s"},
485
                                "tenantName":"%s"}}""" % (
486
            self.user1.uuid, self.user1.uuid)
487
        r = client.post(url, post_data, content_type='application/json')
488
        self.assertEqual(r.status_code, 400)
489
        body = json.loads(r.content)
490
        self.assertTrue(body['badRequest']['message'].
491
                        startswith('Malformed request'))
492

    
493
        # Check malformed request: missing username
494
        post_data = """{"auth":{"passwordCredentials":{"password":"%s"},
495
                                "tenantName":"%s"}}""" % (
496
            self.user1.auth_token, self.user1.uuid)
497
        r = client.post(url, post_data, content_type='application/json')
498
        self.assertEqual(r.status_code, 400)
499
        body = json.loads(r.content)
500
        self.assertTrue(body['badRequest']['message'].
501
                        startswith('Malformed request'))
502

    
503
        # Check invalid pass
504
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
505
                                                       "password":"%s"},
506
                                "tenantName":"%s"}}""" % (
507
            self.user1.uuid, '', self.user1.uuid)
508
        r = client.post(url, post_data, content_type='application/json')
509
        self.assertEqual(r.status_code, 401)
510
        body = json.loads(r.content)
511
        self.assertEqual(body['unauthorized']['message'],
512
                         'Invalid token')
513

    
514
        # Check inconsistent pass
515
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
516
                                                       "password":"%s"},
517
                                "tenantName":"%s"}}""" % (
518
            self.user1.uuid, self.user2.auth_token, self.user2.uuid)
519
        r = client.post(url, post_data, content_type='application/json')
520
        self.assertEqual(r.status_code, 401)
521
        body = json.loads(r.content)
522
        self.assertEqual(body['unauthorized']['message'],
523
                         'Invalid credentials')
524

    
525
        # Check invalid json data
526
        r = client.post(url, "not json", content_type='application/json')
527
        self.assertEqual(r.status_code, 400)
528
        body = json.loads(r.content)
529
        self.assertEqual(body['badRequest']['message'], 'Invalid JSON data')
530

    
531
        # Check auth with token
532
        post_data = """{"auth":{"token": {"id":"%s"},
533
                        "tenantName":"%s"}}""" % (
534
            self.user1.auth_token, self.user1.uuid)
535
        r = client.post(url, post_data, content_type='application/json')
536
        self.assertEqual(r.status_code, 200)
537
        self.assertTrue(r['Content-Type'].startswith('application/json'))
538
        try:
539
            body = json.loads(r.content)
540
        except Exception, e:
541
            self.fail(e)
542

    
543
        # Check malformed request: missing token
544
        post_data = """{"auth":{"auth_token":{"id":"%s"},
545
                                "tenantName":"%s"}}""" % (
546
            self.user1.auth_token, self.user1.uuid)
547
        r = client.post(url, post_data, content_type='application/json')
548
        self.assertEqual(r.status_code, 400)
549
        body = json.loads(r.content)
550
        self.assertTrue(body['badRequest']['message'].
551
                        startswith('Malformed request'))
552

    
553
        # Check bad request: inconsistent tenant
554
        post_data = """{"auth":{"token":{"id":"%s"},
555
                                "tenantName":"%s"}}""" % (
556
            self.user1.auth_token, self.user2.uuid)
557
        r = client.post(url, post_data, content_type='application/json')
558
        self.assertEqual(r.status_code, 400)
559
        body = json.loads(r.content)
560
        self.assertEqual(body['badRequest']['message'],
561
                         'Not conforming tenantName')
562

    
563
        # Check bad request: inconsistent tenant
564
        post_data = """{"auth":{"token":{"id":"%s"},
565
                                "tenantName":""}}""" % (
566
            self.user1.auth_token)
567
        r = client.post(url, post_data, content_type='application/json')
568
        self.assertEqual(r.status_code, 200)
569

    
570
        # Check successful json response
571
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
572
                                                       "password":"%s"},
573
                                "tenantName":"%s"}}""" % (
574
            self.user1.uuid, self.user1.auth_token, self.user1.uuid)
575
        r = client.post(url, post_data, content_type='application/json')
576
        self.assertEqual(r.status_code, 200)
577
        self.assertTrue(r['Content-Type'].startswith('application/json'))
578
        try:
579
            body = json.loads(r.content)
580
        except Exception, e:
581
            self.fail(e)
582

    
583
        try:
584
            token = body['access']['token']['id']
585
            user = body['access']['user']['id']
586
            service_catalog = body['access']['serviceCatalog']
587
        except KeyError:
588
            self.fail('Invalid response')
589

    
590
        self.assertEqual(token, self.user1.auth_token)
591
        self.assertEqual(user, self.user1.uuid)
592
        self.assertEqual(len(service_catalog), 3)
593

    
594
        # Check successful xml response
595
        headers = {'HTTP_ACCEPT': 'application/xml'}
596
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
597
                                                       "password":"%s"},
598
                                "tenantName":"%s"}}""" % (
599
            self.user1.uuid, self.user1.auth_token, self.user1.uuid)
600
        r = client.post(url, post_data, content_type='application/json',
601
                        **headers)
602
        self.assertEqual(r.status_code, 200)
603
        self.assertTrue(r['Content-Type'].startswith('application/xml'))
604
#        try:
605
#            body = minidom.parseString(r.content)
606
#        except Exception, e:
607
#            self.fail(e)
608

    
609

    
610
class UserCatalogsTest(TestCase):
611
    def test_get_uuid_displayname_catalogs(self):
612
        self.user = AstakosUser.objects.create(
613
            email='test1', email_verified=True, moderated=True,
614
            is_rejected=False)
615

    
616
        client = Client()
617
        url = reverse('astakos.api.user.get_uuid_displayname_catalogs')
618
        d = dict(uuids=[self.user.uuid], displaynames=[self.user.username])
619

    
620
        # assert Unauthorized: missing authentication token
621
        r = client.post(url,
622
                        data=json.dumps(d),
623
                        content_type='application/json')
624
        self.assertEqual(r.status_code, 401)
625

    
626
        # assert Unauthorized: invalid authentication token
627
        r = client.post(url,
628
                        data=json.dumps(d),
629
                        content_type='application/json',
630
                        HTTP_X_AUTH_TOKEN='1234')
631
        self.assertEqual(r.status_code, 401)
632

    
633
        # assert Unauthorized: inactive token holder
634
        r = client.post(url,
635
                        data=json.dumps(d),
636
                        content_type='application/json',
637
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
638
        self.assertEqual(r.status_code, 401)
639

    
640
        backend = activation_backends.get_backend()
641
        backend.activate_user(self.user)
642
        assert self.user.is_active is True
643

    
644
        r = client.post(url,
645
                        data=json.dumps(d),
646
                        content_type='application/json',
647
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
648
        self.assertEqual(r.status_code, 200)
649
        try:
650
            data = json.loads(r.content)
651
        except:
652
            self.fail('Response body should be json formatted')
653
        else:
654
            if not isinstance(data, dict):
655
                self.fail('Response body should be json formatted dictionary')
656

    
657
            self.assertTrue('uuid_catalog' in data)
658
            self.assertEqual(data['uuid_catalog'],
659
                             {self.user.uuid: self.user.username})
660

    
661
            self.assertTrue('displayname_catalog' in data)
662
            self.assertEqual(data['displayname_catalog'],
663
                             {self.user.username: self.user.uuid})
664

    
665
        # assert Unauthorized: expired token
666
        self.user.auth_token_expires = date.today() - timedelta(1)
667
        self.user.save()
668

    
669
        r = client.post(url,
670
                        data=json.dumps(d),
671
                        content_type='application/json',
672
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
673
        self.assertEqual(r.status_code, 401)
674

    
675
        # assert Unauthorized: expired token
676
        self.user.auth_token_expires = date.today() + timedelta(1)
677
        self.user.save()
678

    
679
        # assert badRequest
680
        r = client.post(url,
681
                        data=json.dumps(str(d)),
682
                        content_type='application/json',
683
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
684
        self.assertEqual(r.status_code, 400)
685

    
686

    
687
class WrongPathAPITest(TestCase):
688
    def test_catch_wrong_account_paths(self, *args):
689
        path = get_service_path(astakos_services, 'account', 'v1.0')
690
        path = join_urls(BASE_HOST, path, 'nonexistent')
691
        response = self.client.get(path)
692
        self.assertEqual(response.status_code, 400)
693
        try:
694
            error = json.loads(response.content)
695
        except ValueError:
696
            self.assertTrue(False)
697

    
698
    def test_catch_wrong_identity_paths(self, *args):
699
        path = get_service_path(astakos_services, 'identity', 'v2.0')
700
        path = join_urls(BASE_HOST, path, 'nonexistent')
701
        response = self.client.get(path)
702
        self.assertEqual(response.status_code, 400)
703
        try:
704
            json.loads(response.content)
705
        except ValueError:
706
            self.assertTrue(False)