Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (31.9 kB)

1 ff5edb80 Giorgos Korfiatis
# Copyright 2011-2014 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 2070c5f8 Giorgos Korfiatis
        register.update_base_default(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 2070c5f8 Giorgos Korfiatis
        register.update_base_default(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 2070c5f8 Giorgos Korfiatis
        register.update_base_default(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 2070c5f8 Giorgos Korfiatis
        assertIn(user.uuid, body)
117 2070c5f8 Giorgos Korfiatis
        base_quota = body[user.uuid]
118 1ac3349d Kostas Papadimitriou
        for name in resource_names:
119 2070c5f8 Giorgos Korfiatis
            assertIn(name, base_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 2070c5f8 Giorgos Korfiatis
                    "holder": "user:" + user.uuid,
153 2070c5f8 Giorgos Korfiatis
                    "source": "project:" + user.uuid,
154 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
155 1ac3349d Kostas Papadimitriou
                    "quantity": 1
156 1ac3349d Kostas Papadimitriou
                },
157 1ac3349d Kostas Papadimitriou
                {
158 2070c5f8 Giorgos Korfiatis
                    "holder": "user:" + user.uuid,
159 2070c5f8 Giorgos Korfiatis
                    "source": "project:" + user.uuid,
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 2070c5f8 Giorgos Korfiatis
                    "holder": "user:" + user.uuid,
176 2070c5f8 Giorgos Korfiatis
                    "source": "project:" + user.uuid,
177 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
178 1ac3349d Kostas Papadimitriou
                    "quantity": 1
179 1ac3349d Kostas Papadimitriou
                },
180 1ac3349d Kostas Papadimitriou
                {
181 2070c5f8 Giorgos Korfiatis
                    "holder": "user:" + user.uuid,
182 2070c5f8 Giorgos Korfiatis
                    "source": "project:" + user.uuid,
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 2070c5f8 Giorgos Korfiatis
        base_quota = user_quota[user.uuid]
230 2070c5f8 Giorgos Korfiatis
        r11 = base_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 2070c5f8 Giorgos Korfiatis
        r = client.get(u('service_project_quotas'), **s1_headers)
235 2070c5f8 Giorgos Korfiatis
        self.assertEqual(r.status_code, 200)
236 2070c5f8 Giorgos Korfiatis
        body = json.loads(r.content)
237 2070c5f8 Giorgos Korfiatis
        assertIn(user.uuid, body)
238 2070c5f8 Giorgos Korfiatis
239 1ac3349d Kostas Papadimitriou
        # resolve pending commissions
240 1ac3349d Kostas Papadimitriou
        resolve_data = {
241 fb619437 Giorgos Korfiatis
            "accept": [serial1, serial3],
242 fb619437 Giorgos Korfiatis
            "reject": [serial2, serial3, serial3 + 1],
243 1ac3349d Kostas Papadimitriou
        }
244 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(resolve_data)
245 1ac3349d Kostas Papadimitriou
246 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions/action'), post_data,
247 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
248 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
249 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
250 fb619437 Giorgos Korfiatis
        self.assertEqual(body['accepted'], [serial1])
251 fb619437 Giorgos Korfiatis
        self.assertEqual(body['rejected'], [serial2])
252 1ac3349d Kostas Papadimitriou
        failed = body['failed']
253 1ac3349d Kostas Papadimitriou
        self.assertEqual(len(failed), 2)
254 1ac3349d Kostas Papadimitriou
255 fb619437 Giorgos Korfiatis
        r = client.get(u('commissions/' + str(serial1)), **s1_headers)
256 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
257 1ac3349d Kostas Papadimitriou
258 1ac3349d Kostas Papadimitriou
        # auto accept
259 1ac3349d Kostas Papadimitriou
        commission_request = {
260 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
261 1ac3349d Kostas Papadimitriou
            "name": "my commission",
262 1ac3349d Kostas Papadimitriou
            "provisions": [
263 1ac3349d Kostas Papadimitriou
                {
264 2070c5f8 Giorgos Korfiatis
                    "holder": "user:" + user.uuid,
265 2070c5f8 Giorgos Korfiatis
                    "source": "project:" + user.uuid,
266 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
267 1ac3349d Kostas Papadimitriou
                    "quantity": 1
268 1ac3349d Kostas Papadimitriou
                },
269 1ac3349d Kostas Papadimitriou
                {
270 2070c5f8 Giorgos Korfiatis
                    "holder": "user:" + user.uuid,
271 2070c5f8 Giorgos Korfiatis
                    "source": "project:" + user.uuid,
272 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
273 1ac3349d Kostas Papadimitriou
                    "quantity": 100
274 1ac3349d Kostas Papadimitriou
                }]}
275 1ac3349d Kostas Papadimitriou
276 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
277 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
278 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
279 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
280 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
281 fb619437 Giorgos Korfiatis
        serial4 = body['serial']
282 fb619437 Giorgos Korfiatis
        assertGreater(serial4, serial3)
283 1ac3349d Kostas Papadimitriou
284 fb619437 Giorgos Korfiatis
        r = client.get(u('commissions/' + str(serial4)), **s1_headers)
285 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
286 1ac3349d Kostas Papadimitriou
287 1ac3349d Kostas Papadimitriou
        # malformed
288 1ac3349d Kostas Papadimitriou
        commission_request = {
289 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
290 1ac3349d Kostas Papadimitriou
            "name": "my commission",
291 1ac3349d Kostas Papadimitriou
            "provisions": [
292 1ac3349d Kostas Papadimitriou
                {
293 2070c5f8 Giorgos Korfiatis
                    "holder": "user:" + user.uuid,
294 2070c5f8 Giorgos Korfiatis
                    "source": "project:" + user.uuid,
295 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
296 1ac3349d Kostas Papadimitriou
                }
297 1ac3349d Kostas Papadimitriou
            ]}
298 1ac3349d Kostas Papadimitriou
299 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
300 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
301 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
302 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 400)
303 1ac3349d Kostas Papadimitriou
304 1ac3349d Kostas Papadimitriou
        commission_request = {
305 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
306 1ac3349d Kostas Papadimitriou
            "name": "my commission",
307 1ac3349d Kostas Papadimitriou
            "provisions": "dummy"}
308 1ac3349d Kostas Papadimitriou
309 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
310 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
311 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
312 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 400)
313 1ac3349d Kostas Papadimitriou
314 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), commission_request,
315 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
316 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 400)
317 1ac3349d Kostas Papadimitriou
318 1ac3349d Kostas Papadimitriou
        # no holding
