Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (26.4 kB)

1 bd1f667b Giorgos Korfiatis
# Copyright 2011, 2012, 2013 GRNET S.A. All rights reserved.
2 1ac3349d Kostas Papadimitriou
#
3 1ac3349d Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
4 1ac3349d Kostas Papadimitriou
# without modification, are permitted provided that the following
5 1ac3349d Kostas Papadimitriou
# conditions are met:
6 1ac3349d Kostas Papadimitriou
#
7 1ac3349d Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
8 1ac3349d Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
9 1ac3349d Kostas Papadimitriou
#      disclaimer.
10 1ac3349d Kostas Papadimitriou
#
11 1ac3349d Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
12 1ac3349d Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
13 1ac3349d Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
14 1ac3349d Kostas Papadimitriou
#      provided with the distribution.
15 1ac3349d Kostas Papadimitriou
#
16 1ac3349d Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 1ac3349d Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 1ac3349d Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 1ac3349d Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 1ac3349d Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 1ac3349d Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 1ac3349d Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 1ac3349d Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 1ac3349d Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 1ac3349d Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 1ac3349d Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 1ac3349d Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
28 1ac3349d Kostas Papadimitriou
#
29 1ac3349d Kostas Papadimitriou
# The views and conclusions contained in the software and
30 1ac3349d Kostas Papadimitriou
# documentation are those of the authors and should not be
31 1ac3349d Kostas Papadimitriou
# interpreted as representing official policies, either expressed
32 1ac3349d Kostas Papadimitriou
# or implied, of GRNET S.A.
33 1ac3349d Kostas Papadimitriou
34 1ac3349d Kostas Papadimitriou
from astakos.im.tests.common import *
35 8aaf4f0d Georgios D. Tsoukalas
from astakos.im.settings import astakos_services, BASE_HOST
36 8aaf4f0d Georgios D. Tsoukalas
from synnefo.lib.services import get_service_path
37 8aaf4f0d Georgios D. Tsoukalas
from synnefo.lib import join_urls
38 7ac2131c Sofia Papagiannaki
39 baa9073a Kostas Papadimitriou
from django.test import TestCase
40 8cb96389 Sofia Papagiannaki
from django.core.urlresolvers import reverse
41 8cb96389 Sofia Papagiannaki
42 bbf20a4c Sofia Papagiannaki
from datetime import date
43 bbf20a4c Sofia Papagiannaki
44 8cb96389 Sofia Papagiannaki
#from xml.dom import minidom
45 7ac2131c Sofia Papagiannaki
46 7ac2131c Sofia Papagiannaki
import json
47 7ac2131c Sofia Papagiannaki
48 a248ebbb Kostas Papadimitriou
ROOT = "/%s/%s/%s/" % (
49 a248ebbb Kostas Papadimitriou
    astakos_settings.BASE_PATH, astakos_settings.ACCOUNTS_PREFIX, 'v1.0')
50 1ac3349d Kostas Papadimitriou
u = lambda url: ROOT + url
51 1ac3349d Kostas Papadimitriou
52 1ac3349d Kostas Papadimitriou
53 1ac3349d Kostas Papadimitriou
class QuotaAPITest(TestCase):
54 1ac3349d Kostas Papadimitriou
    def test_0(self):
55 1ac3349d Kostas Papadimitriou
        client = Client()
56 bd1f667b Giorgos Korfiatis
57 bd1f667b Giorgos Korfiatis
        component1 = Component.objects.create(name="comp1")
58 bd1f667b Giorgos Korfiatis
        register.add_service(component1, "service1", "type1", [])
59 1ac3349d Kostas Papadimitriou
        # custom service resources
60 1ac3349d Kostas Papadimitriou
        resource11 = {"name": "service1.resource11",
61 1ac3349d Kostas Papadimitriou
                      "desc": "resource11 desc",
62 bd1f667b Giorgos Korfiatis
                      "service_type": "type1",
63 a248ebbb Kostas Papadimitriou
                      "service_origin": "service1",
64 1ac3349d Kostas Papadimitriou
                      "allow_in_projects": True}
65 bd1f667b Giorgos Korfiatis
        r, _ = register.add_resource(resource11)
66 bd1f667b Giorgos Korfiatis
        register.update_resource(r, 100)
67 1ac3349d Kostas Papadimitriou
        resource12 = {"name": "service1.resource12",
68 1ac3349d Kostas Papadimitriou
                      "desc": "resource11 desc",
69 bd1f667b Giorgos Korfiatis
                      "service_type": "type1",
70 a248ebbb Kostas Papadimitriou
                      "service_origin": "service1",
71 1ac3349d Kostas Papadimitriou
                      "unit": "bytes"}
72 bd1f667b Giorgos Korfiatis
        r, _ = register.add_resource(resource12)
73 bd1f667b Giorgos Korfiatis
        register.update_resource(r, 1024)
74 1ac3349d Kostas Papadimitriou
75 1ac3349d Kostas Papadimitriou
        # create user
76 1ac3349d Kostas Papadimitriou
        user = get_local_user('test@grnet.gr')
