Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (26.3 kB)

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