319 1ac3349d Kostas Papadimitriou
        commission_request = {
320 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
321 1ac3349d Kostas Papadimitriou
            "name": "my commission",
322 1ac3349d Kostas Papadimitriou
            "provisions": [
323 1ac3349d Kostas Papadimitriou
                {
324 2070c5f8 Giorgos Korfiatis
                    "holder": "user:" + user.uuid,
325 2070c5f8 Giorgos Korfiatis
                    "source": "project:" + user.uuid,
326 1ac3349d Kostas Papadimitriou
                    "resource": "non existent",
327 1ac3349d Kostas Papadimitriou
                    "quantity": 1
328 1ac3349d Kostas Papadimitriou
                },
329 1ac3349d Kostas Papadimitriou
                {
330 2070c5f8 Giorgos Korfiatis
                    "holder": "user:" + user.uuid,
331 2070c5f8 Giorgos Korfiatis
                    "source": "project:" + user.uuid,
332 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
333 1ac3349d Kostas Papadimitriou
                    "quantity": 100
334 1ac3349d Kostas Papadimitriou
                }]}
335 1ac3349d Kostas Papadimitriou
336 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
337 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
338 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
339 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
340 1ac3349d Kostas Papadimitriou
341 1ac3349d Kostas Papadimitriou
        # release
342 1ac3349d Kostas Papadimitriou
        commission_request = {
343 1ac3349d Kostas Papadimitriou
            "provisions": [
344 1ac3349d Kostas Papadimitriou
                {
345 2070c5f8 Giorgos Korfiatis
                    "holder": "user:" + user.uuid,
346 2070c5f8 Giorgos Korfiatis
                    "source": "project:" + user.uuid,
347 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
348 1ac3349d Kostas Papadimitriou
                    "quantity": -1
349 1ac3349d Kostas Papadimitriou
                }
350 1ac3349d Kostas Papadimitriou
            ]}
351 1ac3349d Kostas Papadimitriou
352 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
353 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
354 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
355 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
356 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
357 1ac3349d Kostas Papadimitriou
        serial = body['serial']
358 1ac3349d Kostas Papadimitriou
359 1ac3349d Kostas Papadimitriou
        accept_data = {'accept': ""}
360 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(accept_data)
361 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions/' + str(serial) + '/action'), post_data,
362 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
363 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
364 1ac3349d Kostas Papadimitriou
365 1ac3349d Kostas Papadimitriou
        reject_data = {'reject': ""}
366 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(accept_data)
367 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions/' + str(serial) + '/action'), post_data,
368 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
369 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
370 1ac3349d Kostas Papadimitriou
371 1ac3349d Kostas Papadimitriou
        # force
372 1ac3349d Kostas Papadimitriou
        commission_request = {
373 1ac3349d Kostas Papadimitriou
            "force": True,
374 1ac3349d Kostas Papadimitriou
            "provisions": [
375 1ac3349d Kostas Papadimitriou
                {
376 2070c5f8 Giorgos Korfiatis
                    "holder": "user:" + user.uuid,
377 2070c5f8 Giorgos Korfiatis
                    "source": "project:" + user.uuid,
378 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
379 1ac3349d Kostas Papadimitriou
                    "quantity": 100
380 1ac3349d Kostas Papadimitriou
                }]}