77 1ac3349d Kostas Papadimitriou
        quotas.qh_sync_user(user)
78 1ac3349d Kostas Papadimitriou
79 bd1f667b Giorgos Korfiatis
        component2 = Component.objects.create(name="comp2")
80 bd1f667b Giorgos Korfiatis
        register.add_service(component2, "service2", "type2", [])
81 1ac3349d Kostas Papadimitriou
        # create another service
82 1ac3349d Kostas Papadimitriou
        resource21 = {"name": "service2.resource21",
83 1ac3349d Kostas Papadimitriou
                      "desc": "resource11 desc",
84 bd1f667b Giorgos Korfiatis
                      "service_type": "type2",
85 a248ebbb Kostas Papadimitriou
                      "service_origin": "service2",
86 1ac3349d Kostas Papadimitriou
                      "allow_in_projects": False}
87 bd1f667b Giorgos Korfiatis
        r, _ = register.add_resource(resource21)
88 bd1f667b Giorgos Korfiatis
        register.update_resource(r, 3)
89 1ac3349d Kostas Papadimitriou
90 1ac3349d Kostas Papadimitriou
        resource_names = [r['name'] for r in
91 1ac3349d Kostas Papadimitriou
                          [resource11, resource12, resource21]]
92 1ac3349d Kostas Papadimitriou
93 1ac3349d Kostas Papadimitriou
        # get resources
94 1ac3349d Kostas Papadimitriou
        r = client.get(u('resources'))
95 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
96 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
97 1ac3349d Kostas Papadimitriou
        for name in resource_names:
98 1ac3349d Kostas Papadimitriou
            assertIn(name, body)
99 1ac3349d Kostas Papadimitriou
100 1ac3349d Kostas Papadimitriou
        # get quota
101 1ac3349d Kostas Papadimitriou
        r = client.get(u('quotas'))
102 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 401)
103 1ac3349d Kostas Papadimitriou
104 1ac3349d Kostas Papadimitriou
        headers = {'HTTP_X_AUTH_TOKEN': user.auth_token}
105 1ac3349d Kostas Papadimitriou
        r = client.get(u('quotas/'), **headers)
106 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
107 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
108 1ac3349d Kostas Papadimitriou
        system_quota = body['system']
109 1ac3349d Kostas Papadimitriou
        assertIn('system', body)
110 1ac3349d Kostas Papadimitriou
        for name in resource_names:
111 1ac3349d Kostas Papadimitriou
            assertIn(name, system_quota)
112 1ac3349d Kostas Papadimitriou
113 1ac3349d Kostas Papadimitriou
        r = client.get(u('service_quotas'))
114 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 401)
115 1ac3349d Kostas Papadimitriou
116 bd1f667b Giorgos Korfiatis
        s1_headers = {'HTTP_X_AUTH_TOKEN': component1.auth_token}
117 1ac3349d Kostas Papadimitriou
        r = client.get(u('service_quotas'), **s1_headers)
118 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
119 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
120 1ac3349d Kostas Papadimitriou
        assertIn(user.uuid, body)
121 1ac3349d Kostas Papadimitriou
122 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions'), **s1_headers)
123 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
124 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
125 1ac3349d Kostas Papadimitriou
        self.assertEqual(body, [])
126 1ac3349d Kostas Papadimitriou
127 1ac3349d Kostas Papadimitriou
        # issue some commissions
128 1ac3349d Kostas Papadimitriou
        commission_request = {
129 1ac3349d Kostas Papadimitriou
            "force": False,
130 1ac3349d Kostas Papadimitriou
            "auto_accept": False,
131 1ac3349d Kostas Papadimitriou
            "name": "my commission",
132 1ac3349d Kostas Papadimitriou
            "provisions": [
133 1ac3349d Kostas Papadimitriou
                {
134 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
135 1ac3349d Kostas Papadimitriou
                    "source": "system",
136 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
137 1ac3349d Kostas Papadimitriou
                    "quantity": 1
138 1ac3349d Kostas Papadimitriou
                },
139 1ac3349d Kostas Papadimitriou
                {
140 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
141 1ac3349d Kostas Papadimitriou
                    "source": "system",
142 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
143 1ac3349d Kostas Papadimitriou
                    "quantity": 30000
144 1ac3349d Kostas Papadimitriou
                }]}
145 1ac3349d Kostas Papadimitriou
146 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
147 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
148 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
149 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 413)
150 1ac3349d Kostas Papadimitriou
151 1ac3349d Kostas Papadimitriou
        commission_request = {
152 1ac3349d Kostas Papadimitriou
            "force": False,
153 1ac3349d Kostas Papadimitriou
            "auto_accept": False,
154 1ac3349d Kostas Papadimitriou
            "name": "my commission",
155 1ac3349d Kostas Papadimitriou
            "provisions": [
156 1ac3349d Kostas Papadimitriou
                {
157 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
158 1ac3349d Kostas Papadimitriou
                    "source": "system",
159 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
160 1ac3349d Kostas Papadimitriou
                    "quantity": 1
161 1ac3349d Kostas Papadimitriou
                },
162 1ac3349d Kostas Papadimitriou
                {
163 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
164 1ac3349d Kostas Papadimitriou
                    "source": "system",
165 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
166 1ac3349d Kostas Papadimitriou
                    "quantity": 100
167 1ac3349d Kostas Papadimitriou
                }]}
