Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (24.8 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 7ac2131c Sofia Papagiannaki
36 baa9073a Kostas Papadimitriou
from django.test import TestCase
37 8cb96389 Sofia Papagiannaki
from django.core.urlresolvers import reverse
38 8cb96389 Sofia Papagiannaki
39 1ac3349d Kostas Papadimitriou
40 7ac2131c Sofia Papagiannaki
from urllib import quote
41 7ac2131c Sofia Papagiannaki
from urlparse import urlparse, parse_qs
42 8cb96389 Sofia Papagiannaki
#from xml.dom import minidom
43 7ac2131c Sofia Papagiannaki
44 7ac2131c Sofia Papagiannaki
import json
45 7ac2131c Sofia Papagiannaki
46 efc2b8ae Giorgos Korfiatis
ROOT = "/%s/%s/" % (
47 efc2b8ae Giorgos Korfiatis
    astakos_settings.BASE_PATH, astakos_settings.ACCOUNTS_PREFIX)
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 1ac3349d Kostas Papadimitriou
                      "allow_in_projects": True}
62 bd1f667b Giorgos Korfiatis
        r, _ = register.add_resource(resource11)
63 bd1f667b Giorgos Korfiatis
        register.update_resource(r, 100)
64 1ac3349d Kostas Papadimitriou
        resource12 = {"name": "service1.resource12",
65 1ac3349d Kostas Papadimitriou
                      "desc": "resource11 desc",
66 bd1f667b Giorgos Korfiatis
                      "service_type": "type1",
67 1ac3349d Kostas Papadimitriou
                      "unit": "bytes"}
68 bd1f667b Giorgos Korfiatis
        r, _ = register.add_resource(resource12)
69 bd1f667b Giorgos Korfiatis
        register.update_resource(r, 1024)
70 1ac3349d Kostas Papadimitriou
71 1ac3349d Kostas Papadimitriou
        # create user
72 1ac3349d Kostas Papadimitriou
        user = get_local_user('test@grnet.gr')
73 1ac3349d Kostas Papadimitriou
        quotas.qh_sync_user(user)
74 1ac3349d Kostas Papadimitriou
75 bd1f667b Giorgos Korfiatis
        component2 = Component.objects.create(name="comp2")
76 bd1f667b Giorgos Korfiatis
        register.add_service(component2, "service2", "type2", [])
77 1ac3349d Kostas Papadimitriou
        # create another service
78 1ac3349d Kostas Papadimitriou
        resource21 = {"name": "service2.resource21",
79 1ac3349d Kostas Papadimitriou
                      "desc": "resource11 desc",
80 bd1f667b Giorgos Korfiatis
                      "service_type": "type2",
81 1ac3349d Kostas Papadimitriou
                      "allow_in_projects": False}
82 bd1f667b Giorgos Korfiatis
        r, _ = register.add_resource(resource21)
83 bd1f667b Giorgos Korfiatis
        register.update_resource(r, 3)
84 1ac3349d Kostas Papadimitriou
85 1ac3349d Kostas Papadimitriou
        resource_names = [r['name'] for r in
86 1ac3349d Kostas Papadimitriou
                          [resource11, resource12, resource21]]
87 1ac3349d Kostas Papadimitriou
88 1ac3349d Kostas Papadimitriou
        # get resources
89 1ac3349d Kostas Papadimitriou
        r = client.get(u('resources'))
90 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
91 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
92 1ac3349d Kostas Papadimitriou
        for name in resource_names:
93 1ac3349d Kostas Papadimitriou
            assertIn(name, body)
94 1ac3349d Kostas Papadimitriou
95 1ac3349d Kostas Papadimitriou
        # get quota
96 1ac3349d Kostas Papadimitriou
        r = client.get(u('quotas'))
97 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 401)
98 1ac3349d Kostas Papadimitriou
99 1ac3349d Kostas Papadimitriou
        headers = {'HTTP_X_AUTH_TOKEN': user.auth_token}
100 1ac3349d Kostas Papadimitriou
        r = client.get(u('quotas/'), **headers)
101 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
102 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
103 1ac3349d Kostas Papadimitriou
        system_quota = body['system']
104 1ac3349d Kostas Papadimitriou
        assertIn('system', body)
105 1ac3349d Kostas Papadimitriou
        for name in resource_names:
106 1ac3349d Kostas Papadimitriou
            assertIn(name, system_quota)
107 1ac3349d Kostas Papadimitriou
108 1ac3349d Kostas Papadimitriou
        r = client.get(u('service_quotas'))
