Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (31.5 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 be67d92e Sofia Papagiannaki
from astakos.oa2.backends import DjangoBackend
37 be67d92e Sofia Papagiannaki
38 8aaf4f0d Georgios D. Tsoukalas
from synnefo.lib.services import get_service_path
39 8aaf4f0d Georgios D. Tsoukalas
from synnefo.lib import join_urls
40 7ac2131c Sofia Papagiannaki
41 8cb96389 Sofia Papagiannaki
from django.core.urlresolvers import reverse
42 8cb96389 Sofia Papagiannaki
43 bbf20a4c Sofia Papagiannaki
from datetime import date
44 bbf20a4c Sofia Papagiannaki
45 8cb96389 Sofia Papagiannaki
#from xml.dom import minidom
46 7ac2131c Sofia Papagiannaki
47 7ac2131c Sofia Papagiannaki
import json
48 be67d92e Sofia Papagiannaki
import time
49 7ac2131c Sofia Papagiannaki
50 a248ebbb Kostas Papadimitriou
ROOT = "/%s/%s/%s/" % (
51 a248ebbb Kostas Papadimitriou
    astakos_settings.BASE_PATH, astakos_settings.ACCOUNTS_PREFIX, 'v1.0')
52 1ac3349d Kostas Papadimitriou
u = lambda url: ROOT + url
53 1ac3349d Kostas Papadimitriou
54 1ac3349d Kostas Papadimitriou
55 1ac3349d Kostas Papadimitriou
class QuotaAPITest(TestCase):
56 1ac3349d Kostas Papadimitriou
    def test_0(self):
57 1ac3349d Kostas Papadimitriou
        client = Client()
58 1b27f8a2 Giorgos Korfiatis
        backend = activation_backends.get_backend()
59 bd1f667b Giorgos Korfiatis
60 bd1f667b Giorgos Korfiatis
        component1 = Component.objects.create(name="comp1")
61 bd1f667b Giorgos Korfiatis
        register.add_service(component1, "service1", "type1", [])
62 1ac3349d Kostas Papadimitriou
        # custom service resources
63 1ac3349d Kostas Papadimitriou
        resource11 = {"name": "service1.resource11",
64 1ac3349d Kostas Papadimitriou
                      "desc": "resource11 desc",
65 bd1f667b Giorgos Korfiatis
                      "service_type": "type1",
66 a248ebbb Kostas Papadimitriou
                      "service_origin": "service1",
67 2dc27ac1 Giorgos Korfiatis
                      "ui_visible": True}
68 bd1f667b Giorgos Korfiatis
        r, _ = register.add_resource(resource11)
69 f72ba65d Giorgos Korfiatis
        register.update_resources([(r, 100)])
70 1ac3349d Kostas Papadimitriou
        resource12 = {"name": "service1.resource12",
71 1ac3349d Kostas Papadimitriou
                      "desc": "resource11 desc",
72 bd1f667b Giorgos Korfiatis
                      "service_type": "type1",
73 a248ebbb Kostas Papadimitriou
                      "service_origin": "service1",
74 1ac3349d Kostas Papadimitriou
                      "unit": "bytes"}
75 bd1f667b Giorgos Korfiatis
        r, _ = register.add_resource(resource12)
76 f72ba65d Giorgos Korfiatis
        register.update_resources([(r, 1024)])
77 1ac3349d Kostas Papadimitriou
78 1ac3349d Kostas Papadimitriou
        # create user
79 1ac3349d Kostas Papadimitriou
        user = get_local_user('test@grnet.gr')
80 1b27f8a2 Giorgos Korfiatis
        backend.accept_user(user)
81 3848b521 Giorgos Korfiatis
        non_moderated_user = get_local_user('nonmon@example.com',
82 3848b521 Giorgos Korfiatis
                                            is_active=False)
83 3848b521 Giorgos Korfiatis
        r_user = get_local_user('rej@example.com',
84 3848b521 Giorgos Korfiatis
                                is_active=False, email_verified=True)
85 3848b521 Giorgos Korfiatis
        backend.reject_user(r_user, "reason")
86 1ac3349d Kostas Papadimitriou
87 bd1f667b Giorgos Korfiatis
        component2 = Component.objects.create(name="comp2")
88 bd1f667b Giorgos Korfiatis
        register.add_service(component2, "service2", "type2", [])
89 1ac3349d Kostas Papadimitriou
        # create another service
90 1ac3349d Kostas Papadimitriou
        resource21 = {"name": "service2.resource21",
91 1ac3349d Kostas Papadimitriou
                      "desc": "resource11 desc",
92 bd1f667b Giorgos Korfiatis
                      "service_type": "type2",
93 a248ebbb Kostas Papadimitriou
                      "service_origin": "service2",
94 2dc27ac1 Giorgos Korfiatis
                      "ui_visible": False}
95 bd1f667b Giorgos Korfiatis
        r, _ = register.add_resource(resource21)
96 f72ba65d Giorgos Korfiatis
        register.update_resources([(r, 3)])
97 1ac3349d Kostas Papadimitriou
98 1ac3349d Kostas Papadimitriou
        resource_names = [r['name'] for r in
99 1ac3349d Kostas Papadimitriou
                          [resource11, resource12, resource21]]
100 1ac3349d Kostas Papadimitriou
101 1ac3349d Kostas Papadimitriou
        # get resources
102 1ac3349d Kostas Papadimitriou
        r = client.get(u('resources'))
103 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
104 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
105 1ac3349d Kostas Papadimitriou
        for name in resource_names:
106 1ac3349d Kostas Papadimitriou
            assertIn(name, body)
107 1ac3349d Kostas Papadimitriou
108 1ac3349d Kostas Papadimitriou
        # get quota
109 1ac3349d Kostas Papadimitriou
        r = client.get(u('quotas'))
110 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 401)
111 1ac3349d Kostas Papadimitriou
112 1ac3349d Kostas Papadimitriou
        headers = {'HTTP_X_AUTH_TOKEN': user.auth_token}
113 1ac3349d Kostas Papadimitriou
        r = client.get(u('quotas/'), **headers)