168 1ac3349d Kostas Papadimitriou
169 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
170 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
171 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
172 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
173 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
174 1ac3349d Kostas Papadimitriou
        serial = body['serial']
175 1ac3349d Kostas Papadimitriou
        self.assertEqual(serial, 1)
176 1ac3349d Kostas Papadimitriou
177 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
178 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
179 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
180 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
181 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
182 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['serial'], 2)
183 1ac3349d Kostas Papadimitriou
184 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
185 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
186 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
187 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
188 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
189 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['serial'], 3)
190 1ac3349d Kostas Papadimitriou
191 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions'), **s1_headers)
192 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
193 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
194 1ac3349d Kostas Papadimitriou
        self.assertEqual(body, [1, 2, 3])
195 1ac3349d Kostas Papadimitriou
196 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions/' + str(serial)), **s1_headers)
197 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
198 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
199 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['serial'], serial)
200 1ac3349d Kostas Papadimitriou
        assertIn('issue_time', body)
201 2d31dfd7 Giorgos Korfiatis
        provisions = sorted(body['provisions'], key=lambda p: p['resource'])
202 2d31dfd7 Giorgos Korfiatis
        self.assertEqual(provisions, commission_request['provisions'])
203 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['name'], commission_request['name'])
204 1ac3349d Kostas Papadimitriou
205 1ac3349d Kostas Papadimitriou
        r = client.get(u('service_quotas?user=' + user.uuid), **s1_headers)
206 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
207 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
208 1ac3349d Kostas Papadimitriou
        user_quota = body[user.uuid]
209 1ac3349d Kostas Papadimitriou
        system_quota = user_quota['system']
210 1ac3349d Kostas Papadimitriou
        r11 = system_quota[resource11['name']]
211 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['usage'], 3)
212 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['pending'], 3)
213 1ac3349d Kostas Papadimitriou
214 1ac3349d Kostas Papadimitriou
        # resolve pending commissions
215 1ac3349d Kostas Papadimitriou
        resolve_data = {
216 1ac3349d Kostas Papadimitriou
            "accept": [1, 3],
217 1ac3349d Kostas Papadimitriou
            "reject": [2, 3, 4],
218 1ac3349d Kostas Papadimitriou
        }
219 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(resolve_data)
220 1ac3349d Kostas Papadimitriou
221 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions/action'), post_data,
222 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
223 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
224 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
225 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['accepted'], [1])
226 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['rejected'], [2])
227 1ac3349d Kostas Papadimitriou
        failed = body['failed']
228 1ac3349d Kostas Papadimitriou
        self.assertEqual(len(failed), 2)
229 1ac3349d Kostas Papadimitriou
230 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions/' + str(serial)), **s1_headers)
231 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
232 1ac3349d Kostas Papadimitriou
233 1ac3349d Kostas Papadimitriou
        # auto accept
234 1ac3349d Kostas Papadimitriou
        commission_request = {
235 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
236 1ac3349d Kostas Papadimitriou
            "name": "my commission",
237 1ac3349d Kostas Papadimitriou
            "provisions": [
238 1ac3349d Kostas Papadimitriou
                {
239 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
240 1ac3349d Kostas Papadimitriou
                    "source": "system",
241 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
242 1ac3349d Kostas Papadimitriou
                    "quantity": 1
243 1ac3349d Kostas Papadimitriou
                },
244 1ac3349d Kostas Papadimitriou
                {
245 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
246 1ac3349d Kostas Papadimitriou
                    "source": "system",
247 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
248 1ac3349d Kostas Papadimitriou
                    "quantity": 100
249 1ac3349d Kostas Papadimitriou
                }]}
250 1ac3349d Kostas Papadimitriou
251 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
252 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
253 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
254 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
255 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
256 1ac3349d Kostas Papadimitriou
        serial = body['serial']
257 1ac3349d Kostas Papadimitriou
        self.assertEqual(serial, 4)
258 1ac3349d Kostas Papadimitriou
259 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions/' + str(serial)), **s1_headers)
260 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
261 1ac3349d Kostas Papadimitriou
262 1ac3349d Kostas Papadimitriou
        # malformed
263 1ac3349d Kostas Papadimitriou
        commission_request = {
264 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
265 1ac3349d Kostas Papadimitriou
            "name": "my commission",
266 1ac3349d Kostas Papadimitriou
            "provisions": [
267 1ac3349d Kostas Papadimitriou
                {
268 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
269 1ac3349d Kostas Papadimitriou
                    "source": "system",
270 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
271 1ac3349d Kostas Papadimitriou
                }
272 1ac3349d Kostas Papadimitriou
            ]}