109 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 401)
110 1ac3349d Kostas Papadimitriou
111 bd1f667b Giorgos Korfiatis
        s1_headers = {'HTTP_X_AUTH_TOKEN': component1.auth_token}
112 1ac3349d Kostas Papadimitriou
        r = client.get(u('service_quotas'), **s1_headers)
113 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
114 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
115 1ac3349d Kostas Papadimitriou
        assertIn(user.uuid, body)
116 1ac3349d Kostas Papadimitriou
117 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions'), **s1_headers)
118 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
119 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
120 1ac3349d Kostas Papadimitriou
        self.assertEqual(body, [])
121 1ac3349d Kostas Papadimitriou
122 1ac3349d Kostas Papadimitriou
        # issue some commissions
123 1ac3349d Kostas Papadimitriou
        commission_request = {
124 1ac3349d Kostas Papadimitriou
            "force": False,
125 1ac3349d Kostas Papadimitriou
            "auto_accept": False,
126 1ac3349d Kostas Papadimitriou
            "name": "my commission",
127 1ac3349d Kostas Papadimitriou
            "provisions": [
128 1ac3349d Kostas Papadimitriou
                {
129 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
130 1ac3349d Kostas Papadimitriou
                    "source": "system",
131 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
132 1ac3349d Kostas Papadimitriou
                    "quantity": 1
133 1ac3349d Kostas Papadimitriou
                },
134 1ac3349d Kostas Papadimitriou
                {
135 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
136 1ac3349d Kostas Papadimitriou
                    "source": "system",
137 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
138 1ac3349d Kostas Papadimitriou
                    "quantity": 30000
139 1ac3349d Kostas Papadimitriou
                }]}
140 1ac3349d Kostas Papadimitriou
141 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
142 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
143 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
144 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 413)
145 1ac3349d Kostas Papadimitriou
146 1ac3349d Kostas Papadimitriou
        commission_request = {
147 1ac3349d Kostas Papadimitriou
            "force": False,
148 1ac3349d Kostas Papadimitriou
            "auto_accept": False,
149 1ac3349d Kostas Papadimitriou
            "name": "my commission",
150 1ac3349d Kostas Papadimitriou
            "provisions": [
151 1ac3349d Kostas Papadimitriou
                {
152 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
153 1ac3349d Kostas Papadimitriou
                    "source": "system",
154 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
155 1ac3349d Kostas Papadimitriou
                    "quantity": 1
156 1ac3349d Kostas Papadimitriou
                },
157 1ac3349d Kostas Papadimitriou
                {
158 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
159 1ac3349d Kostas Papadimitriou
                    "source": "system",
160 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
161 1ac3349d Kostas Papadimitriou
                    "quantity": 100
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, 201)
168 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
169 1ac3349d Kostas Papadimitriou
        serial = body['serial']
170 1ac3349d Kostas Papadimitriou
        self.assertEqual(serial, 1)
171 1ac3349d Kostas Papadimitriou
172 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
173 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
174 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
175 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
176 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
177 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['serial'], 2)
178 1ac3349d Kostas Papadimitriou
179 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
180 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
181 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
182 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
183 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
184 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['serial'], 3)
185 1ac3349d Kostas Papadimitriou
186 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions'), **s1_headers)
187 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
188 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
189 1ac3349d Kostas Papadimitriou
        self.assertEqual(body, [1, 2, 3])
190 1ac3349d Kostas Papadimitriou
191 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions/' + str(serial)), **s1_headers)
192 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
193 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
194 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['serial'], serial)
195 1ac3349d Kostas Papadimitriou
        assertIn('issue_time', body)
196 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['provisions'], commission_request['provisions'])
197 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['name'], commission_request['name'])
198 1ac3349d Kostas Papadimitriou
199 1ac3349d Kostas Papadimitriou
        r = client.get(u('service_quotas?user=' + user.uuid), **s1_headers)
200 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
201 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
202 1ac3349d Kostas Papadimitriou
        user_quota = body[user.uuid]
203 1ac3349d Kostas Papadimitriou
        system_quota = user_quota['system']
204 1ac3349d Kostas Papadimitriou
        r11 = system_quota[resource11['name']]
205 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['usage'], 3)
206 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['pending'], 3)
207 1ac3349d Kostas Papadimitriou
208 1ac3349d Kostas Papadimitriou
        # resolve pending commissions