381 1ac3349d Kostas Papadimitriou
382 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
383 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
384 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
385 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
386 1ac3349d Kostas Papadimitriou
387 1ac3349d Kostas Papadimitriou
        commission_request = {
388 1ac3349d Kostas Papadimitriou
            "force": True,
389 1ac3349d Kostas Papadimitriou
            "provisions": [
390 1ac3349d Kostas Papadimitriou
                {
391 2070c5f8 Giorgos Korfiatis
                    "holder": "user:" + user.uuid,
392 2070c5f8 Giorgos Korfiatis
                    "source": "project:" + user.uuid,
393 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
394 1ac3349d Kostas Papadimitriou
                    "quantity": -200
395 1ac3349d Kostas Papadimitriou
                }]}
396 1ac3349d Kostas Papadimitriou
397 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
398 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
399 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
400 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 413)
401 1ac3349d Kostas Papadimitriou
402 1ac3349d Kostas Papadimitriou
        r = client.get(u('quotas'), **headers)
403 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
404 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
405 2070c5f8 Giorgos Korfiatis
        base_quota = body[user.uuid]
406 2070c5f8 Giorgos Korfiatis
        r11 = base_quota[resource11['name']]
407 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['usage'], 102)
408 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['pending'], 101)
409 7ac2131c Sofia Papagiannaki
410 8ff1e8d9 Giorgos Korfiatis
        # Bad Request
411 8ff1e8d9 Giorgos Korfiatis
        r = client.head(u('commissions'))
412 2aba7764 Sofia Papagiannaki
        self.assertEqual(r.status_code, 405)
413 2aba7764 Sofia Papagiannaki
        self.assertTrue('Allow' in r)
414 8ff1e8d9 Giorgos Korfiatis
415 7ac2131c Sofia Papagiannaki
416 7ac2131c Sofia Papagiannaki
class TokensApiTest(TestCase):
417 7ac2131c Sofia Papagiannaki
    def setUp(self):
418 ab7ca50a Sofia Papagiannaki
        backend = activation_backends.get_backend()
419 ab7ca50a Sofia Papagiannaki
420 1808f7bc Giorgos Korfiatis
        self.user1 = get_local_user(
421 1808f7bc Giorgos Korfiatis
            'test1@example.org', email_verified=True, moderated=True,
422 ab7ca50a Sofia Papagiannaki
            is_rejected=False)
423 ab7ca50a Sofia Papagiannaki
        backend.activate_user(self.user1)
424 ab7ca50a Sofia Papagiannaki
        assert self.user1.is_active is True
425 ab7ca50a Sofia Papagiannaki
426 1808f7bc Giorgos Korfiatis
        self.user2 = get_local_user(
427 1808f7bc Giorgos Korfiatis
            'test2@example.org', email_verified=True, moderated=True,
428 ab7ca50a Sofia Papagiannaki
            is_rejected=False)
429 ab7ca50a Sofia Papagiannaki
        backend.activate_user(self.user2)
430 ab7ca50a Sofia Papagiannaki
        assert self.user2.is_active is True
431 7ac2131c Sofia Papagiannaki
432 8cb96389 Sofia Papagiannaki
        c1 = Component(name='component1', url='http://localhost/component1')
433 8cb96389 Sofia Papagiannaki
        c1.save()
434 8cb96389 Sofia Papagiannaki
        s1 = Service(component=c1, type='type1', name='service1')
435 8cb96389 Sofia Papagiannaki
        s1.save()
436 8cb96389 Sofia Papagiannaki
        e1 = Endpoint(service=s1)
437 8cb96389 Sofia Papagiannaki
        e1.save()
438 8cb96389 Sofia Papagiannaki
        e1.data.create(key='versionId', value='v1.0')
439 8cb96389 Sofia Papagiannaki
        e1.data.create(key='publicURL', value='http://localhost:8000/s1/v1.0')
440 8cb96389 Sofia Papagiannaki
441 8cb96389 Sofia Papagiannaki
        s2 = Service(component=c1, type='type2', name='service2')
442 8cb96389 Sofia Papagiannaki
        s2.save()
443 8cb96389 Sofia Papagiannaki
        e2 = Endpoint(service=s2)
444 8cb96389 Sofia Papagiannaki
        e2.save()
445 8cb96389 Sofia Papagiannaki
        e2.data.create(key='versionId', value='v1.0')
446 8cb96389 Sofia Papagiannaki
        e2.data.create(key='publicURL', value='http://localhost:8000/s2/v1.0')
447 8cb96389 Sofia Papagiannaki
448 8cb96389 Sofia Papagiannaki
        c2 = Component(name='component2', url='http://localhost/component2')
449 8cb96389 Sofia Papagiannaki
        c2.save()
450 8cb96389 Sofia Papagiannaki
        s3 = Service(component=c2, type='type3', name='service3')
451 8cb96389 Sofia Papagiannaki
        s3.save()
452 8cb96389 Sofia Papagiannaki
        e3 = Endpoint(service=s3)
453 8cb96389 Sofia Papagiannaki
        e3.save()