114 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
115 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
116 1ac3349d Kostas Papadimitriou
        system_quota = body['system']
117 1ac3349d Kostas Papadimitriou
        assertIn('system', body)
118 1ac3349d Kostas Papadimitriou
        for name in resource_names:
119 1ac3349d Kostas Papadimitriou
            assertIn(name, system_quota)
120 1ac3349d Kostas Papadimitriou
121 1b27f8a2 Giorgos Korfiatis
        nmheaders = {'HTTP_X_AUTH_TOKEN': non_moderated_user.auth_token}
122 1b27f8a2 Giorgos Korfiatis
        r = client.get(u('quotas/'), **nmheaders)
123 3848b521 Giorgos Korfiatis
        self.assertEqual(r.status_code, 401)
124 3848b521 Giorgos Korfiatis
125 3848b521 Giorgos Korfiatis
        q = quotas.get_user_quotas(non_moderated_user)
126 3848b521 Giorgos Korfiatis
        self.assertEqual(q, {})
127 3848b521 Giorgos Korfiatis
128 3848b521 Giorgos Korfiatis
        q = quotas.get_user_quotas(r_user)
129 3848b521 Giorgos Korfiatis
        self.assertEqual(q, {})
130 1b27f8a2 Giorgos Korfiatis
131 1ac3349d Kostas Papadimitriou
        r = client.get(u('service_quotas'))
132 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 401)
133 1ac3349d Kostas Papadimitriou
134 bd1f667b Giorgos Korfiatis
        s1_headers = {'HTTP_X_AUTH_TOKEN': component1.auth_token}
135 1ac3349d Kostas Papadimitriou
        r = client.get(u('service_quotas'), **s1_headers)
136 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
137 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
138 1ac3349d Kostas Papadimitriou
        assertIn(user.uuid, body)
139 1ac3349d Kostas Papadimitriou
140 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions'), **s1_headers)
141 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
142 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
143 1ac3349d Kostas Papadimitriou
        self.assertEqual(body, [])
144 1ac3349d Kostas Papadimitriou
145 1ac3349d Kostas Papadimitriou
        # issue some commissions
146 1ac3349d Kostas Papadimitriou
        commission_request = {
147 1ac3349d Kostas Papadimitriou
            "force": False,
148 1ac3349d Kostas Papadimitriou
            "auto_accept": False,
149 1ac3349d Kostas Papadimitriou
            "name": "my commission",
150 1ac3349d Kostas Papadimitriou
            "provisions": [
151 1ac3349d Kostas Papadimitriou
                {
152 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
153 1ac3349d Kostas Papadimitriou
                    "source": "system",
154 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
155 1ac3349d Kostas Papadimitriou
                    "quantity": 1
156 1ac3349d Kostas Papadimitriou
                },
157 1ac3349d Kostas Papadimitriou
                {
158 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
159 1ac3349d Kostas Papadimitriou
                    "source": "system",
160 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
161 1ac3349d Kostas Papadimitriou
                    "quantity": 30000
162 1ac3349d Kostas Papadimitriou
                }]}
163 1ac3349d Kostas Papadimitriou
164 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
165 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
166 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
167 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 413)
168 1ac3349d Kostas Papadimitriou
169 1ac3349d Kostas Papadimitriou
        commission_request = {
170 1ac3349d Kostas Papadimitriou
            "force": False,
171 1ac3349d Kostas Papadimitriou
            "auto_accept": False,
172 1ac3349d Kostas Papadimitriou
            "name": "my commission",
173 1ac3349d Kostas Papadimitriou
            "provisions": [
174 1ac3349d Kostas Papadimitriou
                {
175 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
176 1ac3349d Kostas Papadimitriou
                    "source": "system",
177 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
178 1ac3349d Kostas Papadimitriou
                    "quantity": 1
179 1ac3349d Kostas Papadimitriou
                },
180 1ac3349d Kostas Papadimitriou
                {
181 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
182 1ac3349d Kostas Papadimitriou
                    "source": "system",
183 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
184 1ac3349d Kostas Papadimitriou
                    "quantity": 100
185 1ac3349d Kostas Papadimitriou
                }]}
186 1ac3349d Kostas Papadimitriou
187 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
188 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
189 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
190 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
191 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
192 fb619437 Giorgos Korfiatis
        serial1 = body['serial']
193 fb619437 Giorgos Korfiatis
        assertGreater(serial1, 0)
194 1ac3349d Kostas Papadimitriou
195 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
196 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
197 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
198 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
199 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
200 fb619437 Giorgos Korfiatis
        serial2 = body['serial']
201 fb619437 Giorgos Korfiatis
        assertGreater(serial2, serial1)
202 1ac3349d Kostas Papadimitriou
203 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
204 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
205 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
206 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
207 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
208 fb619437 Giorgos Korfiatis
        serial3 = body['serial']
209 fb619437 Giorgos Korfiatis
        assertGreater(serial3, serial2)
210 1ac3349d Kostas Papadimitriou
211 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions'), **s1_headers)
212 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
213 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
214 fb619437 Giorgos Korfiatis
        self.assertEqual(len(body), 3)
215 1ac3349d Kostas Papadimitriou
216 fb619437 Giorgos Korfiatis
        r = client.get(u('commissions/' + str(serial1)), **s1_headers)
217 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
218 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
219 fb619437 Giorgos Korfiatis
        self.assertEqual(body['serial'], serial1)
220 1ac3349d Kostas Papadimitriou
        assertIn('issue_time', body)
221 2d31dfd7 Giorgos Korfiatis
        provisions = sorted(body['provisions'], key=lambda p: p['resource'])
222 2d31dfd7 Giorgos Korfiatis
        self.assertEqual(provisions, commission_request['provisions'])
223 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['name'], commission_request['name'])
224 1ac3349d Kostas Papadimitriou
225 1ac3349d Kostas Papadimitriou
        r = client.get(u('service_quotas?user=' + user.uuid), **s1_headers)
226 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
227 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
228 1ac3349d Kostas Papadimitriou
        user_quota = body[user.uuid]