209 1ac3349d Kostas Papadimitriou
        resolve_data = {
210 1ac3349d Kostas Papadimitriou
            "accept": [1, 3],
211 1ac3349d Kostas Papadimitriou
            "reject": [2, 3, 4],
212 1ac3349d Kostas Papadimitriou
        }
213 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(resolve_data)
214 1ac3349d Kostas Papadimitriou
215 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions/action'), post_data,
216 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
217 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
218 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
219 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['accepted'], [1])
220 1ac3349d Kostas Papadimitriou
        self.assertEqual(body['rejected'], [2])
221 1ac3349d Kostas Papadimitriou
        failed = body['failed']
222 1ac3349d Kostas Papadimitriou
        self.assertEqual(len(failed), 2)
223 1ac3349d Kostas Papadimitriou
224 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions/' + str(serial)), **s1_headers)
225 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
226 1ac3349d Kostas Papadimitriou
227 1ac3349d Kostas Papadimitriou
        # auto accept
228 1ac3349d Kostas Papadimitriou
        commission_request = {
229 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
230 1ac3349d Kostas Papadimitriou
            "name": "my commission",
231 1ac3349d Kostas Papadimitriou
            "provisions": [
232 1ac3349d Kostas Papadimitriou
                {
233 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
234 1ac3349d Kostas Papadimitriou
                    "source": "system",
235 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
236 1ac3349d Kostas Papadimitriou
                    "quantity": 1
237 1ac3349d Kostas Papadimitriou
                },
238 1ac3349d Kostas Papadimitriou
                {
239 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
240 1ac3349d Kostas Papadimitriou
                    "source": "system",
241 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
242 1ac3349d Kostas Papadimitriou
                    "quantity": 100
243 1ac3349d Kostas Papadimitriou
                }]}
244 1ac3349d Kostas Papadimitriou
245 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
246 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
247 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
248 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
249 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
250 1ac3349d Kostas Papadimitriou
        serial = body['serial']
251 1ac3349d Kostas Papadimitriou
        self.assertEqual(serial, 4)
252 1ac3349d Kostas Papadimitriou
253 1ac3349d Kostas Papadimitriou
        r = client.get(u('commissions/' + str(serial)), **s1_headers)
254 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
255 1ac3349d Kostas Papadimitriou
256 1ac3349d Kostas Papadimitriou
        # malformed
257 1ac3349d Kostas Papadimitriou
        commission_request = {
258 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
259 1ac3349d Kostas Papadimitriou
            "name": "my commission",
260 1ac3349d Kostas Papadimitriou
            "provisions": [
261 1ac3349d Kostas Papadimitriou
                {
262 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
263 1ac3349d Kostas Papadimitriou
                    "source": "system",
264 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
265 1ac3349d Kostas Papadimitriou
                }
266 1ac3349d Kostas Papadimitriou
            ]}
267 1ac3349d Kostas Papadimitriou
268 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
269 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
270 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
271 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 400)
272 1ac3349d Kostas Papadimitriou
273 1ac3349d Kostas Papadimitriou
        commission_request = {
274 1ac3349d Kostas Papadimitriou
            "auto_accept": True,
275 1ac3349d Kostas Papadimitriou
            "name": "my commission",
276 1ac3349d Kostas Papadimitriou
            "provisions": "dummy"}
277 1ac3349d Kostas Papadimitriou
278 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
279 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
280 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
281 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 400)
282 1ac3349d Kostas Papadimitriou
283 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), commission_request,
284 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
285 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 400)
286 1ac3349d Kostas Papadimitriou
287 1ac3349d Kostas Papadimitriou
        # no holding
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 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
294 1ac3349d Kostas Papadimitriou
                    "source": "system",
295 1ac3349d Kostas Papadimitriou
                    "resource": "non existent",
296 1ac3349d Kostas Papadimitriou
                    "quantity": 1
297 1ac3349d Kostas Papadimitriou
                },
298 1ac3349d Kostas Papadimitriou
                {
299 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
300 1ac3349d Kostas Papadimitriou
                    "source": "system",
301 1ac3349d Kostas Papadimitriou
                    "resource": resource12['name'],
302 1ac3349d Kostas Papadimitriou
                    "quantity": 100
303 1ac3349d Kostas Papadimitriou
                }]}
304 1ac3349d Kostas Papadimitriou
305 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
306 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
307 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
308 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
309 1ac3349d Kostas Papadimitriou
310 1ac3349d Kostas Papadimitriou
        # release