273 1ac3349d Kostas Papadimitriou
274 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
275 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
276 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
277 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 400)
278 1ac3349d Kostas Papadimitriou
279 1ac3349d Kostas Papadimitriou
        commission_request = {
280 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
281 1ac3349d Kostas Papadimitriou
            "name": "my commission",
282 1ac3349d Kostas Papadimitriou
            "provisions": "dummy"}
283 1ac3349d Kostas Papadimitriou
284 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
285 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
286 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
287 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 400)
288 1ac3349d Kostas Papadimitriou
289 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), commission_request,
290 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
291 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 400)
292 1ac3349d Kostas Papadimitriou
293 1ac3349d Kostas Papadimitriou
        # no holding
294 1ac3349d Kostas Papadimitriou
        commission_request = {
295 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
296 1ac3349d Kostas Papadimitriou
            "name": "my commission",
297 1ac3349d Kostas Papadimitriou
            "provisions": [
298 1ac3349d Kostas Papadimitriou
                {
299 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
300 1ac3349d Kostas Papadimitriou
                    "source": "system",
301 1ac3349d Kostas Papadimitriou
                    "resource": "non existent",
302 1ac3349d Kostas Papadimitriou
                    "quantity": 1
303 1ac3349d Kostas Papadimitriou
                },
304 1ac3349d Kostas Papadimitriou
                {
305 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
306 1ac3349d Kostas Papadimitriou
                    "source": "system",
307 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
308 1ac3349d Kostas Papadimitriou
                    "quantity": 100
309 1ac3349d Kostas Papadimitriou
                }]}
310 1ac3349d Kostas Papadimitriou
311 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
312 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
313 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
314 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
315 1ac3349d Kostas Papadimitriou
316 1ac3349d Kostas Papadimitriou
        # release
317 1ac3349d Kostas Papadimitriou
        commission_request = {
318 1ac3349d Kostas Papadimitriou
            "provisions": [
319 1ac3349d Kostas Papadimitriou
                {
320 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
321 1ac3349d Kostas Papadimitriou
                    "source": "system",
322 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
323 1ac3349d Kostas Papadimitriou
                    "quantity": -1
324 1ac3349d Kostas Papadimitriou
                }
325 1ac3349d Kostas Papadimitriou
            ]}
326 1ac3349d Kostas Papadimitriou
327 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
328 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
329 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
330 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
331 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
332 1ac3349d Kostas Papadimitriou
        serial = body['serial']
333 1ac3349d Kostas Papadimitriou
334 1ac3349d Kostas Papadimitriou
        accept_data = {'accept': ""}
335 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(accept_data)
336 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions/' + str(serial) + '/action'), post_data,
337 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
338 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
339 1ac3349d Kostas Papadimitriou
340 1ac3349d Kostas Papadimitriou
        reject_data = {'reject': ""}
341 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(accept_data)
342 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions/' + str(serial) + '/action'), post_data,
343 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
344 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
345 1ac3349d Kostas Papadimitriou
346 1ac3349d Kostas Papadimitriou
        # force
347 1ac3349d Kostas Papadimitriou
        commission_request = {
348 1ac3349d Kostas Papadimitriou
            "force": True,
349 1ac3349d Kostas Papadimitriou
            "provisions": [
350 1ac3349d Kostas Papadimitriou
                {
351 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
352 1ac3349d Kostas Papadimitriou
                    "source": "system",
353 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
354 1ac3349d Kostas Papadimitriou
                    "quantity": 100
355 1ac3349d Kostas Papadimitriou
                }]}
356 1ac3349d Kostas Papadimitriou
357 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
358 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
359 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
360 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
361 1ac3349d Kostas Papadimitriou
362 1ac3349d Kostas Papadimitriou
        commission_request = {
363 1ac3349d Kostas Papadimitriou
            "force": True,
364 1ac3349d Kostas Papadimitriou
            "provisions": [
365 1ac3349d Kostas Papadimitriou
                {
366 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
367 1ac3349d Kostas Papadimitriou
                    "source": "system",
368 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
369 1ac3349d Kostas Papadimitriou
                    "quantity": -200
370 1ac3349d Kostas Papadimitriou
                }]}
371 1ac3349d Kostas Papadimitriou
372 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
373 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
374 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
375 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 413)
376 1ac3349d Kostas Papadimitriou
377 1ac3349d Kostas Papadimitriou
        r = client.get(u('quotas'), **headers)
378 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
379 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
380 1ac3349d Kostas Papadimitriou
        system_quota = body['system']
381 1ac3349d Kostas Papadimitriou
        r11 = system_quota[resource11['name']]
382 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['usage'], 102)
383 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['pending'], 101)
384 7ac2131c Sofia Papagiannaki
385 8ff1e8d9 Giorgos Korfiatis
        # Bad Request
386 8ff1e8d9 Giorgos Korfiatis
        r = client.head(u('commissions'))
387 8ff1e8d9 Giorgos Korfiatis
        self.assertEqual(r.status_code, 400)