229 1ac3349d Kostas Papadimitriou
        system_quota = user_quota['system']
230 1ac3349d Kostas Papadimitriou
        r11 = system_quota[resource11['name']]
231 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['usage'], 3)
232 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['pending'], 3)
233 1ac3349d Kostas Papadimitriou
234 1ac3349d Kostas Papadimitriou
        # resolve pending commissions
235 1ac3349d Kostas Papadimitriou
        resolve_data = {
236 fb619437 Giorgos Korfiatis
            "accept": [serial1, serial3],
237 fb619437 Giorgos Korfiatis
            "reject": [serial2, serial3, serial3 + 1],
238 1ac3349d Kostas Papadimitriou
        }
239 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(resolve_data)
240 1ac3349d Kostas Papadimitriou
241 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions/action'), post_data,
242 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
243 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
244 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
245 fb619437 Giorgos Korfiatis
        self.assertEqual(body['accepted'], [serial1])
246 fb619437 Giorgos Korfiatis
        self.assertEqual(body['rejected'], [serial2])
247 1ac3349d Kostas Papadimitriou
        failed = body['failed']
248 1ac3349d Kostas Papadimitriou
        self.assertEqual(len(failed), 2)
249 1ac3349d Kostas Papadimitriou
250 fb619437 Giorgos Korfiatis
        r = client.get(u('commissions/' + str(serial1)), **s1_headers)
251 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
252 1ac3349d Kostas Papadimitriou
253 1ac3349d Kostas Papadimitriou
        # auto accept
254 1ac3349d Kostas Papadimitriou
        commission_request = {
255 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
256 1ac3349d Kostas Papadimitriou
            "name": "my commission",
257 1ac3349d Kostas Papadimitriou
            "provisions": [
258 1ac3349d Kostas Papadimitriou
                {
259 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
260 1ac3349d Kostas Papadimitriou
                    "source": "system",
261 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
262 1ac3349d Kostas Papadimitriou
                    "quantity": 1
263 1ac3349d Kostas Papadimitriou
                },
264 1ac3349d Kostas Papadimitriou
                {
265 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
266 1ac3349d Kostas Papadimitriou
                    "source": "system",
267 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
268 1ac3349d Kostas Papadimitriou
                    "quantity": 100
269 1ac3349d Kostas Papadimitriou
                }]}
270 1ac3349d Kostas Papadimitriou
271 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
272 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
273 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
274 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
275 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
276 fb619437 Giorgos Korfiatis
        serial4 = body['serial']
277 fb619437 Giorgos Korfiatis
        assertGreater(serial4, serial3)
278 1ac3349d Kostas Papadimitriou
279 fb619437 Giorgos Korfiatis
        r = client.get(u('commissions/' + str(serial4)), **s1_headers)
280 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
281 1ac3349d Kostas Papadimitriou
282 1ac3349d Kostas Papadimitriou
        # malformed
283 1ac3349d Kostas Papadimitriou
        commission_request = {
284 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
285 1ac3349d Kostas Papadimitriou
            "name": "my commission",
286 1ac3349d Kostas Papadimitriou
            "provisions": [
287 1ac3349d Kostas Papadimitriou
                {
288 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
289 1ac3349d Kostas Papadimitriou
                    "source": "system",
290 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
291 1ac3349d Kostas Papadimitriou
                }
292 1ac3349d Kostas Papadimitriou
            ]}
293 1ac3349d Kostas Papadimitriou
294 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
295 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
296 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
297 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 400)
298 1ac3349d Kostas Papadimitriou
299 1ac3349d Kostas Papadimitriou
        commission_request = {
300 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
301 1ac3349d Kostas Papadimitriou
            "name": "my commission",
302 1ac3349d Kostas Papadimitriou
            "provisions": "dummy"}
303 1ac3349d Kostas Papadimitriou
304 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
305 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
306 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
307 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 400)
308 1ac3349d Kostas Papadimitriou
309 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), commission_request,
310 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
311 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 400)
312 1ac3349d Kostas Papadimitriou
313 1ac3349d Kostas Papadimitriou
        # no holding
314 1ac3349d Kostas Papadimitriou
        commission_request = {
315 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
316 1ac3349d Kostas Papadimitriou
            "name": "my commission",
317 1ac3349d Kostas Papadimitriou
            "provisions": [
318 1ac3349d Kostas Papadimitriou
                {
319 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
320 1ac3349d Kostas Papadimitriou
                    "source": "system",
321 1ac3349d Kostas Papadimitriou
                    "resource": "non existent",
322 1ac3349d Kostas Papadimitriou
                    "quantity": 1
323 1ac3349d Kostas Papadimitriou
                },
324 1ac3349d Kostas Papadimitriou
                {
325 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
326 1ac3349d Kostas Papadimitriou
                    "source": "system",
327 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
328 1ac3349d Kostas Papadimitriou
                    "quantity": 100
329 1ac3349d Kostas Papadimitriou
                }]}
330 1ac3349d Kostas Papadimitriou
331 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
332 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
333 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
334 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
335 1ac3349d Kostas Papadimitriou
336 1ac3349d Kostas Papadimitriou
        # release
337 1ac3349d Kostas Papadimitriou
        commission_request = {
338 1ac3349d Kostas Papadimitriou
            "provisions": [
339 1ac3349d Kostas Papadimitriou
                {
340 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
341 1ac3349d Kostas Papadimitriou
                    "source": "system",
342 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
343 1ac3349d Kostas Papadimitriou
                    "quantity": -1
344 1ac3349d Kostas Papadimitriou
                }
345 1ac3349d Kostas Papadimitriou
            ]}
346 1ac3349d Kostas Papadimitriou
347 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
348 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
349 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
350 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
351 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
352 1ac3349d Kostas Papadimitriou
        serial = body['serial']
353 1ac3349d Kostas Papadimitriou
354 1ac3349d Kostas Papadimitriou
        accept_data = {'accept': ""}