311 1ac3349d Kostas Papadimitriou
        commission_request = {
312 1ac3349d Kostas Papadimitriou
            "provisions": [
313 1ac3349d Kostas Papadimitriou
                {
314 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
315 1ac3349d Kostas Papadimitriou
                    "source": "system",
316 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
317 1ac3349d Kostas Papadimitriou
                    "quantity": -1
318 1ac3349d Kostas Papadimitriou
                }
319 1ac3349d Kostas Papadimitriou
            ]}
320 1ac3349d Kostas Papadimitriou
321 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
322 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
323 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
324 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
325 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
326 1ac3349d Kostas Papadimitriou
        serial = body['serial']
327 1ac3349d Kostas Papadimitriou
328 1ac3349d Kostas Papadimitriou
        accept_data = {'accept': ""}
329 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(accept_data)
330 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions/' + str(serial) + '/action'), post_data,
331 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
332 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
333 1ac3349d Kostas Papadimitriou
334 1ac3349d Kostas Papadimitriou
        reject_data = {'reject': ""}
335 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(accept_data)
336 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions/' + str(serial) + '/action'), post_data,
337 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
338 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 404)
339 1ac3349d Kostas Papadimitriou
340 1ac3349d Kostas Papadimitriou
        # force
341 1ac3349d Kostas Papadimitriou
        commission_request = {
342 1ac3349d Kostas Papadimitriou
            "force": True,
343 1ac3349d Kostas Papadimitriou
            "provisions": [
344 1ac3349d Kostas Papadimitriou
                {
345 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
346 1ac3349d Kostas Papadimitriou
                    "source": "system",
347 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
348 1ac3349d Kostas Papadimitriou
                    "quantity": 100
349 1ac3349d Kostas Papadimitriou
                }]}
350 1ac3349d Kostas Papadimitriou
351 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
352 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
353 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
354 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 201)
355 1ac3349d Kostas Papadimitriou
356 1ac3349d Kostas Papadimitriou
        commission_request = {
357 1ac3349d Kostas Papadimitriou
            "force": True,
358 1ac3349d Kostas Papadimitriou
            "provisions": [
359 1ac3349d Kostas Papadimitriou
                {
360 1ac3349d Kostas Papadimitriou
                    "holder": user.uuid,
361 1ac3349d Kostas Papadimitriou
                    "source": "system",
362 1ac3349d Kostas Papadimitriou
                    "resource": resource11['name'],
363 1ac3349d Kostas Papadimitriou
                    "quantity": -200
364 1ac3349d Kostas Papadimitriou
                }]}
365 1ac3349d Kostas Papadimitriou
366 1ac3349d Kostas Papadimitriou
        post_data = json.dumps(commission_request)
367 1ac3349d Kostas Papadimitriou
        r = client.post(u('commissions'), post_data,
368 1ac3349d Kostas Papadimitriou
                        content_type='application/json', **s1_headers)
369 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 413)
370 1ac3349d Kostas Papadimitriou
371 1ac3349d Kostas Papadimitriou
        r = client.get(u('quotas'), **headers)
372 1ac3349d Kostas Papadimitriou
        self.assertEqual(r.status_code, 200)
373 1ac3349d Kostas Papadimitriou
        body = json.loads(r.content)
374 1ac3349d Kostas Papadimitriou
        system_quota = body['system']
375 1ac3349d Kostas Papadimitriou
        r11 = system_quota[resource11['name']]
376 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['usage'], 102)
377 1ac3349d Kostas Papadimitriou
        self.assertEqual(r11['pending'], 101)
378 7ac2131c Sofia Papagiannaki
379 7ac2131c Sofia Papagiannaki
380 7ac2131c Sofia Papagiannaki
class TokensApiTest(TestCase):
381 7ac2131c Sofia Papagiannaki
    def setUp(self):
382 ab7ca50a Sofia Papagiannaki
        backend = activation_backends.get_backend()
383 ab7ca50a Sofia Papagiannaki
384 ab7ca50a Sofia Papagiannaki
        self.user1 = AstakosUser.objects.create(
385 ab7ca50a Sofia Papagiannaki
            email='test1', email_verified=True, moderated=True,
386 ab7ca50a Sofia Papagiannaki
            is_rejected=False)
387 ab7ca50a Sofia Papagiannaki
        backend.activate_user(self.user1)
388 ab7ca50a Sofia Papagiannaki
        assert self.user1.is_active is True
389 ab7ca50a Sofia Papagiannaki
390 ab7ca50a Sofia Papagiannaki
        self.user2 = AstakosUser.objects.create(
391 ab7ca50a Sofia Papagiannaki
            email='test2', email_verified=True, moderated=True,
392 ab7ca50a Sofia Papagiannaki
            is_rejected=False)