388 8ff1e8d9 Giorgos Korfiatis
389 7ac2131c Sofia Papagiannaki
390 7ac2131c Sofia Papagiannaki
class TokensApiTest(TestCase):
391 7ac2131c Sofia Papagiannaki
    def setUp(self):
392 ab7ca50a Sofia Papagiannaki
        backend = activation_backends.get_backend()
393 ab7ca50a Sofia Papagiannaki
394 ab7ca50a Sofia Papagiannaki
        self.user1 = AstakosUser.objects.create(
395 ab7ca50a Sofia Papagiannaki
            email='test1', email_verified=True, moderated=True,
396 ab7ca50a Sofia Papagiannaki
            is_rejected=False)
397 ab7ca50a Sofia Papagiannaki
        backend.activate_user(self.user1)
398 ab7ca50a Sofia Papagiannaki
        assert self.user1.is_active is True
399 ab7ca50a Sofia Papagiannaki
400 ab7ca50a Sofia Papagiannaki
        self.user2 = AstakosUser.objects.create(
401 ab7ca50a Sofia Papagiannaki
            email='test2', email_verified=True, moderated=True,
402 ab7ca50a Sofia Papagiannaki
            is_rejected=False)
403 ab7ca50a Sofia Papagiannaki
        backend.activate_user(self.user2)
404 ab7ca50a Sofia Papagiannaki
        assert self.user2.is_active is True
405 7ac2131c Sofia Papagiannaki
406 8cb96389 Sofia Papagiannaki
        c1 = Component(name='component1', url='http://localhost/component1')
407 8cb96389 Sofia Papagiannaki
        c1.save()
408 8cb96389 Sofia Papagiannaki
        s1 = Service(component=c1, type='type1', name='service1')
409 8cb96389 Sofia Papagiannaki
        s1.save()
410 8cb96389 Sofia Papagiannaki
        e1 = Endpoint(service=s1)
411 8cb96389 Sofia Papagiannaki
        e1.save()
412 8cb96389 Sofia Papagiannaki
        e1.data.create(key='versionId', value='v1.0')
413 8cb96389 Sofia Papagiannaki
        e1.data.create(key='publicURL', value='http://localhost:8000/s1/v1.0')
414 8cb96389 Sofia Papagiannaki
415 8cb96389 Sofia Papagiannaki
        s2 = Service(component=c1, type='type2', name='service2')
416 8cb96389 Sofia Papagiannaki
        s2.save()
417 8cb96389 Sofia Papagiannaki
        e2 = Endpoint(service=s2)
418 8cb96389 Sofia Papagiannaki
        e2.save()
419 8cb96389 Sofia Papagiannaki
        e2.data.create(key='versionId', value='v1.0')
420 8cb96389 Sofia Papagiannaki
        e2.data.create(key='publicURL', value='http://localhost:8000/s2/v1.0')
421 8cb96389 Sofia Papagiannaki
422 8cb96389 Sofia Papagiannaki
        c2 = Component(name='component2', url='http://localhost/component2')
423 8cb96389 Sofia Papagiannaki
        c2.save()
424 8cb96389 Sofia Papagiannaki
        s3 = Service(component=c2, type='type3', name='service3')
425 8cb96389 Sofia Papagiannaki
        s3.save()
426 8cb96389 Sofia Papagiannaki
        e3 = Endpoint(service=s3)
427 8cb96389 Sofia Papagiannaki
        e3.save()
428 8cb96389 Sofia Papagiannaki
        e3.data.create(key='versionId', value='v2.0')
429 8cb96389 Sofia Papagiannaki
        e3.data.create(key='publicURL', value='http://localhost:8000/s3/v2.0')
430 7ac2131c Sofia Papagiannaki
431 f870efe2 Sofia Papagiannaki
    def test_authenticate(self):
432 7ac2131c Sofia Papagiannaki
        client = Client()
433 3472d390 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
434 7ac2131c Sofia Papagiannaki
435 f870efe2 Sofia Papagiannaki
        # Check not allowed method
436 f870efe2 Sofia Papagiannaki
        r = client.get(url, post_data={})
437 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
438 f870efe2 Sofia Papagiannaki
439 d29f0371 Sofia Papagiannaki
        # check public mode
440 d29f0371 Sofia Papagiannaki
        r = client.post(url, CONTENT_LENGTH=0)
441 d29f0371 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
442 d29f0371 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
443 d29f0371 Sofia Papagiannaki
        try:
444 d29f0371 Sofia Papagiannaki
            body = json.loads(r.content)
445 d29f0371 Sofia Papagiannaki
        except Exception, e:
446 d29f0371 Sofia Papagiannaki
            self.fail(e)
447 d29f0371 Sofia Papagiannaki
        self.assertTrue('token' not in body.get('access'))
448 d29f0371 Sofia Papagiannaki
        self.assertTrue('user' not in body.get('access'))
449 d29f0371 Sofia Papagiannaki
        self.assertTrue('serviceCatalog' in body.get('access'))