355 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(accept_data)
356 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions/' + str(serial) + '/action'), post_data,
357 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
358 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
359 1ac3349d Kostas Papadimitriou
360 1ac3349d Kostas Papadimitriou
        reject_data = {'reject': ""}
361 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(accept_data)
362 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions/' + str(serial) + '/action'), post_data,
363 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
364 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
365 1ac3349d Kostas Papadimitriou
366 1ac3349d Kostas Papadimitriou
        # force
367 1ac3349d Kostas Papadimitriou
        commission_request = {
368 1ac3349d Kostas Papadimitriou
            "force": True,
369 1ac3349d Kostas Papadimitriou
            "provisions": [
370 1ac3349d Kostas Papadimitriou
                {
371 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
372 1ac3349d Kostas Papadimitriou
                    "source": "system",
373 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
374 1ac3349d Kostas Papadimitriou
                    "quantity": 100
375 1ac3349d Kostas Papadimitriou
                }]}
376 1ac3349d Kostas Papadimitriou
377 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
378 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
379 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
380 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
381 1ac3349d Kostas Papadimitriou
382 1ac3349d Kostas Papadimitriou
        commission_request = {
383 1ac3349d Kostas Papadimitriou
            "force": True,
384 1ac3349d Kostas Papadimitriou
            "provisions": [
385 1ac3349d Kostas Papadimitriou
                {
386 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
387 1ac3349d Kostas Papadimitriou
                    "source": "system",
388 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
389 1ac3349d Kostas Papadimitriou
                    "quantity": -200
390 1ac3349d Kostas Papadimitriou
                }]}
391 1ac3349d Kostas Papadimitriou
392 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
393 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
394 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
395 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 413)
396 1ac3349d Kostas Papadimitriou
397 1ac3349d Kostas Papadimitriou
        r = client.get(u('quotas'), **headers)
398 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
399 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
400 1ac3349d Kostas Papadimitriou
        system_quota = body['system']
401 1ac3349d Kostas Papadimitriou
        r11 = system_quota[resource11['name']]
402 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['usage'], 102)
403 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['pending'], 101)
404 7ac2131c Sofia Papagiannaki
405 8ff1e8d9 Giorgos Korfiatis
        # Bad Request
406 8ff1e8d9 Giorgos Korfiatis
        r = client.head(u('commissions'))
407 2aba7764 Sofia Papagiannaki
        self.assertEqual(r.status_code, 405)
408 2aba7764 Sofia Papagiannaki
        self.assertTrue('Allow' in r)
409 8ff1e8d9 Giorgos Korfiatis
410 7ac2131c Sofia Papagiannaki
411 7ac2131c Sofia Papagiannaki
class TokensApiTest(TestCase):
412 7ac2131c Sofia Papagiannaki
    def setUp(self):
413 ab7ca50a Sofia Papagiannaki
        backend = activation_backends.get_backend()
414 ab7ca50a Sofia Papagiannaki
415 1808f7bc Giorgos Korfiatis
        self.user1 = get_local_user(
416 1808f7bc Giorgos Korfiatis
            'test1@example.org', email_verified=True, moderated=True,
417 ab7ca50a Sofia Papagiannaki
            is_rejected=False)
418 ab7ca50a Sofia Papagiannaki
        backend.activate_user(self.user1)
419 ab7ca50a Sofia Papagiannaki
        assert self.user1.is_active is True
420 ab7ca50a Sofia Papagiannaki
421 1808f7bc Giorgos Korfiatis
        self.user2 = get_local_user(
422 1808f7bc Giorgos Korfiatis
            'test2@example.org', email_verified=True, moderated=True,
423 ab7ca50a Sofia Papagiannaki
            is_rejected=False)
424 ab7ca50a Sofia Papagiannaki
        backend.activate_user(self.user2)
425 ab7ca50a Sofia Papagiannaki
        assert self.user2.is_active is True
426 7ac2131c Sofia Papagiannaki
427 8cb96389 Sofia Papagiannaki
        c1 = Component(name='component1', url='http://localhost/component1')
428 8cb96389 Sofia Papagiannaki
        c1.save()
429 8cb96389 Sofia Papagiannaki
        s1 = Service(component=c1, type='type1', name='service1')
430 8cb96389 Sofia Papagiannaki
        s1.save()
431 8cb96389 Sofia Papagiannaki
        e1 = Endpoint(service=s1)
432 8cb96389 Sofia Papagiannaki
        e1.save()
433 8cb96389 Sofia Papagiannaki
        e1.data.create(key='versionId', value='v1.0')
434 8cb96389 Sofia Papagiannaki
        e1.data.create(key='publicURL', value='http://localhost:8000/s1/v1.0')
435 8cb96389 Sofia Papagiannaki
436 8cb96389 Sofia Papagiannaki
        s2 = Service(component=c1, type='type2', name='service2')
437 8cb96389 Sofia Papagiannaki
        s2.save()
438 8cb96389 Sofia Papagiannaki
        e2 = Endpoint(service=s2)
439 8cb96389 Sofia Papagiannaki
        e2.save()
440 8cb96389 Sofia Papagiannaki
        e2.data.create(key='versionId', value='v1.0')
441 8cb96389 Sofia Papagiannaki
        e2.data.create(key='publicURL', value='http://localhost:8000/s2/v1.0')
442 8cb96389 Sofia Papagiannaki
443 8cb96389 Sofia Papagiannaki
        c2 = Component(name='component2', url='http://localhost/component2')
444 8cb96389 Sofia Papagiannaki
        c2.save()
445 8cb96389 Sofia Papagiannaki
        s3 = Service(component=c2, type='type3', name='service3')
446 8cb96389 Sofia Papagiannaki
        s3.save()
447 8cb96389 Sofia Papagiannaki
        e3 = Endpoint(service=s3)
448 8cb96389 Sofia Papagiannaki
        e3.save()
449 8cb96389 Sofia Papagiannaki
        e3.data.create(key='versionId', value='v2.0')
450 8cb96389 Sofia Papagiannaki
        e3.data.create(key='publicURL', value='http://localhost:8000/s3/v2.0')
