Statistics
| Branch: | Tag: | Revision:

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

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.test import TestCase
40
from django.core.urlresolvers import reverse
41

    
42
from datetime import date
43

    
44
#from xml.dom import minidom
45

    
46
import json
47

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

    
52

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
193
        post_data = json.dumps(commission_request)
194
        r = client.post(u('commissions'), post_data,
195
                        content_type='application/json', **s1_headers)
196
        self.assertEqual(r.status_code, 201)
197
        body = json.loads(r.content)
198
        self.assertEqual(body['serial'], 2)
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
        self.assertEqual(body['serial'], 3)
206

    
207
        r = client.get(u('commissions'), **s1_headers)
208
        self.assertEqual(r.status_code, 200)
209
        body = json.loads(r.content)
210
        self.assertEqual(body, [1, 2, 3])
211

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

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

    
230
        # resolve pending commissions
231
        resolve_data = {
232
            "accept": [1, 3],
233
            "reject": [2, 3, 4],
234
        }
235
        post_data = json.dumps(resolve_data)
236

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
405

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
608

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

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

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

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

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

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

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

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

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

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

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

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

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

    
685

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

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