450 f870efe2 Sofia Papagiannaki
451 f870efe2 Sofia Papagiannaki
        # Check unsupported xml input
452 f870efe2 Sofia Papagiannaki
        post_data = """
453 f870efe2 Sofia Papagiannaki
            <?xml version="1.0" encoding="UTF-8"?>
454 f870efe2 Sofia Papagiannaki
                <auth xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
455 f870efe2 Sofia Papagiannaki
                 xmlns="http://docs.openstack.org/identity/api/v2.0"
456 f870efe2 Sofia Papagiannaki
                 tenantName="%s">
457 f870efe2 Sofia Papagiannaki
                  <passwordCredentials username="%s" password="%s"/>
458 f870efe2 Sofia Papagiannaki
                </auth>""" % (self.user1.uuid, self.user1.uuid,
459 f870efe2 Sofia Papagiannaki
                              self.user1.auth_token)
460 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/xml')
461 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
462 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
463 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'],
464 f870efe2 Sofia Papagiannaki
                         "Unsupported Content-type: 'application/xml'")
465 f870efe2 Sofia Papagiannaki
466 f870efe2 Sofia Papagiannaki
        # Check malformed request: missing password
467 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s"},
468 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
469 f870efe2 Sofia Papagiannaki
            self.user1.uuid, self.user1.uuid)
470 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
471 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
472 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
473 11366070 Sofia Papagiannaki
        self.assertTrue(body['badRequest']['message'].
474 11366070 Sofia Papagiannaki
                        startswith('Malformed request'))
475 f870efe2 Sofia Papagiannaki
476 f870efe2 Sofia Papagiannaki
        # Check malformed request: missing username
477 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"password":"%s"},
478 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
479 f870efe2 Sofia Papagiannaki
            self.user1.auth_token, self.user1.uuid)
480 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
481 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
482 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
483 11366070 Sofia Papagiannaki
        self.assertTrue(body['badRequest']['message'].
484 11366070 Sofia Papagiannaki
                        startswith('Malformed request'))
485 f870efe2 Sofia Papagiannaki
486 f870efe2 Sofia Papagiannaki
        # Check invalid pass
487 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
488 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
489 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
490 f870efe2 Sofia Papagiannaki
            self.user1.uuid, '', self.user1.uuid)
491 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
492 7ac2131c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
493 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
494 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['unauthorized']['message'],
495 f870efe2 Sofia Papagiannaki
                         'Invalid token')
496 f870efe2 Sofia Papagiannaki
497 f870efe2 Sofia Papagiannaki
        # Check inconsistent pass
498 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
499 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
500 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
501 49005665 Sofia Papagiannaki
            self.user1.uuid, self.user2.auth_token, self.user2.uuid)
502 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
503 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
504 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
505 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['unauthorized']['message'],
506 f870efe2 Sofia Papagiannaki
                         'Invalid credentials')
507 f870efe2 Sofia Papagiannaki
508 f870efe2 Sofia Papagiannaki
        # Check invalid json data
509 f870efe2 Sofia Papagiannaki
        r = client.post(url, "not json", content_type='application/json')
510 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
511 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
512 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'], 'Invalid JSON data')
513 f870efe2 Sofia Papagiannaki
514 f870efe2 Sofia Papagiannaki
        # Check auth with token