451 7ac2131c Sofia Papagiannaki
452 be67d92e Sofia Papagiannaki
        oa2_backend = DjangoBackend()
453 be67d92e Sofia Papagiannaki
        self.token = oa2_backend.token_model.create(
454 be67d92e Sofia Papagiannaki
            code='12345',
455 be67d92e Sofia Papagiannaki
            expires_at=datetime.now() + timedelta(seconds=5),
456 be67d92e Sofia Papagiannaki
            user=self.user1,
457 be67d92e Sofia Papagiannaki
            client=oa2_backend.client_model.create(type='public'),
458 be67d92e Sofia Papagiannaki
            redirect_uri='https://server.com/handle_code')
459 be67d92e Sofia Papagiannaki
460 f870efe2 Sofia Papagiannaki
    def test_authenticate(self):
461 7ac2131c Sofia Papagiannaki
        client = Client()
462 3472d390 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
463 7ac2131c Sofia Papagiannaki
464 f870efe2 Sofia Papagiannaki
        # Check not allowed method
465 f870efe2 Sofia Papagiannaki
        r = client.get(url, post_data={})
466 2aba7764 Sofia Papagiannaki
        self.assertEqual(r.status_code, 405)
467 2aba7764 Sofia Papagiannaki
        self.assertTrue('Allow' in r)
468 2aba7764 Sofia Papagiannaki
        self.assertEqual(r['Allow'], 'POST')
469 f870efe2 Sofia Papagiannaki
470 d29f0371 Sofia Papagiannaki
        # check public mode
471 d29f0371 Sofia Papagiannaki
        r = client.post(url, CONTENT_LENGTH=0)
472 d29f0371 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
473 d29f0371 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
474 d29f0371 Sofia Papagiannaki
        try:
475 d29f0371 Sofia Papagiannaki
            body = json.loads(r.content)
476 d29f0371 Sofia Papagiannaki
        except Exception, e:
477 d29f0371 Sofia Papagiannaki
            self.fail(e)
478 d29f0371 Sofia Papagiannaki
        self.assertTrue('token' not in body.get('access'))
479 d29f0371 Sofia Papagiannaki
        self.assertTrue('user' not in body.get('access'))
480 d29f0371 Sofia Papagiannaki
        self.assertTrue('serviceCatalog' in body.get('access'))
481 f870efe2 Sofia Papagiannaki
482 f870efe2 Sofia Papagiannaki
        # Check unsupported xml input
483 f870efe2 Sofia Papagiannaki
        post_data = """
484 f870efe2 Sofia Papagiannaki
            <?xml version="1.0" encoding="UTF-8"?>
485 f870efe2 Sofia Papagiannaki
                <auth xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
486 f870efe2 Sofia Papagiannaki
                 xmlns="http://docs.openstack.org/identity/api/v2.0"
487 f870efe2 Sofia Papagiannaki
                 tenantName="%s">
488 f870efe2 Sofia Papagiannaki
                  <passwordCredentials username="%s" password="%s"/>
489 f870efe2 Sofia Papagiannaki
                </auth>""" % (self.user1.uuid, self.user1.uuid,
490 f870efe2 Sofia Papagiannaki
                              self.user1.auth_token)
491 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/xml')
492 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
493 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
494 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'],
495 f870efe2 Sofia Papagiannaki
                         "Unsupported Content-type: 'application/xml'")
496 f870efe2 Sofia Papagiannaki
497 f870efe2 Sofia Papagiannaki
        # Check malformed request: missing password
498 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s"},
499 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
500 f870efe2 Sofia Papagiannaki
            self.user1.uuid, self.user1.uuid)
501 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
502 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
503 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
504 11366070 Sofia Papagiannaki
        self.assertTrue(body['badRequest']['message'].
505 11366070 Sofia Papagiannaki
                        startswith('Malformed request'))
506 f870efe2 Sofia Papagiannaki
507 f870efe2 Sofia Papagiannaki
        # Check malformed request: missing username
508 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"password":"%s"},
509 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
510 f870efe2 Sofia Papagiannaki
            self.user1.auth_token, self.user1.uuid)
511 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
512 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
513 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
514 11366070 Sofia Papagiannaki
        self.assertTrue(body['badRequest']['message'].
515 11366070 Sofia Papagiannaki
                        startswith('Malformed request'))
516 f870efe2 Sofia Papagiannaki
517 f870efe2 Sofia Papagiannaki
        # Check invalid pass
518 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
519 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
520 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
521 f870efe2 Sofia Papagiannaki
            self.user1.uuid, '', self.user1.uuid)
522 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
523 7ac2131c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
524 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
525 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['unauthorized']['message'],
526 f870efe2 Sofia Papagiannaki
                         'Invalid token')
527 f870efe2 Sofia Papagiannaki
528 f870efe2 Sofia Papagiannaki
        # Check inconsistent pass
529 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
530 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
531 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
532 49005665 Sofia Papagiannaki
            self.user1.uuid, self.user2.auth_token, self.user2.uuid)
533 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
534 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
535 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
536 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['unauthorized']['message'],
537 f870efe2 Sofia Papagiannaki
                         'Invalid credentials')
538 f870efe2 Sofia Papagiannaki
539 f870efe2 Sofia Papagiannaki
        # Check invalid json data
540 f870efe2 Sofia Papagiannaki
        r = client.post(url, "not json", content_type='application/json')
541 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
542 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
543 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'], 'Invalid JSON data')
544 f870efe2 Sofia Papagiannaki
545 f870efe2 Sofia Papagiannaki
        # Check auth with token