393 ab7ca50a Sofia Papagiannaki
        backend.activate_user(self.user2)
394 ab7ca50a Sofia Papagiannaki
        assert self.user2.is_active is True
395 7ac2131c Sofia Papagiannaki
396 8cb96389 Sofia Papagiannaki
        c1 = Component(name='component1', url='http://localhost/component1')
397 8cb96389 Sofia Papagiannaki
        c1.save()
398 8cb96389 Sofia Papagiannaki
        s1 = Service(component=c1, type='type1', name='service1')
399 8cb96389 Sofia Papagiannaki
        s1.save()
400 8cb96389 Sofia Papagiannaki
        e1 = Endpoint(service=s1)
401 8cb96389 Sofia Papagiannaki
        e1.save()
402 8cb96389 Sofia Papagiannaki
        e1.data.create(key='versionId', value='v1.0')
403 8cb96389 Sofia Papagiannaki
        e1.data.create(key='publicURL', value='http://localhost:8000/s1/v1.0')
404 8cb96389 Sofia Papagiannaki
405 8cb96389 Sofia Papagiannaki
        s2 = Service(component=c1, type='type2', name='service2')
406 8cb96389 Sofia Papagiannaki
        s2.save()
407 8cb96389 Sofia Papagiannaki
        e2 = Endpoint(service=s2)
408 8cb96389 Sofia Papagiannaki
        e2.save()
409 8cb96389 Sofia Papagiannaki
        e2.data.create(key='versionId', value='v1.0')
410 8cb96389 Sofia Papagiannaki
        e2.data.create(key='publicURL', value='http://localhost:8000/s2/v1.0')
411 8cb96389 Sofia Papagiannaki
412 8cb96389 Sofia Papagiannaki
        c2 = Component(name='component2', url='http://localhost/component2')
413 8cb96389 Sofia Papagiannaki
        c2.save()
414 8cb96389 Sofia Papagiannaki
        s3 = Service(component=c2, type='type3', name='service3')
415 8cb96389 Sofia Papagiannaki
        s3.save()
416 8cb96389 Sofia Papagiannaki
        e3 = Endpoint(service=s3)
417 8cb96389 Sofia Papagiannaki
        e3.save()
418 8cb96389 Sofia Papagiannaki
        e3.data.create(key='versionId', value='v2.0')
419 8cb96389 Sofia Papagiannaki
        e3.data.create(key='publicURL', value='http://localhost:8000/s3/v2.0')
420 7ac2131c Sofia Papagiannaki
421 f870efe2 Sofia Papagiannaki
    def test_authenticate(self):
422 7ac2131c Sofia Papagiannaki
        client = Client()
423 7ac2131c Sofia Papagiannaki
424 f870efe2 Sofia Papagiannaki
        # Check not allowed method
425 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
426 f870efe2 Sofia Papagiannaki
        r = client.get(url, post_data={})
427 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
428 f870efe2 Sofia Papagiannaki
429 f870efe2 Sofia Papagiannaki
        # Malformed request
430 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
431 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data={})
432 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
433 f870efe2 Sofia Papagiannaki
434 f870efe2 Sofia Papagiannaki
        # Check unsupported xml input
435 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
436 f870efe2 Sofia Papagiannaki
        post_data = """
437 f870efe2 Sofia Papagiannaki
            <?xml version="1.0" encoding="UTF-8"?>
438 f870efe2 Sofia Papagiannaki
                <auth xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
439 f870efe2 Sofia Papagiannaki
                 xmlns="http://docs.openstack.org/identity/api/v2.0"
440 f870efe2 Sofia Papagiannaki
                 tenantName="%s">
441 f870efe2 Sofia Papagiannaki
                  <passwordCredentials username="%s" password="%s"/>
442 f870efe2 Sofia Papagiannaki
                </auth>""" % (self.user1.uuid, self.user1.uuid,
443 f870efe2 Sofia Papagiannaki
                              self.user1.auth_token)
444 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/xml')
445 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
446 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
447 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'],
448 f870efe2 Sofia Papagiannaki
                         "Unsupported Content-type: 'application/xml'")
449 f870efe2 Sofia Papagiannaki
450 f870efe2 Sofia Papagiannaki
        # Check malformed request: missing password
451 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
452 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s"},
453 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
454 f870efe2 Sofia Papagiannaki
            self.user1.uuid, self.user1.uuid)