515 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"token": {"id":"%s"},
516 f870efe2 Sofia Papagiannaki
                        "tenantName":"%s"}}""" % (
517 f870efe2 Sofia Papagiannaki
            self.user1.auth_token, self.user1.uuid)
518 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
519 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
520 f870efe2 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
521 f870efe2 Sofia Papagiannaki
        try:
522 f870efe2 Sofia Papagiannaki
            body = json.loads(r.content)
523 f870efe2 Sofia Papagiannaki
        except Exception, e:
524 f870efe2 Sofia Papagiannaki
            self.fail(e)
525 f870efe2 Sofia Papagiannaki
526 11366070 Sofia Papagiannaki
        # Check malformed request: missing token
527 11366070 Sofia Papagiannaki
        post_data = """{"auth":{"auth_token":{"id":"%s"},
528 11366070 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
529 11366070 Sofia Papagiannaki
            self.user1.auth_token, self.user1.uuid)
530 11366070 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
531 11366070 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
532 11366070 Sofia Papagiannaki
        body = json.loads(r.content)
533 11366070 Sofia Papagiannaki
        self.assertTrue(body['badRequest']['message'].
534 11366070 Sofia Papagiannaki
                        startswith('Malformed request'))
535 11366070 Sofia Papagiannaki
536 11366070 Sofia Papagiannaki
        # Check bad request: inconsistent tenant
537 11366070 Sofia Papagiannaki
        post_data = """{"auth":{"token":{"id":"%s"},
538 11366070 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
539 11366070 Sofia Papagiannaki
            self.user1.auth_token, self.user2.uuid)
540 11366070 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
541 11366070 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
542 11366070 Sofia Papagiannaki
        body = json.loads(r.content)
543 11366070 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'],
544 11366070 Sofia Papagiannaki
                         'Not conforming tenantName')
545 11366070 Sofia Papagiannaki
546 a01eb018 Sofia Papagiannaki
        # Check bad request: inconsistent tenant
547 a01eb018 Sofia Papagiannaki
        post_data = """{"auth":{"token":{"id":"%s"},
548 a01eb018 Sofia Papagiannaki
                                "tenantName":""}}""" % (
549 a01eb018 Sofia Papagiannaki
            self.user1.auth_token)
550 a01eb018 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
551 a01eb018 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
552 a01eb018 Sofia Papagiannaki
553 f870efe2 Sofia Papagiannaki
        # Check successful json response
554 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
555 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
556 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
557 f870efe2 Sofia Papagiannaki
            self.user1.uuid, self.user1.auth_token, self.user1.uuid)
558 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
559 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
560 f870efe2 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
561 f870efe2 Sofia Papagiannaki
        try:
562 f870efe2 Sofia Papagiannaki
            body = json.loads(r.content)
563 f870efe2 Sofia Papagiannaki
        except Exception, e:
564 f870efe2 Sofia Papagiannaki
            self.fail(e)
565 f870efe2 Sofia Papagiannaki
566 f870efe2 Sofia Papagiannaki
        try:
567 8cb96389 Sofia Papagiannaki
            token = body['access']['token']['id']
568 8cb96389 Sofia Papagiannaki
            user = body['access']['user']['id']
569 8cb96389 Sofia Papagiannaki
            service_catalog = body['access']['serviceCatalog']
570 f870efe2 Sofia Papagiannaki
        except KeyError:
571 f870efe2 Sofia Papagiannaki
            self.fail('Invalid response')
572 f870efe2 Sofia Papagiannaki
573 f870efe2 Sofia Papagiannaki
        self.assertEqual(token, self.user1.auth_token)
574 f870efe2 Sofia Papagiannaki
        self.assertEqual(user, self.user1.uuid)
575 f870efe2 Sofia Papagiannaki
        self.assertEqual(len(service_catalog), 3)
576 f870efe2 Sofia Papagiannaki
577 f870efe2 Sofia Papagiannaki
        # Check successful xml response
578 f870efe2 Sofia Papagiannaki
        headers = {'HTTP_ACCEPT': 'application/xml'}
579 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
580 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
581 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
582 f870efe2 Sofia Papagiannaki
            self.user1.uuid, self.user1.auth_token, self.user1.uuid)
583 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json',
584 f870efe2 Sofia Papagiannaki
                        **headers)
585 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
586 f870efe2 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/xml'))
587 49005665 Sofia Papagiannaki
#        try:
588 49005665 Sofia Papagiannaki
#            body = minidom.parseString(r.content)
589 49005665 Sofia Papagiannaki
#        except Exception, e:
590 49005665 Sofia Papagiannaki
#            self.fail(e)
591 8aaf4f0d Georgios D. Tsoukalas
592 8aaf4f0d Georgios D. Tsoukalas
593 bbf20a4c Sofia Papagiannaki
class UserCatalogsTest(TestCase):
594 bbf20a4c Sofia Papagiannaki
    def test_get_uuid_displayname_catalogs(self):
595 bbf20a4c Sofia Papagiannaki
        self.user = AstakosUser.objects.create(
596 bbf20a4c Sofia Papagiannaki
            email='test1', email_verified=True, moderated=True,
597 bbf20a4c Sofia Papagiannaki
            is_rejected=False)
598 bbf20a4c Sofia Papagiannaki
599 bbf20a4c Sofia Papagiannaki
        client = Client()
600 bbf20a4c Sofia Papagiannaki
        url = reverse('astakos.api.user.get_uuid_displayname_catalogs')
601 bbf20a4c Sofia Papagiannaki
        d = dict(uuids=[self.user.uuid], displaynames=[self.user.username])
602 bbf20a4c Sofia Papagiannaki
603 bbf20a4c Sofia Papagiannaki
        # assert Unauthorized: missing authentication token
604 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
605 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(d),
606 bbf20a4c Sofia Papagiannaki
                        content_type='application/json')
607 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
608 bbf20a4c Sofia Papagiannaki
609 bbf20a4c Sofia Papagiannaki
        # assert Unauthorized: invalid authentication token
610 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
611 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(d),
612 bbf20a4c Sofia Papagiannaki
                        content_type='application/json',
613 bbf20a4c Sofia Papagiannaki
                        HTTP_X_AUTH_TOKEN='1234')
614 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
615 bbf20a4c Sofia Papagiannaki
616 bbf20a4c Sofia Papagiannaki
        # assert Unauthorized: inactive token holder
617 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
618 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(d),
619 bbf20a4c Sofia Papagiannaki
                        content_type='application/json',
620 bbf20a4c Sofia Papagiannaki
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
621 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
622 bbf20a4c Sofia Papagiannaki
623 bbf20a4c Sofia Papagiannaki
        backend = activation_backends.get_backend()
624 bbf20a4c Sofia Papagiannaki
        backend.activate_user(self.user)
625 bbf20a4c Sofia Papagiannaki
        assert self.user.is_active is True
626 bbf20a4c Sofia Papagiannaki
627 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
628 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(d),
629 bbf20a4c Sofia Papagiannaki
                        content_type='application/json',
630 bbf20a4c Sofia Papagiannaki
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
631 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
632 bbf20a4c Sofia Papagiannaki
        try:
633 bbf20a4c Sofia Papagiannaki
            data = json.loads(r.content)
634 bbf20a4c Sofia Papagiannaki
        except:
635 bbf20a4c Sofia Papagiannaki
            self.fail('Response body should be json formatted')
636 bbf20a4c Sofia Papagiannaki
        else:
637 bbf20a4c Sofia Papagiannaki
            if not isinstance(data, dict):
638 bbf20a4c Sofia Papagiannaki
                self.fail('Response body should be json formatted dictionary')
639 bbf20a4c Sofia Papagiannaki
640 bbf20a4c Sofia Papagiannaki
            self.assertTrue('uuid_catalog' in data)
641 bbf20a4c Sofia Papagiannaki
            self.assertEqual(data['uuid_catalog'],
642 bbf20a4c Sofia Papagiannaki
                             {self.user.uuid: self.user.username})
643 bbf20a4c Sofia Papagiannaki
644 bbf20a4c Sofia Papagiannaki
            self.assertTrue('displayname_catalog' in data)
645 bbf20a4c Sofia Papagiannaki
            self.assertEqual(data['displayname_catalog'],
646 bbf20a4c Sofia Papagiannaki
                             {self.user.username: self.user.uuid})
647 bbf20a4c Sofia Papagiannaki
648 bbf20a4c Sofia Papagiannaki
        # assert Unauthorized: expired token
649 bbf20a4c Sofia Papagiannaki
        self.user.auth_token_expires = date.today() - timedelta(1)
650 bbf20a4c Sofia Papagiannaki
        self.user.save()
651 bbf20a4c Sofia Papagiannaki
652 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
653 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(d),
654 bbf20a4c Sofia Papagiannaki
                        content_type='application/json',
655 bbf20a4c Sofia Papagiannaki
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
656 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
657 bbf20a4c Sofia Papagiannaki
658 bbf20a4c Sofia Papagiannaki
        # assert Unauthorized: expired token
659 bbf20a4c Sofia Papagiannaki
        self.user.auth_token_expires = date.today() + timedelta(1)
660 bbf20a4c Sofia Papagiannaki
        self.user.save()
661 bbf20a4c Sofia Papagiannaki
662 bbf20a4c Sofia Papagiannaki
        # assert badRequest
663 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
664 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(str(d)),
665 bbf20a4c Sofia Papagiannaki
                        content_type='application/json',
666 bbf20a4c Sofia Papagiannaki
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
667 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
668 bbf20a4c Sofia Papagiannaki
669 bbf20a4c Sofia Papagiannaki
670 8aaf4f0d Georgios D. Tsoukalas
class WrongPathAPITest(TestCase):
671 cb26c74e Georgios D. Tsoukalas
    def test_catch_wrong_account_paths(self, *args):
672 8aaf4f0d Georgios D. Tsoukalas
        path = get_service_path(astakos_services, 'account', 'v1.0')
673 8aaf4f0d Georgios D. Tsoukalas
        path = join_urls(BASE_HOST, path, 'nonexistent')
674 8aaf4f0d Georgios D. Tsoukalas
        response = self.client.get(path)
675 8aaf4f0d Georgios D. Tsoukalas
        self.assertEqual(response.status_code, 400)
676 8aaf4f0d Georgios D. Tsoukalas
        try:
677 8aaf4f0d Georgios D. Tsoukalas
            error = json.loads(response.content)
678 8aaf4f0d Georgios D. Tsoukalas
        except ValueError:
679 8aaf4f0d Georgios D. Tsoukalas
            self.assertTrue(False)
680 8aaf4f0d Georgios D. Tsoukalas
681 cb26c74e Georgios D. Tsoukalas
    def test_catch_wrong_identity_paths(self, *args):
682 8aaf4f0d Georgios D. Tsoukalas
        path = get_service_path(astakos_services, 'identity', 'v2.0')
683 8aaf4f0d Georgios D. Tsoukalas
        path = join_urls(BASE_HOST, path, 'nonexistent')
684 8aaf4f0d Georgios D. Tsoukalas
        response = self.client.get(path)
685 8aaf4f0d Georgios D. Tsoukalas
        self.assertEqual(response.status_code, 400)
686 8aaf4f0d Georgios D. Tsoukalas
        try:
687 9b12caae Sofia Papagiannaki
            json.loads(response.content)
688 8aaf4f0d Georgios D. Tsoukalas
        except ValueError:
689 8aaf4f0d Georgios D. Tsoukalas
            self.assertTrue(False)