546 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"token": {"id":"%s"},
547 f870efe2 Sofia Papagiannaki
                        "tenantName":"%s"}}""" % (
548 f870efe2 Sofia Papagiannaki
            self.user1.auth_token, self.user1.uuid)
549 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
550 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
551 f870efe2 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
552 f870efe2 Sofia Papagiannaki
        try:
553 f870efe2 Sofia Papagiannaki
            body = json.loads(r.content)
554 f870efe2 Sofia Papagiannaki
        except Exception, e:
555 f870efe2 Sofia Papagiannaki
            self.fail(e)
556 f870efe2 Sofia Papagiannaki
557 11366070 Sofia Papagiannaki
        # Check malformed request: missing token
558 11366070 Sofia Papagiannaki
        post_data = """{"auth":{"auth_token":{"id":"%s"},
559 11366070 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
560 11366070 Sofia Papagiannaki
            self.user1.auth_token, self.user1.uuid)
561 11366070 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
562 11366070 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
563 11366070 Sofia Papagiannaki
        body = json.loads(r.content)
564 11366070 Sofia Papagiannaki
        self.assertTrue(body['badRequest']['message'].
565 11366070 Sofia Papagiannaki
                        startswith('Malformed request'))
566 11366070 Sofia Papagiannaki
567 11366070 Sofia Papagiannaki
        # Check bad request: inconsistent tenant
568 11366070 Sofia Papagiannaki
        post_data = """{"auth":{"token":{"id":"%s"},
569 11366070 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
570 11366070 Sofia Papagiannaki
            self.user1.auth_token, self.user2.uuid)
571 11366070 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
572 11366070 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
573 11366070 Sofia Papagiannaki
        body = json.loads(r.content)
574 11366070 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'],
575 11366070 Sofia Papagiannaki
                         'Not conforming tenantName')
576 11366070 Sofia Papagiannaki
577 a01eb018 Sofia Papagiannaki
        # Check bad request: inconsistent tenant
578 a01eb018 Sofia Papagiannaki
        post_data = """{"auth":{"token":{"id":"%s"},
579 a01eb018 Sofia Papagiannaki
                                "tenantName":""}}""" % (
580 a01eb018 Sofia Papagiannaki
            self.user1.auth_token)
581 a01eb018 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
582 a01eb018 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
583 a01eb018 Sofia Papagiannaki
584 be67d92e Sofia Papagiannaki
        # Check successful json response: user credential auth
585 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
586 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
587 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
588 f870efe2 Sofia Papagiannaki
            self.user1.uuid, self.user1.auth_token, self.user1.uuid)
589 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
590 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
591 f870efe2 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
592 f870efe2 Sofia Papagiannaki
        try:
593 f870efe2 Sofia Papagiannaki
            body = json.loads(r.content)
594 f870efe2 Sofia Papagiannaki
        except Exception, e:
595 f870efe2 Sofia Papagiannaki
            self.fail(e)
596 f870efe2 Sofia Papagiannaki
597 f870efe2 Sofia Papagiannaki
        try:
598 8cb96389 Sofia Papagiannaki
            token = body['access']['token']['id']
599 8cb96389 Sofia Papagiannaki
            user = body['access']['user']['id']
600 8cb96389 Sofia Papagiannaki
            service_catalog = body['access']['serviceCatalog']
601 f870efe2 Sofia Papagiannaki
        except KeyError:
602 f870efe2 Sofia Papagiannaki
            self.fail('Invalid response')
603 f870efe2 Sofia Papagiannaki
604 f870efe2 Sofia Papagiannaki
        self.assertEqual(token, self.user1.auth_token)
605 f870efe2 Sofia Papagiannaki
        self.assertEqual(user, self.user1.uuid)
606 f870efe2 Sofia Papagiannaki
        self.assertEqual(len(service_catalog), 3)
607 f870efe2 Sofia Papagiannaki
608 be67d92e Sofia Papagiannaki
        # Check successful json response: token auth
609 be67d92e Sofia Papagiannaki
        post_data = """{"auth":{"token":{"id":"%s"},
610 be67d92e Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
611 be67d92e Sofia Papagiannaki
            self.user1.auth_token, self.user1.uuid)
612 be67d92e Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
613 be67d92e Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
614 be67d92e Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
615 be67d92e Sofia Papagiannaki
        try:
616 be67d92e Sofia Papagiannaki
            body = json.loads(r.content)
617 be67d92e Sofia Papagiannaki
        except Exception, e:
618 be67d92e Sofia Papagiannaki
            self.fail(e)
619 be67d92e Sofia Papagiannaki
620 be67d92e Sofia Papagiannaki
        try:
621 be67d92e Sofia Papagiannaki
            token = body['access']['token']['id']
622 be67d92e Sofia Papagiannaki
            user = body['access']['user']['id']
623 be67d92e Sofia Papagiannaki
            service_catalog = body['access']['serviceCatalog']
624 be67d92e Sofia Papagiannaki
        except KeyError:
625 be67d92e Sofia Papagiannaki
            self.fail('Invalid response')
626 be67d92e Sofia Papagiannaki
627 be67d92e Sofia Papagiannaki
        self.assertEqual(token, self.user1.auth_token)
628 be67d92e Sofia Papagiannaki
        self.assertEqual(user, self.user1.uuid)
629 be67d92e Sofia Papagiannaki
        self.assertEqual(len(service_catalog), 3)
630 be67d92e Sofia Papagiannaki
631 f870efe2 Sofia Papagiannaki
        # Check successful xml response
632 f870efe2 Sofia Papagiannaki
        headers = {'HTTP_ACCEPT': 'application/xml'}
633 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
634 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
635 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
636 f870efe2 Sofia Papagiannaki
            self.user1.uuid, self.user1.auth_token, self.user1.uuid)
637 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json',
638 f870efe2 Sofia Papagiannaki
                        **headers)
639 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
640 f870efe2 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/xml'))
641 49005665 Sofia Papagiannaki
#        try:
642 49005665 Sofia Papagiannaki
#            body = minidom.parseString(r.content)
643 49005665 Sofia Papagiannaki
#        except Exception, e:
644 49005665 Sofia Papagiannaki
#            self.fail(e)
645 8aaf4f0d Georgios D. Tsoukalas
646 be67d92e Sofia Papagiannaki
        # oath access token authorization