454 8cb96389 Sofia Papagiannaki
        e3.data.create(key='versionId', value='v2.0')
455 8cb96389 Sofia Papagiannaki
        e3.data.create(key='publicURL', value='http://localhost:8000/s3/v2.0')
456 7ac2131c Sofia Papagiannaki
457 be67d92e Sofia Papagiannaki
        oa2_backend = DjangoBackend()
458 be67d92e Sofia Papagiannaki
        self.token = oa2_backend.token_model.create(
459 be67d92e Sofia Papagiannaki
            code='12345',
460 be67d92e Sofia Papagiannaki
            expires_at=datetime.now() + timedelta(seconds=5),
461 be67d92e Sofia Papagiannaki
            user=self.user1,
462 be67d92e Sofia Papagiannaki
            client=oa2_backend.client_model.create(type='public'),
463 be67d92e Sofia Papagiannaki
            redirect_uri='https://server.com/handle_code')
464 be67d92e Sofia Papagiannaki
465 f870efe2 Sofia Papagiannaki
    def test_authenticate(self):
466 7ac2131c Sofia Papagiannaki
        client = Client()
467 3472d390 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
468 7ac2131c Sofia Papagiannaki
469 f870efe2 Sofia Papagiannaki
        # Check not allowed method
470 f870efe2 Sofia Papagiannaki
        r = client.get(url, post_data={})
471 2aba7764 Sofia Papagiannaki
        self.assertEqual(r.status_code, 405)
472 2aba7764 Sofia Papagiannaki
        self.assertTrue('Allow' in r)
473 2aba7764 Sofia Papagiannaki
        self.assertEqual(r['Allow'], 'POST')
474 f870efe2 Sofia Papagiannaki
475 d29f0371 Sofia Papagiannaki
        # check public mode
476 d29f0371 Sofia Papagiannaki
        r = client.post(url, CONTENT_LENGTH=0)
477 d29f0371 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
478 d29f0371 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
479 d29f0371 Sofia Papagiannaki
        try:
480 d29f0371 Sofia Papagiannaki
            body = json.loads(r.content)
481 d29f0371 Sofia Papagiannaki
        except Exception, e:
482 d29f0371 Sofia Papagiannaki
            self.fail(e)
483 d29f0371 Sofia Papagiannaki
        self.assertTrue('token' not in body.get('access'))
484 d29f0371 Sofia Papagiannaki
        self.assertTrue('user' not in body.get('access'))
485 d29f0371 Sofia Papagiannaki
        self.assertTrue('serviceCatalog' in body.get('access'))
486 f870efe2 Sofia Papagiannaki
487 f870efe2 Sofia Papagiannaki
        # Check unsupported xml input
488 f870efe2 Sofia Papagiannaki
        post_data = """
489 f870efe2 Sofia Papagiannaki
            <?xml version="1.0" encoding="UTF-8"?>
490 f870efe2 Sofia Papagiannaki
                <auth xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
491 f870efe2 Sofia Papagiannaki
                 xmlns="http://docs.openstack.org/identity/api/v2.0"
492 f870efe2 Sofia Papagiannaki
                 tenantName="%s">
493 f870efe2 Sofia Papagiannaki
                  <passwordCredentials username="%s" password="%s"/>
494 f870efe2 Sofia Papagiannaki
                </auth>""" % (self.user1.uuid, self.user1.uuid,
495 f870efe2 Sofia Papagiannaki
                              self.user1.auth_token)
496 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/xml')
497 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
498 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
499 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'],
500 f870efe2 Sofia Papagiannaki
                         "Unsupported Content-type: 'application/xml'")
501 f870efe2 Sofia Papagiannaki
502 f870efe2 Sofia Papagiannaki
        # Check malformed request: missing password
503 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s"},
504 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
505 f870efe2 Sofia Papagiannaki
            self.user1.uuid, self.user1.uuid)
506 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
507 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
508 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
509 11366070 Sofia Papagiannaki
        self.assertTrue(body['badRequest']['message'].
510 11366070 Sofia Papagiannaki
                        startswith('Malformed request'))
511 f870efe2 Sofia Papagiannaki
512 f870efe2 Sofia Papagiannaki
        # Check malformed request: missing username
513 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"password":"%s"},
514 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
515 f870efe2 Sofia Papagiannaki
            self.user1.auth_token, self.user1.uuid)
516 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
517 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
518 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
519 11366070 Sofia Papagiannaki
        self.assertTrue(body['badRequest']['message'].
520 11366070 Sofia Papagiannaki
                        startswith('Malformed request'))
521 f870efe2 Sofia Papagiannaki
522 f870efe2 Sofia Papagiannaki
        # Check invalid pass
523 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
524 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
525 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
526 f870efe2 Sofia Papagiannaki
            self.user1.uuid, '', self.user1.uuid)
527 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
528 7ac2131c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
529 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
530 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['unauthorized']['message'],
531 f870efe2 Sofia Papagiannaki
                         'Invalid token')