455 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
456 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
457 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
458 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'],
459 f870efe2 Sofia Papagiannaki
                         'Malformed request')
460 f870efe2 Sofia Papagiannaki
461 f870efe2 Sofia Papagiannaki
        # Check malformed request: missing username
462 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
463 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"password":"%s"},
464 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
465 f870efe2 Sofia Papagiannaki
            self.user1.auth_token, self.user1.uuid)
466 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
467 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
468 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
469 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'],
470 f870efe2 Sofia Papagiannaki
                         'Malformed request')
471 f870efe2 Sofia Papagiannaki
472 f870efe2 Sofia Papagiannaki
        # Check invalid pass
473 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
474 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
475 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
476 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
477 f870efe2 Sofia Papagiannaki
            self.user1.uuid, '', self.user1.uuid)
478 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
479 7ac2131c Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
480 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
481 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['unauthorized']['message'],
482 f870efe2 Sofia Papagiannaki
                         'Invalid token')
483 f870efe2 Sofia Papagiannaki
484 f870efe2 Sofia Papagiannaki
        # Check inconsistent pass
485 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
486 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
487 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
488 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
489 49005665 Sofia Papagiannaki
            self.user1.uuid, self.user2.auth_token, self.user2.uuid)
490 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
491 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
492 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
493 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['unauthorized']['message'],
494 f870efe2 Sofia Papagiannaki
                         'Invalid credentials')
495 f870efe2 Sofia Papagiannaki
496 f870efe2 Sofia Papagiannaki
        # Check invalid json data
497 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
498 f870efe2 Sofia Papagiannaki
        r = client.post(url, "not json", content_type='application/json')
499 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
500 f870efe2 Sofia Papagiannaki
        body = json.loads(r.content)
501 f870efe2 Sofia Papagiannaki
        self.assertEqual(body['badRequest']['message'], 'Invalid JSON data')
502 f870efe2 Sofia Papagiannaki
503 f870efe2 Sofia Papagiannaki
        # Check auth with token