647 be67d92e Sofia Papagiannaki
        post_data = """{"auth":{"token":{"id":"%s"},
648 be67d92e Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
649 be67d92e Sofia Papagiannaki
            self.token.code, self.user1.uuid)
650 be67d92e Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
651 be67d92e Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
652 be67d92e Sofia Papagiannaki
653 8aaf4f0d Georgios D. Tsoukalas
654 bbf20a4c Sofia Papagiannaki
class UserCatalogsTest(TestCase):
655 bbf20a4c Sofia Papagiannaki
    def test_get_uuid_displayname_catalogs(self):
656 1808f7bc Giorgos Korfiatis
        self.user = get_local_user(
657 1808f7bc Giorgos Korfiatis
            'test1@example.org', email_verified=True, moderated=True,
658 1808f7bc Giorgos Korfiatis
            is_rejected=False, is_active=False)
659 bbf20a4c Sofia Papagiannaki
660 bbf20a4c Sofia Papagiannaki
        client = Client()
661 bbf20a4c Sofia Papagiannaki
        url = reverse('astakos.api.user.get_uuid_displayname_catalogs')
662 bbf20a4c Sofia Papagiannaki
        d = dict(uuids=[self.user.uuid], displaynames=[self.user.username])
663 bbf20a4c Sofia Papagiannaki
664 bbf20a4c Sofia Papagiannaki
        # assert Unauthorized: missing authentication token
665 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
666 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(d),
667 bbf20a4c Sofia Papagiannaki
                        content_type='application/json')
668 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
669 bbf20a4c Sofia Papagiannaki
670 bbf20a4c Sofia Papagiannaki
        # assert Unauthorized: invalid authentication token
671 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
672 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(d),
673 bbf20a4c Sofia Papagiannaki
                        content_type='application/json',
674 bbf20a4c Sofia Papagiannaki
                        HTTP_X_AUTH_TOKEN='1234')
675 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
676 bbf20a4c Sofia Papagiannaki
677 bbf20a4c Sofia Papagiannaki
        # assert Unauthorized: inactive token holder
678 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
679 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(d),
680 bbf20a4c Sofia Papagiannaki
                        content_type='application/json',
681 bbf20a4c Sofia Papagiannaki
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
682 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
683 bbf20a4c Sofia Papagiannaki
684 bbf20a4c Sofia Papagiannaki
        backend = activation_backends.get_backend()
685 bbf20a4c Sofia Papagiannaki
        backend.activate_user(self.user)
686 bbf20a4c Sofia Papagiannaki
        assert self.user.is_active is True
687 bbf20a4c Sofia Papagiannaki
688 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
689 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(d),
690 bbf20a4c Sofia Papagiannaki
                        content_type='application/json',
691 bbf20a4c Sofia Papagiannaki
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
692 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
693 bbf20a4c Sofia Papagiannaki
        try:
694 bbf20a4c Sofia Papagiannaki
            data = json.loads(r.content)
695 bbf20a4c Sofia Papagiannaki
        except:
696 bbf20a4c Sofia Papagiannaki
            self.fail('Response body should be json formatted')
697 bbf20a4c Sofia Papagiannaki
        else:
698 bbf20a4c Sofia Papagiannaki
            if not isinstance(data, dict):
699 bbf20a4c Sofia Papagiannaki
                self.fail('Response body should be json formatted dictionary')
700 bbf20a4c Sofia Papagiannaki
701 bbf20a4c Sofia Papagiannaki
            self.assertTrue('uuid_catalog' in data)
702 bbf20a4c Sofia Papagiannaki
            self.assertEqual(data['uuid_catalog'],
703 bbf20a4c Sofia Papagiannaki
                             {self.user.uuid: self.user.username})
704 bbf20a4c Sofia Papagiannaki
705 bbf20a4c Sofia Papagiannaki
            self.assertTrue('displayname_catalog' in data)
706 bbf20a4c Sofia Papagiannaki
            self.assertEqual(data['displayname_catalog'],
707 bbf20a4c Sofia Papagiannaki
                             {self.user.username: self.user.uuid})
708 bbf20a4c Sofia Papagiannaki
709 bbf20a4c Sofia Papagiannaki
        # assert Unauthorized: expired token
710 bbf20a4c Sofia Papagiannaki
        self.user.auth_token_expires = date.today() - timedelta(1)
711 bbf20a4c Sofia Papagiannaki
        self.user.save()
712 bbf20a4c Sofia Papagiannaki
713 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
714 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(d),
715 bbf20a4c Sofia Papagiannaki
                        content_type='application/json',
716 bbf20a4c Sofia Papagiannaki
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
717 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
718 bbf20a4c Sofia Papagiannaki
719 bbf20a4c Sofia Papagiannaki
        # assert Unauthorized: expired token
720 bbf20a4c Sofia Papagiannaki
        self.user.auth_token_expires = date.today() + timedelta(1)
721 bbf20a4c Sofia Papagiannaki
        self.user.save()
722 bbf20a4c Sofia Papagiannaki
723 bbf20a4c Sofia Papagiannaki
        # assert badRequest
724 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
725 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(str(d)),
726 bbf20a4c Sofia Papagiannaki
                        content_type='application/json',
727 bbf20a4c Sofia Papagiannaki
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
728 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
729 bbf20a4c Sofia Papagiannaki
730 bbf20a4c Sofia Papagiannaki
731 8aaf4f0d Georgios D. Tsoukalas
class WrongPathAPITest(TestCase):
732 cb26c74e Georgios D. Tsoukalas
    def test_catch_wrong_account_paths(self, *args):
733 8aaf4f0d Georgios D. Tsoukalas
        path = get_service_path(astakos_services, 'account', 'v1.0')
734 8aaf4f0d Georgios D. Tsoukalas
        path = join_urls(BASE_HOST, path, 'nonexistent')
735 8aaf4f0d Georgios D. Tsoukalas
        response = self.client.get(path)
736 8aaf4f0d Georgios D. Tsoukalas
        self.assertEqual(response.status_code, 400)
737 8aaf4f0d Georgios D. Tsoukalas
        try:
738 8aaf4f0d Georgios D. Tsoukalas
            error = json.loads(response.content)
739 8aaf4f0d Georgios D. Tsoukalas
        except ValueError:
740 8aaf4f0d Georgios D. Tsoukalas
            self.assertTrue(False)
741 8aaf4f0d Georgios D. Tsoukalas
742 cb26c74e Georgios D. Tsoukalas
    def test_catch_wrong_identity_paths(self, *args):
743 8aaf4f0d Georgios D. Tsoukalas
        path = get_service_path(astakos_services, 'identity', 'v2.0')
744 8aaf4f0d Georgios D. Tsoukalas
        path = join_urls(BASE_HOST, path, 'nonexistent')
745 8aaf4f0d Georgios D. Tsoukalas
        response = self.client.get(path)
746 8aaf4f0d Georgios D. Tsoukalas
        self.assertEqual(response.status_code, 400)
747 8aaf4f0d Georgios D. Tsoukalas
        try:
748 9b12caae Sofia Papagiannaki
            json.loads(response.content)
749 8aaf4f0d Georgios D. Tsoukalas
        except ValueError:
750 8aaf4f0d Georgios D. Tsoukalas
            self.assertTrue(False)
751 be67d92e Sofia Papagiannaki
752 be67d92e Sofia Papagiannaki
753 be67d92e Sofia Papagiannaki
class ValidateAccessToken(TestCase):
754 be67d92e Sofia Papagiannaki
    def setUp(self):
755 be67d92e Sofia Papagiannaki
        self.oa2_backend = DjangoBackend()
756 be67d92e Sofia Papagiannaki
        self.user = AstakosUser.objects.create(username="user@synnefo.org")
757 be67d92e Sofia Papagiannaki
        self.token = self.oa2_backend.token_model.create(
758 be67d92e Sofia Papagiannaki
            code='12345',
759 be67d92e Sofia Papagiannaki
            expires_at=datetime.now() + timedelta(seconds=5),
760 be67d92e Sofia Papagiannaki
            user=self.user,
761 be67d92e Sofia Papagiannaki
            client=self.oa2_backend.client_model.create(type='public'),
762 671e4232 Sofia Papagiannaki
            redirect_uri='https://server.com/handle_code',
763 671e4232 Sofia Papagiannaki
            scope='user-scope')
764 be67d92e Sofia Papagiannaki
765 be67d92e Sofia Papagiannaki
    def test_validate_token(self):
766 be67d92e Sofia Papagiannaki
        # invalid token
767 be67d92e Sofia Papagiannaki
        url = reverse('astakos.api.tokens.validate_token',
768 be67d92e Sofia Papagiannaki
                      kwargs={'token_id': 'invalid'})
769 be67d92e Sofia Papagiannaki
        r = self.client.get(url)
770 be67d92e Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)
771 be67d92e Sofia Papagiannaki
772 be67d92e Sofia Papagiannaki
        # valid token
773 be67d92e Sofia Papagiannaki
        url = reverse('astakos.api.tokens.validate_token',
774 be67d92e Sofia Papagiannaki
                      kwargs={'token_id': self.token.code})
775 be67d92e Sofia Papagiannaki
776 be67d92e Sofia Papagiannaki
        r = self.client.head(url)
777 ea05b306 Sofia Papagiannaki
        self.assertEqual(r.status_code, 405)
778 be67d92e Sofia Papagiannaki
        r = self.client.put(url)
779 ea05b306 Sofia Papagiannaki
        self.assertEqual(r.status_code, 405)
780 be67d92e Sofia Papagiannaki
        r = self.client.post(url)
781 ea05b306 Sofia Papagiannaki
        self.assertEqual(r.status_code, 405)
782 be67d92e Sofia Papagiannaki
783 be67d92e Sofia Papagiannaki
        r = self.client.get(url)
784 be67d92e Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
785 be67d92e Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
786 be67d92e Sofia Papagiannaki
        try:
787 be67d92e Sofia Papagiannaki
            body = json.loads(r.content)
788 be67d92e Sofia Papagiannaki
            user = body['access']['user']['id']
789 be67d92e Sofia Papagiannaki
            self.assertEqual(user, self.user.uuid)
790 be67d92e Sofia Papagiannaki
        except Exception:
791 be67d92e Sofia Papagiannaki
            self.fail('Unexpected response content')
792 be67d92e Sofia Papagiannaki
793 671e4232 Sofia Papagiannaki
        # inconsistent belongsTo parameter
794 671e4232 Sofia Papagiannaki
        r = self.client.get('%s?belongsTo=invalid' % url)
795 671e4232 Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)
796 671e4232 Sofia Papagiannaki
797 671e4232 Sofia Papagiannaki
        # consistent belongsTo parameter
798 671e4232 Sofia Papagiannaki
        r = self.client.get('%s?belongsTo=%s' % (url, self.token.scope))
799 671e4232 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
800 671e4232 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
801 671e4232 Sofia Papagiannaki
        try:
802 671e4232 Sofia Papagiannaki
            body = json.loads(r.content)
803 671e4232 Sofia Papagiannaki
            user = body['access']['user']['id']
804 671e4232 Sofia Papagiannaki
            self.assertEqual(user, self.user.uuid)
805 671e4232 Sofia Papagiannaki
        except Exception:
806 671e4232 Sofia Papagiannaki
            self.fail('Unexpected response content')
807 671e4232 Sofia Papagiannaki
808 be67d92e Sofia Papagiannaki
        # expired token
809 be67d92e Sofia Papagiannaki
        sleep_time = (self.token.expires_at - datetime.now()).total_seconds()
810 671e4232 Sofia Papagiannaki
        time.sleep(max(sleep_time, 0))
811 be67d92e Sofia Papagiannaki
        r = self.client.get(url)
812 be67d92e Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)
813 be67d92e Sofia Papagiannaki
        # assert expired token has been deleted
814 be67d92e Sofia Papagiannaki
        self.assertEqual(self.oa2_backend.token_model.count(), 0)
815 be67d92e Sofia Papagiannaki
816 be67d92e Sofia Papagiannaki
        # user authentication token
817 be67d92e Sofia Papagiannaki
        url = reverse('astakos.api.tokens.validate_token',
818 be67d92e Sofia Papagiannaki
                      kwargs={'token_id': self.user.auth_token})
819 be67d92e Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)