532 f870efe2 Sofia Papagiannaki
533 f870efe2 Sofia Papagiannaki
        # Check inconsistent pass
534 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
535 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
536 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
537 49005665 Sofia Papagiannaki
            self.user1.uuid, self.user2.auth_token, self.user2.uuid)
538 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
539 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
540 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
541 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['unauthorized']['message'],
542 f870efe2 Sofia Papagiannaki
                         'Invalid credentials')
543 f870efe2 Sofia Papagiannaki
544 f870efe2 Sofia Papagiannaki
        # Check invalid json data
545 f870efe2 Sofia Papagiannaki
        r = client.post(url, "not json", content_type='application/json')
546 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
547 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
548 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'], 'Invalid JSON data')
549 f870efe2 Sofia Papagiannaki
550 f870efe2 Sofia Papagiannaki
        # Check auth with token
551 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"token": {"id":"%s"},
552 f870efe2 Sofia Papagiannaki
                        "tenantName":"%s"}}""" % (
553 f870efe2 Sofia Papagiannaki
            self.user1.auth_token, self.user1.uuid)
554 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
555 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
556 f870efe2 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
557 f870efe2 Sofia Papagiannaki
        try:
558 f870efe2 Sofia Papagiannaki
            body = json.loads(r.content)
559 f870efe2 Sofia Papagiannaki
        except Exception, e:
560 f870efe2 Sofia Papagiannaki
            self.fail(e)
561 f870efe2 Sofia Papagiannaki
562 11366070 Sofia Papagiannaki
        # Check malformed request: missing token
563 11366070 Sofia Papagiannaki
        post_data = """{"auth":{"auth_token":{"id":"%s"},
564 11366070 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
565 11366070 Sofia Papagiannaki
            self.user1.auth_token, self.user1.uuid)
566 11366070 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
567 11366070 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
568 11366070 Sofia Papagiannaki
        body = json.loads(r.content)
569 11366070 Sofia Papagiannaki
        self.assertTrue(body['badRequest']['message'].
570 11366070 Sofia Papagiannaki
                        startswith('Malformed request'))
571 11366070 Sofia Papagiannaki
572 11366070 Sofia Papagiannaki
        # Check bad request: inconsistent tenant
573 11366070 Sofia Papagiannaki
        post_data = """{"auth":{"token":{"id":"%s"},
574 11366070 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
575 11366070 Sofia Papagiannaki
            self.user1.auth_token, self.user2.uuid)
576 11366070 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
577 11366070 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
578 11366070 Sofia Papagiannaki
        body = json.loads(r.content)
579 11366070 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'],
580 11366070 Sofia Papagiannaki
                         'Not conforming tenantName')
581 11366070 Sofia Papagiannaki
582 a01eb018 Sofia Papagiannaki
        # Check bad request: inconsistent tenant
583 a01eb018 Sofia Papagiannaki
        post_data = """{"auth":{"token":{"id":"%s"},
584 a01eb018 Sofia Papagiannaki
                                "tenantName":""}}""" % (
585 a01eb018 Sofia Papagiannaki
            self.user1.auth_token)
586 a01eb018 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
587 a01eb018 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
588 a01eb018 Sofia Papagiannaki
589 be67d92e Sofia Papagiannaki
        # Check successful json response: user credential auth
590 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
591 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
592 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
593 f870efe2 Sofia Papagiannaki
            self.user1.uuid, self.user1.auth_token, self.user1.uuid)
594 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
595 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
596 f870efe2 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
597 f870efe2 Sofia Papagiannaki
        try:
598 f870efe2 Sofia Papagiannaki
            body = json.loads(r.content)
599 f870efe2 Sofia Papagiannaki
        except Exception, e:
600 f870efe2 Sofia Papagiannaki
            self.fail(e)
601 f870efe2 Sofia Papagiannaki
602 f870efe2 Sofia Papagiannaki
        try:
603 8cb96389 Sofia Papagiannaki
            token = body['access']['token']['id']
604 8cb96389 Sofia Papagiannaki
            user = body['access']['user']['id']
605 8cb96389 Sofia Papagiannaki
            service_catalog = body['access']['serviceCatalog']
606 f870efe2 Sofia Papagiannaki
        except KeyError:
607 f870efe2 Sofia Papagiannaki
            self.fail('Invalid response')
608 f870efe2 Sofia Papagiannaki
609 f870efe2 Sofia Papagiannaki
        self.assertEqual(token, self.user1.auth_token)
610 f870efe2 Sofia Papagiannaki
        self.assertEqual(user, self.user1.uuid)
611 f870efe2 Sofia Papagiannaki
        self.assertEqual(len(service_catalog), 3)
612 f870efe2 Sofia Papagiannaki
613 be67d92e Sofia Papagiannaki
        # Check successful json response: token auth
614 be67d92e Sofia Papagiannaki
        post_data = """{"auth":{"token":{"id":"%s"},
615 be67d92e Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
616 be67d92e Sofia Papagiannaki
            self.user1.auth_token, self.user1.uuid)
617 be67d92e Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
618 be67d92e Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
619 be67d92e Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
620 be67d92e Sofia Papagiannaki
        try:
621 be67d92e Sofia Papagiannaki
            body = json.loads(r.content)
622 be67d92e Sofia Papagiannaki
        except Exception, e:
623 be67d92e Sofia Papagiannaki
            self.fail(e)
624 be67d92e Sofia Papagiannaki
625 be67d92e Sofia Papagiannaki
        try:
626 be67d92e Sofia Papagiannaki
            token = body['access']['token']['id']
627 be67d92e Sofia Papagiannaki
            user = body['access']['user']['id']
628 be67d92e Sofia Papagiannaki
            service_catalog = body['access']['serviceCatalog']
629 be67d92e Sofia Papagiannaki
        except KeyError:
630 be67d92e Sofia Papagiannaki
            self.fail('Invalid response')
631 be67d92e Sofia Papagiannaki
632 be67d92e Sofia Papagiannaki
        self.assertEqual(token, self.user1.auth_token)
633 be67d92e Sofia Papagiannaki
        self.assertEqual(user, self.user1.uuid)
634 be67d92e Sofia Papagiannaki
        self.assertEqual(len(service_catalog), 3)
635 be67d92e Sofia Papagiannaki
636 f870efe2 Sofia Papagiannaki
        # Check successful xml response
637 f870efe2 Sofia Papagiannaki
        headers = {'HTTP_ACCEPT': 'application/xml'}
638 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
639 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
640 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
641 f870efe2 Sofia Papagiannaki
            self.user1.uuid, self.user1.auth_token, self.user1.uuid)
642 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json',
643 f870efe2 Sofia Papagiannaki
                        **headers)