504 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
505 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"token": {"id":"%s"},
506 f870efe2 Sofia Papagiannaki
                        "tenantName":"%s"}}""" % (
507 f870efe2 Sofia Papagiannaki
            self.user1.auth_token, self.user1.uuid)
508 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
509 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
510 f870efe2 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
511 f870efe2 Sofia Papagiannaki
        try:
512 f870efe2 Sofia Papagiannaki
            body = json.loads(r.content)
513 f870efe2 Sofia Papagiannaki
        except Exception, e:
514 f870efe2 Sofia Papagiannaki
            self.fail(e)
515 f870efe2 Sofia Papagiannaki
516 f870efe2 Sofia Papagiannaki
        # Check successful json response
517 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
518 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
519 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
520 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
521 f870efe2 Sofia Papagiannaki
            self.user1.uuid, self.user1.auth_token, self.user1.uuid)
522 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json')
523 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
524 f870efe2 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/json'))
525 f870efe2 Sofia Papagiannaki
        try:
526 f870efe2 Sofia Papagiannaki
            body = json.loads(r.content)
527 f870efe2 Sofia Papagiannaki
        except Exception, e:
528 f870efe2 Sofia Papagiannaki
            self.fail(e)
529 f870efe2 Sofia Papagiannaki
530 f870efe2 Sofia Papagiannaki
        try:
531 8cb96389 Sofia Papagiannaki
            token = body['access']['token']['id']
532 8cb96389 Sofia Papagiannaki
            user = body['access']['user']['id']
533 8cb96389 Sofia Papagiannaki
            service_catalog = body['access']['serviceCatalog']
534 f870efe2 Sofia Papagiannaki
        except KeyError:
535 f870efe2 Sofia Papagiannaki
            self.fail('Invalid response')
536 f870efe2 Sofia Papagiannaki
537 f870efe2 Sofia Papagiannaki
        self.assertEqual(token, self.user1.auth_token)
538 f870efe2 Sofia Papagiannaki
        self.assertEqual(user, self.user1.uuid)
539 f870efe2 Sofia Papagiannaki
        self.assertEqual(len(service_catalog), 3)
540 f870efe2 Sofia Papagiannaki
541 f870efe2 Sofia Papagiannaki
        # Check successful xml response
542 8cb96389 Sofia Papagiannaki
        url = reverse('astakos.api.tokens.authenticate')
543 f870efe2 Sofia Papagiannaki
        headers = {'HTTP_ACCEPT': 'application/xml'}
544 f870efe2 Sofia Papagiannaki
        post_data = """{"auth":{"passwordCredentials":{"username":"%s",
545 f870efe2 Sofia Papagiannaki
                                                       "password":"%s"},
546 f870efe2 Sofia Papagiannaki
                                "tenantName":"%s"}}""" % (
547 f870efe2 Sofia Papagiannaki
            self.user1.uuid, self.user1.auth_token, self.user1.uuid)
548 f870efe2 Sofia Papagiannaki
        r = client.post(url, post_data, content_type='application/json',
549 f870efe2 Sofia Papagiannaki
                        **headers)
550 f870efe2 Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
551 f870efe2 Sofia Papagiannaki
        self.assertTrue(r['Content-Type'].startswith('application/xml'))
552 49005665 Sofia Papagiannaki
#        try:
553 49005665 Sofia Papagiannaki
#            body = minidom.parseString(r.content)
554 49005665 Sofia Papagiannaki
#        except Exception, e:
555 49005665 Sofia Papagiannaki
#            self.fail(e)
556 f870efe2 Sofia Papagiannaki
557 f870efe2 Sofia Papagiannaki
    def test_get_endpoints(self):
558 f870efe2 Sofia Papagiannaki
        client = Client()
559 7ac2131c Sofia Papagiannaki
560 ab7ca50a Sofia Papagiannaki
        # Check in active user token
561 ab7ca50a Sofia Papagiannaki
        inactive_user = AstakosUser.objects.create(email='test3')
562 ab7ca50a Sofia Papagiannaki
        url = '/astakos/api/tokens/%s/endpoints' % quote(
563 ab7ca50a Sofia Papagiannaki
            inactive_user.auth_token)
564 ab7ca50a Sofia Papagiannaki
        r = client.get(url)
565 ab7ca50a Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
566 ab7ca50a Sofia Papagiannaki
567 ab7ca50a Sofia Papagiannaki
        # Check invalid user token in path
568 ab7ca50a Sofia Papagiannaki
        url = '/astakos/api/tokens/nouser/endpoints'
569 ab7ca50a Sofia Papagiannaki
        r = client.get(url)
570 ab7ca50a Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
571 ab7ca50a Sofia Papagiannaki
572 ab7ca50a Sofia Papagiannaki
        # Check forbidden
573 ab7ca50a Sofia Papagiannaki
        url = '/astakos/api/tokens/%s/endpoints' % quote(self.user1.auth_token)
574 ab7ca50a Sofia Papagiannaki
        headers = {'HTTP_X_AUTH_TOKEN': AstakosUser.objects.create(
575 ab7ca50a Sofia Papagiannaki
            email='test4').auth_token}
576 ab7ca50a Sofia Papagiannaki
        r = client.get(url, **headers)
577 ab7ca50a Sofia Papagiannaki
        self.assertEqual(r.status_code, 401)
578 ab7ca50a Sofia Papagiannaki
579 7ac2131c Sofia Papagiannaki
        # Check bad request method
580 7ac2131c Sofia Papagiannaki
        url = '/astakos/api/tokens/%s/endpoints' % quote(self.user1.auth_token)
581 7ac2131c Sofia Papagiannaki
        r = client.post(url)
582 7ac2131c Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
583 7ac2131c Sofia Papagiannaki
584 7ac2131c Sofia Papagiannaki
        # Check forbidden
585 7ac2131c Sofia Papagiannaki
        url = '/astakos/api/tokens/%s/endpoints' % quote(self.user1.auth_token)
586 7ac2131c Sofia Papagiannaki
        headers = {'HTTP_X_AUTH_TOKEN': self.user2.auth_token}
587 7ac2131c Sofia Papagiannaki
        r = client.get(url, **headers)
588 7ac2131c Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
589 7ac2131c Sofia Papagiannaki
590 bd93595d Sofia Papagiannaki
        # Check belongsTo BadRequest
591 bd93595d Sofia Papagiannaki
        url = '/astakos/api/tokens/%s/endpoints?belongsTo=%s' % (
592 bd93595d Sofia Papagiannaki
            quote(self.user1.auth_token), quote(self.user2.uuid))
593 bd93595d Sofia Papagiannaki
        headers = {'HTTP_X_AUTH_TOKEN': self.user1.auth_token}
594 bd93595d Sofia Papagiannaki
        r = client.get(url, **headers)
595 bd93595d Sofia Papagiannaki
        self.assertEqual(r.status_code, 400)
596 bd93595d Sofia Papagiannaki
597 bd93595d Sofia Papagiannaki
        # Check successful request
598 7ac2131c Sofia Papagiannaki
        url = '/astakos/api/tokens/%s/endpoints' % quote(self.user1.auth_token)
599 7ac2131c Sofia Papagiannaki
        headers = {'HTTP_X_AUTH_TOKEN': self.user1.auth_token}
600 7ac2131c Sofia Papagiannaki
        r = client.get(url, **headers)
601 7ac2131c Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
602 7ac2131c Sofia Papagiannaki
        self.assertEqual(r['Content-Type'], 'application/json; charset=UTF-8')
603 7ac2131c Sofia Papagiannaki
        try:
604 7ac2131c Sofia Papagiannaki
            body = json.loads(r.content)
605 7ac2131c Sofia Papagiannaki
        except:
606 7ac2131c Sofia Papagiannaki
            self.fail('json format expected')
607 7ac2131c Sofia Papagiannaki
        endpoints = body.get('endpoints')
608 7ac2131c Sofia Papagiannaki
        self.assertEqual(len(endpoints), 3)
609 7ac2131c Sofia Papagiannaki
610 7ac2131c Sofia Papagiannaki
         # Check xml serialization
611 7ac2131c Sofia Papagiannaki
        url = '/astakos/api/tokens/%s/endpoints?format=xml' %\
612 7ac2131c Sofia Papagiannaki
            quote(self.user1.auth_token)
613 7ac2131c Sofia Papagiannaki
        headers = {'HTTP_X_AUTH_TOKEN': self.user1.auth_token}
614 7ac2131c Sofia Papagiannaki
        r = client.get(url, **headers)
615 7ac2131c Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
616 7ac2131c Sofia Papagiannaki
        self.assertEqual(r['Content-Type'], 'application/xml; charset=UTF-8')
617 7ac2131c Sofia Papagiannaki
#        try:
618 7ac2131c Sofia Papagiannaki
#            body = minidom.parseString(r.content)
619 7ac2131c Sofia Papagiannaki
#        except Exception, e:
620 7ac2131c Sofia Papagiannaki
#            self.fail('xml format expected')
621 7ac2131c Sofia Papagiannaki
        endpoints = body.get('endpoints')
622 7ac2131c Sofia Papagiannaki
        self.assertEqual(len(endpoints), 3)
623 7ac2131c Sofia Papagiannaki
624 7ac2131c Sofia Papagiannaki
        # Check limit
625 7ac2131c Sofia Papagiannaki
        url = '/astakos/api/tokens/%s/endpoints?limit=2' %\
626 7ac2131c Sofia Papagiannaki
            quote(self.user1.auth_token)
627 7ac2131c Sofia Papagiannaki
        headers = {'HTTP_X_AUTH_TOKEN': self.user1.auth_token}
628 7ac2131c Sofia Papagiannaki
        r = client.get(url, **headers)
629 7ac2131c Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
630 7ac2131c Sofia Papagiannaki
        body = json.loads(r.content)
631 7ac2131c Sofia Papagiannaki
        endpoints = body.get('endpoints')
632 7ac2131c Sofia Papagiannaki
        self.assertEqual(len(endpoints), 2)
633 7ac2131c Sofia Papagiannaki
634 7ac2131c Sofia Papagiannaki
        endpoint_link = body.get('endpoint_links', [])[0]
635 7ac2131c Sofia Papagiannaki
        next = endpoint_link.get('href')
636 7ac2131c Sofia Papagiannaki
        p = urlparse(next)
637 7ac2131c Sofia Papagiannaki
        params = parse_qs(p.query)
638 7ac2131c Sofia Papagiannaki
        self.assertTrue('limit' in params)
639 7ac2131c Sofia Papagiannaki
        self.assertTrue('marker' in params)
640 7ac2131c Sofia Papagiannaki
        self.assertEqual(params['marker'][0], '2')
641 7ac2131c Sofia Papagiannaki
642 7ac2131c Sofia Papagiannaki
        # Check marker
643 7ac2131c Sofia Papagiannaki
        headers = {'HTTP_X_AUTH_TOKEN': self.user1.auth_token}
644 7ac2131c Sofia Papagiannaki
        r = client.get(next, **headers)
645 7ac2131c Sofia Papagiannaki
        self.assertEqual(r.status_code, 200)
646 7ac2131c Sofia Papagiannaki
        body = json.loads(r.content)
647 7ac2131c Sofia Papagiannaki
        endpoints = body.get('endpoints')
648 7ac2131c Sofia Papagiannaki
        self.assertEqual(len(endpoints), 1)