644 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
645 f870efe2 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/xml'))
646 49005665 Sofia Papagiannaki
#        try:
647 49005665 Sofia Papagiannaki
#            body = minidom.parseString(r.content)
648 49005665 Sofia Papagiannaki
#        except Exception, e:
649 49005665 Sofia Papagiannaki
#            self.fail(e)
650 8aaf4f0d Georgios D. Tsoukalas
651 be67d92e Sofia Papagiannaki
        # oath access token authorization
652 be67d92e Sofia Papagiannaki
        post_data = """{"auth":{"token":{"id":"%s"},
653 be67d92e Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
654 be67d92e Sofia Papagiannaki
            self.token.code, self.user1.uuid)
655 be67d92e Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
656 be67d92e Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
657 be67d92e Sofia Papagiannaki
658 8aaf4f0d Georgios D. Tsoukalas
659 bbf20a4c Sofia Papagiannaki
class UserCatalogsTest(TestCase):
660 bbf20a4c Sofia Papagiannaki
    def test_get_uuid_displayname_catalogs(self):
661 1808f7bc Giorgos Korfiatis
        self.user = get_local_user(
662 1808f7bc Giorgos Korfiatis
            'test1@example.org', email_verified=True, moderated=True,
663 1808f7bc Giorgos Korfiatis
            is_rejected=False, is_active=False)
664 bbf20a4c Sofia Papagiannaki
665 bbf20a4c Sofia Papagiannaki
        client = Client()
666 bbf20a4c Sofia Papagiannaki
        url = reverse('astakos.api.user.get_uuid_displayname_catalogs')
667 bbf20a4c Sofia Papagiannaki
        d = dict(uuids=[self.user.uuid], displaynames=[self.user.username])
668 bbf20a4c Sofia Papagiannaki
669 bbf20a4c Sofia Papagiannaki
        # assert Unauthorized: missing authentication token
670 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
671 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(d),
672 bbf20a4c Sofia Papagiannaki
                        content_type='application/json')
673 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
674 bbf20a4c Sofia Papagiannaki
675 bbf20a4c Sofia Papagiannaki
        # assert Unauthorized: invalid authentication token
676 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
677 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(d),
678 bbf20a4c Sofia Papagiannaki
                        content_type='application/json',
679 bbf20a4c Sofia Papagiannaki
                        HTTP_X_AUTH_TOKEN='1234')
680 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
681 bbf20a4c Sofia Papagiannaki
682 bbf20a4c Sofia Papagiannaki
        # assert Unauthorized: inactive token holder
683 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
684 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(d),
685 bbf20a4c Sofia Papagiannaki
                        content_type='application/json',
686 bbf20a4c Sofia Papagiannaki
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
687 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
688 bbf20a4c Sofia Papagiannaki
689 bbf20a4c Sofia Papagiannaki
        backend = activation_backends.get_backend()
690 bbf20a4c Sofia Papagiannaki
        backend.activate_user(self.user)
691 bbf20a4c Sofia Papagiannaki
        assert self.user.is_active is True
692 bbf20a4c Sofia Papagiannaki
693 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
694 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(d),
695 bbf20a4c Sofia Papagiannaki
                        content_type='application/json',
696 bbf20a4c Sofia Papagiannaki
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
697 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
698 bbf20a4c Sofia Papagiannaki
        try:
699 bbf20a4c Sofia Papagiannaki
            data = json.loads(r.content)
700 bbf20a4c Sofia Papagiannaki
        except:
701 bbf20a4c Sofia Papagiannaki
            self.fail('Response body should be json formatted')
702 bbf20a4c Sofia Papagiannaki
        else:
703 bbf20a4c Sofia Papagiannaki
            if not isinstance(data, dict):
704 bbf20a4c Sofia Papagiannaki
                self.fail('Response body should be json formatted dictionary')
705 bbf20a4c Sofia Papagiannaki
706 bbf20a4c Sofia Papagiannaki
            self.assertTrue('uuid_catalog' in data)
707 bbf20a4c Sofia Papagiannaki
            self.assertEqual(data['uuid_catalog'],
708 bbf20a4c Sofia Papagiannaki
                             {self.user.uuid: self.user.username})
709 bbf20a4c Sofia Papagiannaki
710 bbf20a4c Sofia Papagiannaki
            self.assertTrue('displayname_catalog' in data)
711 bbf20a4c Sofia Papagiannaki
            self.assertEqual(data['displayname_catalog'],
712 bbf20a4c Sofia Papagiannaki
                             {self.user.username: self.user.uuid})
713 bbf20a4c Sofia Papagiannaki
714 bbf20a4c Sofia Papagiannaki
        # assert Unauthorized: expired token
715 bbf20a4c Sofia Papagiannaki
        self.user.auth_token_expires = date.today() - timedelta(1)
716 bbf20a4c Sofia Papagiannaki
        self.user.save()
717 bbf20a4c Sofia Papagiannaki
718 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
719 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(d),
720 bbf20a4c Sofia Papagiannaki
                        content_type='application/json',
721 bbf20a4c Sofia Papagiannaki
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
722 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
723 bbf20a4c Sofia Papagiannaki
724 bbf20a4c Sofia Papagiannaki
        # assert Unauthorized: expired token
725 bbf20a4c Sofia Papagiannaki
        self.user.auth_token_expires = date.today() + timedelta(1)
726 bbf20a4c Sofia Papagiannaki
        self.user.save()
727 bbf20a4c Sofia Papagiannaki
728 bbf20a4c Sofia Papagiannaki
        # assert badRequest
729 bbf20a4c Sofia Papagiannaki
        r = client.post(url,
730 bbf20a4c Sofia Papagiannaki
                        data=json.dumps(str(d)),
731 bbf20a4c Sofia Papagiannaki
                        content_type='application/json',
732 bbf20a4c Sofia Papagiannaki
                        HTTP_X_AUTH_TOKEN=self.user.auth_token)
733 bbf20a4c Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
734 bbf20a4c Sofia Papagiannaki
735 bbf20a4c Sofia Papagiannaki
736 8aaf4f0d Georgios D. Tsoukalas
class WrongPathAPITest(TestCase):
737 cb26c74e Georgios D. Tsoukalas
    def test_catch_wrong_account_paths(self, *args):
738 8aaf4f0d Georgios D. Tsoukalas
        path = get_service_path(astakos_services, 'account', 'v1.0')
739 8aaf4f0d Georgios D. Tsoukalas
        path = join_urls(BASE_HOST, path, 'nonexistent')
740 8aaf4f0d Georgios D. Tsoukalas
        response = self.client.get(path)
741 8aaf4f0d Georgios D. Tsoukalas
        self.assertEqual(response.status_code, 400)
742 8aaf4f0d Georgios D. Tsoukalas
        try:
743 8aaf4f0d Georgios D. Tsoukalas
            error = json.loads(response.content)
744 8aaf4f0d Georgios D. Tsoukalas
        except ValueError:
745 8aaf4f0d Georgios D. Tsoukalas
            self.assertTrue(False)
746 8aaf4f0d Georgios D. Tsoukalas
747 cb26c74e Georgios D. Tsoukalas
    def test_catch_wrong_identity_paths(self, *args):
748 8aaf4f0d Georgios D. Tsoukalas
        path = get_service_path(astakos_services, 'identity', 'v2.0')
749 8aaf4f0d Georgios D. Tsoukalas
        path = join_urls(BASE_HOST, path, 'nonexistent')
750 8aaf4f0d Georgios D. Tsoukalas
        response = self.client.get(path)
751 8aaf4f0d Georgios D. Tsoukalas
        self.assertEqual(response.status_code, 400)
752 8aaf4f0d Georgios D. Tsoukalas
        try:
753 9b12caae Sofia Papagiannaki
            json.loads(response.content)
754 8aaf4f0d Georgios D. Tsoukalas
        except ValueError:
755 8aaf4f0d Georgios D. Tsoukalas
            self.assertTrue(False)
756 be67d92e Sofia Papagiannaki
757 be67d92e Sofia Papagiannaki
758 be67d92e Sofia Papagiannaki
class ValidateAccessToken(TestCase):
759 be67d92e Sofia Papagiannaki
    def setUp(self):
760 be67d92e Sofia Papagiannaki
        self.oa2_backend = DjangoBackend()
761 2070c5f8 Giorgos Korfiatis
        self.user = get_local_user("user@synnefo.org")
762 be67d92e Sofia Papagiannaki
        self.token = self.oa2_backend.token_model.create(
763 be67d92e Sofia Papagiannaki
            code='12345',
764 be67d92e Sofia Papagiannaki
            expires_at=datetime.now() + timedelta(seconds=5),
765 be67d92e Sofia Papagiannaki
            user=self.user,
766 be67d92e Sofia Papagiannaki
            client=self.oa2_backend.client_model.create(type='public'),
767 671e4232 Sofia Papagiannaki
            redirect_uri='https://server.com/handle_code',
768 671e4232 Sofia Papagiannaki
            scope='user-scope')
769 be67d92e Sofia Papagiannaki
770 be67d92e Sofia Papagiannaki
    def test_validate_token(self):
771 be67d92e Sofia Papagiannaki
        # invalid token
772 be67d92e Sofia Papagiannaki
        url = reverse('astakos.api.tokens.validate_token',
773 be67d92e Sofia Papagiannaki
                      kwargs={'token_id': 'invalid'})
774 be67d92e Sofia Papagiannaki
        r = self.client.get(url)
775 be67d92e Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)
776 be67d92e Sofia Papagiannaki
777 be67d92e Sofia Papagiannaki
        # valid token
778 be67d92e Sofia Papagiannaki
        url = reverse('astakos.api.tokens.validate_token',
779 be67d92e Sofia Papagiannaki
                      kwargs={'token_id': self.token.code})
780 be67d92e Sofia Papagiannaki
781 be67d92e Sofia Papagiannaki
        r = self.client.head(url)
782 ea05b306 Sofia Papagiannaki
        self.assertEqual(r.status_code, 405)
783 be67d92e Sofia Papagiannaki
        r = self.client.put(url)
784 ea05b306 Sofia Papagiannaki
        self.assertEqual(r.status_code, 405)
785 be67d92e Sofia Papagiannaki
        r = self.client.post(url)
786 ea05b306 Sofia Papagiannaki
        self.assertEqual(r.status_code, 405)
787 be67d92e Sofia Papagiannaki
788 be67d92e Sofia Papagiannaki
        r = self.client.get(url)
789 be67d92e Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
790 be67d92e Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
791 be67d92e Sofia Papagiannaki
        try:
792 be67d92e Sofia Papagiannaki
            body = json.loads(r.content)
793 be67d92e Sofia Papagiannaki
            user = body['access']['user']['id']
794 be67d92e Sofia Papagiannaki
            self.assertEqual(user, self.user.uuid)
795 be67d92e Sofia Papagiannaki
        except Exception:
796 be67d92e Sofia Papagiannaki
            self.fail('Unexpected response content')
797 be67d92e Sofia Papagiannaki
798 671e4232 Sofia Papagiannaki
        # inconsistent belongsTo parameter
799 671e4232 Sofia Papagiannaki
        r = self.client.get('%s?belongsTo=invalid' % url)
800 671e4232 Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)
801 671e4232 Sofia Papagiannaki
802 671e4232 Sofia Papagiannaki
        # consistent belongsTo parameter
803 671e4232 Sofia Papagiannaki
        r = self.client.get('%s?belongsTo=%s' % (url, self.token.scope))
804 671e4232 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
805 671e4232 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
806 671e4232 Sofia Papagiannaki
        try:
807 671e4232 Sofia Papagiannaki
            body = json.loads(r.content)
808 671e4232 Sofia Papagiannaki
            user = body['access']['user']['id']
809 671e4232 Sofia Papagiannaki
            self.assertEqual(user, self.user.uuid)
810 671e4232 Sofia Papagiannaki
        except Exception:
811 671e4232 Sofia Papagiannaki
            self.fail('Unexpected response content')
812 671e4232 Sofia Papagiannaki
813 be67d92e Sofia Papagiannaki
        # expired token
814 be67d92e Sofia Papagiannaki
        sleep_time = (self.token.expires_at - datetime.now()).total_seconds()
815 671e4232 Sofia Papagiannaki
        time.sleep(max(sleep_time, 0))
816 be67d92e Sofia Papagiannaki
        r = self.client.get(url)
817 be67d92e Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)
818 be67d92e Sofia Papagiannaki
        # assert expired token has been deleted
819 be67d92e Sofia Papagiannaki
        self.assertEqual(self.oa2_backend.token_model.count(), 0)
820 be67d92e Sofia Papagiannaki
821 be67d92e Sofia Papagiannaki
        # user authentication token
822 be67d92e Sofia Papagiannaki
        url = reverse('astakos.api.tokens.validate_token',
823 be67d92e Sofia Papagiannaki
                      kwargs={'token_id': self.user.auth_token})
824 be67d92e Sofia Papagiannaki
        self.assertEqual(r.status_code, 404)