Revision 2070c5f8

b/snf-astakos-app/astakos/im/tests/api.py
66 66
                      "service_origin": "service1",
67 67
                      "ui_visible": True}
68 68
        r, _ = register.add_resource(resource11)
69
        register.update_resources([(r, 100)])
69
        register.update_base_default(r, 100)
70 70
        resource12 = {"name": "service1.resource12",
71 71
                      "desc": "resource11 desc",
72 72
                      "service_type": "type1",
73 73
                      "service_origin": "service1",
74 74
                      "unit": "bytes"}
75 75
        r, _ = register.add_resource(resource12)
76
        register.update_resources([(r, 1024)])
76
        register.update_base_default(r, 1024)
77 77

  
78 78
        # create user
79 79
        user = get_local_user('test@grnet.gr')
......
93 93
                      "service_origin": "service2",
94 94
                      "ui_visible": False}
95 95
        r, _ = register.add_resource(resource21)
96
        register.update_resources([(r, 3)])
96
        register.update_base_default(r, 3)
97 97

  
98 98
        resource_names = [r['name'] for r in
99 99
                          [resource11, resource12, resource21]]
......
113 113
        r = client.get(u('quotas/'), **headers)
114 114
        self.assertEqual(r.status_code, 200)
115 115
        body = json.loads(r.content)
116
        system_quota = body['system']
117
        assertIn('system', body)
116
        assertIn(user.uuid, body)
117
        base_quota = body[user.uuid]
118 118
        for name in resource_names:
119
            assertIn(name, system_quota)
119
            assertIn(name, base_quota)
120 120

  
121 121
        nmheaders = {'HTTP_X_AUTH_TOKEN': non_moderated_user.auth_token}
122 122
        r = client.get(u('quotas/'), **nmheaders)
......
149 149
            "name": "my commission",
150 150
            "provisions": [
151 151
                {
152
                    "holder": user.uuid,
153
                    "source": "system",
152
                    "holder": "user:" + user.uuid,
153
                    "source": "project:" + user.uuid,
154 154
                    "resource": resource11['name'],
155 155
                    "quantity": 1
156 156
                },
157 157
                {
158
                    "holder": user.uuid,
159
                    "source": "system",
158
                    "holder": "user:" + user.uuid,
159
                    "source": "project:" + user.uuid,
160 160
                    "resource": resource12['name'],
161 161
                    "quantity": 30000
162 162
                }]}
......
172 172
            "name": "my commission",
173 173
            "provisions": [
174 174
                {
175
                    "holder": user.uuid,
176
                    "source": "system",
175
                    "holder": "user:" + user.uuid,
176
                    "source": "project:" + user.uuid,
177 177
                    "resource": resource11['name'],
178 178
                    "quantity": 1
179 179
                },
180 180
                {
181
                    "holder": user.uuid,
182
                    "source": "system",
181
                    "holder": "user:" + user.uuid,
182
                    "source": "project:" + user.uuid,
183 183
                    "resource": resource12['name'],
184 184
                    "quantity": 100
185 185
                }]}
......
226 226
        self.assertEqual(r.status_code, 200)
227 227
        body = json.loads(r.content)
228 228
        user_quota = body[user.uuid]
229
        system_quota = user_quota['system']
230
        r11 = system_quota[resource11['name']]
229
        base_quota = user_quota[user.uuid]
230
        r11 = base_quota[resource11['name']]
231 231
        self.assertEqual(r11['usage'], 3)
232 232
        self.assertEqual(r11['pending'], 3)
233 233

  
234
        r = client.get(u('service_project_quotas'), **s1_headers)
235
        self.assertEqual(r.status_code, 200)
236
        body = json.loads(r.content)
237
        assertIn(user.uuid, body)
238

  
234 239
        # resolve pending commissions
235 240
        resolve_data = {
236 241
            "accept": [serial1, serial3],
......
256 261
            "name": "my commission",
257 262
            "provisions": [
258 263
                {
259
                    "holder": user.uuid,
260
                    "source": "system",
264
                    "holder": "user:" + user.uuid,
265
                    "source": "project:" + user.uuid,
261 266
                    "resource": resource11['name'],
262 267
                    "quantity": 1
263 268
                },
264 269
                {
265
                    "holder": user.uuid,
266
                    "source": "system",
270
                    "holder": "user:" + user.uuid,
271
                    "source": "project:" + user.uuid,
267 272
                    "resource": resource12['name'],
268 273
                    "quantity": 100
269 274
                }]}
......
285 290
            "name": "my commission",
286 291
            "provisions": [
287 292
                {
288
                    "holder": user.uuid,
289
                    "source": "system",
293
                    "holder": "user:" + user.uuid,
294
                    "source": "project:" + user.uuid,
290 295
                    "resource": resource11['name'],
291 296
                }
292 297
            ]}
......
316 321
            "name": "my commission",
317 322
            "provisions": [
318 323
                {
319
                    "holder": user.uuid,
320
                    "source": "system",
324
                    "holder": "user:" + user.uuid,
325
                    "source": "project:" + user.uuid,
321 326
                    "resource": "non existent",
322 327
                    "quantity": 1
323 328
                },
324 329
                {
325
                    "holder": user.uuid,
326
                    "source": "system",
330
                    "holder": "user:" + user.uuid,
331
                    "source": "project:" + user.uuid,
327 332
                    "resource": resource12['name'],
328 333
                    "quantity": 100
329 334
                }]}
......
337 342
        commission_request = {
338 343
            "provisions": [
339 344
                {
340
                    "holder": user.uuid,
341
                    "source": "system",
345
                    "holder": "user:" + user.uuid,
346
                    "source": "project:" + user.uuid,
342 347
                    "resource": resource11['name'],
343 348
                    "quantity": -1
344 349
                }
......
368 373
            "force": True,
369 374
            "provisions": [
370 375
                {
371
                    "holder": user.uuid,
372
                    "source": "system",
376
                    "holder": "user:" + user.uuid,
377
                    "source": "project:" + user.uuid,
373 378
                    "resource": resource11['name'],
374 379
                    "quantity": 100
375 380
                }]}
......
383 388
            "force": True,
384 389
            "provisions": [
385 390
                {
386
                    "holder": user.uuid,
387
                    "source": "system",
391
                    "holder": "user:" + user.uuid,
392
                    "source": "project:" + user.uuid,
388 393
                    "resource": resource11['name'],
389 394
                    "quantity": -200
390 395
                }]}
......
397 402
        r = client.get(u('quotas'), **headers)
398 403
        self.assertEqual(r.status_code, 200)
399 404
        body = json.loads(r.content)
400
        system_quota = body['system']
401
        r11 = system_quota[resource11['name']]
405
        base_quota = body[user.uuid]
406
        r11 = base_quota[resource11['name']]
402 407
        self.assertEqual(r11['usage'], 102)
403 408
        self.assertEqual(r11['pending'], 101)
404 409

  
......
753 758
class ValidateAccessToken(TestCase):
754 759
    def setUp(self):
755 760
        self.oa2_backend = DjangoBackend()
756
        self.user = AstakosUser.objects.create(username="user@synnefo.org")
761
        self.user = get_local_user("user@synnefo.org")
757 762
        self.token = self.oa2_backend.token_model.create(
758 763
            code='12345',
759 764
            expires_at=datetime.now() + timedelta(seconds=5),
b/snf-astakos-app/astakos/im/tests/projects.py
34 34
from astakos.im.tests.common import *
35 35

  
36 36

  
37
NotFound = type('NotFound', (), {})
38

  
39

  
40
def find(f, seq):
41
    for item in seq:
42
        if f(item):
43
            return item
44
    return NotFound
45

  
46

  
37 47
class ProjectAPITest(TestCase):
38 48

  
39 49
    def setUp(self):
......
47 57
                      "service_origin": "service1",
48 58
                      "ui_visible": True}
49 59
        r, _ = register.add_resource(resource11)
50
        register.update_resources([(r, 100)])
60
        register.update_base_default(r, 100)
51 61
        resource12 = {"name": "service1.resource12",
52 62
                      "desc": "resource11 desc",
53 63
                      "service_type": "type1",
54 64
                      "service_origin": "service1",
55 65
                      "unit": "bytes"}
56 66
        r, _ = register.add_resource(resource12)
57
        register.update_resources([(r, 1024)])
67
        register.update_base_default(r, 1024)
58 68

  
59 69
        # create user
60 70
        self.user1 = get_local_user("test@grnet.gr")
......
73 83
                       "ui_visible": False,
74 84
                       "api_visible": False}
75 85
        r, _ = register.add_resource(pending_app)
76
        register.update_resources([(r, 3)])
77
        accepted = AstakosUser.objects.accepted()
78
        quotas.update_base_quota(accepted, r.name, 3)
86
        register.update_base_default(r, 3)
87
        request = {"resources": {r.name: {"member_capacity": 3,
88
                                          "project_capacity": 3}}}
89
        functions.modify_projects_in_bulk(Q(is_base=True), request)
79 90

  
80 91
    def create(self, app, headers):
81 92
        dump = json.dumps(app)
......
92 103
        body = json.loads(r.content)
93 104
        return r.status_code, body
94 105

  
95
    def project_action(self, project_id, action, headers):
96
        action = json.dumps({action: "reason"})
106
    def project_action(self, project_id, action, app_id=None, headers=None):
107
        action_data = {"reason": ""}
108
        if app_id is not None:
109
            action_data["app_id"] = app_id
110
        action = json.dumps({action: action_data})
97 111
        r = self.client.post(reverse("api_project_action",
98 112
                                     kwargs={"project_id": project_id}),
99 113
                             action, content_type="application/json",
100 114
                             **headers)
101 115
        return r.status_code
102 116

  
103
    def app_action(self, app_id, action, headers):
104
        action = json.dumps({action: "reason"})
105
        r = self.client.post(reverse("api_application_action",
106
                                     kwargs={"app_id": app_id}),
107
                             action, content_type="application/json",
108
                             **headers)
109
        return r.status_code
110

  
111 117
    def memb_action(self, memb_id, action, headers):
112 118
        action = json.dumps({action: "reason"})
113 119
        r = self.client.post(reverse("api_membership_action",
......
148 154
        r = client.get(reverse("api_project", kwargs={"project_id": 1}),
149 155
                       **h_owner)
150 156
        self.assertEqual(r.status_code, 404)
151
        r = client.get(reverse("api_application", kwargs={"app_id": 1}),
152
                       **h_owner)
153
        self.assertEqual(r.status_code, 404)
154
        r = client.get(reverse("api_membership", kwargs={"memb_id": 1}),
157
        r = client.get(reverse("api_membership", kwargs={"memb_id": 100}),
155 158
                       **h_owner)
156 159
        self.assertEqual(r.status_code, 404)
157 160

  
158 161
        status = self.memb_action(1, "accept", h_admin)
159
        self.assertEqual(status, 404)
162
        self.assertEqual(status, 409)
160 163

  
161 164
        app1 = {"name": "test.pr",
162 165
                "end_date": "2013-5-5T20:20:20Z",
163 166
                "join_policy": "auto",
164 167
                "max_members": 5,
165 168
                "resources": {"service1.resource11": {
169
                    "project_capacity": 1024,
166 170
                    "member_capacity": 512}}
167 171
                }
168 172

  
169
        status, body = self.modify(app1, 1, h_owner)
173
        status, body = self.modify(app1, 100, h_owner)
170 174
        self.assertEqual(status, 404)
171 175

  
172 176
        # Create
......
182 186
        self.assertEqual(r.status_code, 200)
183 187
        body = json.loads(r.content)
184 188
        self.assertEqual(body["id"], project_id)
185
        self.assertEqual(body["application"], app_id)
186
        self.assertEqual(body["state"], "pending")
189
        self.assertEqual(body["last_application"]["id"], app_id)
190
        self.assertEqual(body["last_application"]["state"], "pending")
191
        self.assertEqual(body["state"], "uninitialized")
187 192
        self.assertEqual(body["owner"], self.user1.uuid)
188 193

  
189 194
        # Approve forbidden
190
        status = self.app_action(app_id, "approve", h_owner)
195
        status = self.project_action(project_id, "approve", app_id=app_id,
196
                                     headers=h_owner)
191 197
        self.assertEqual(status, 403)
192 198

  
193 199
        # Create another with the same name
......
201 207
        app_p3["name"] = "new.pr"
202 208
        status, body = self.create(app_p3, h_owner)
203 209
        self.assertEqual(status, 201)
210
        project3_id = body["id"]
204 211
        project3_app_id = body["application"]
205 212

  
206 213
        # No more pending allowed
......
208 215
        self.assertEqual(status, 409)
209 216

  
210 217
        # Cancel
211
        status = self.app_action(project3_app_id, "cancel", h_owner)
218
        status = self.project_action(project3_id, "cancel",
219
                                     app_id=project3_app_id, headers=h_owner)
212 220
        self.assertEqual(status, 200)
213 221

  
214
        # Modify
222
        # Get project
223
        r = client.get(reverse("api_project",
224
                               kwargs={"project_id": project3_id}),
225
                       **h_owner)
226
        body = json.loads(r.content)
227
        self.assertEqual(body["state"], "deleted")
228

  
229
        # Modify of uninitialized failed
215 230
        app2 = {"name": "test.pr",
216 231
                "start_date": "2013-5-5T20:20:20Z",
217 232
                "end_date": "2013-7-5T20:20:20Z",
......
219 234
                "leave_policy": "auto",
220 235
                "max_members": 3,
221 236
                "resources": {"service1.resource11": {
237
                    "project_capacity": 1024,
222 238
                    "member_capacity": 1024}}
223 239
                }
224

  
225 240
        status, body = self.modify(app2, project_id, h_owner)
241
        self.assertEqual(status, 409)
242

  
243
        # Create the project again
244
        status, body = self.create(app2, h_owner)
226 245
        self.assertEqual(status, 201)
227
        self.assertEqual(project_id, body["id"])
228
        app2_id = body["application"]
229
        assertGreater(app2_id, app_id)
246
        project_id = body["id"]
247
        app_id = body["application"]
230 248

  
231 249
        # Dismiss failed
232
        status = self.app_action(app2_id, "dismiss", h_owner)
250
        status = self.project_action(project_id, "dismiss", app_id,
251
                                     headers=h_owner)
233 252
        self.assertEqual(status, 409)
234 253

  
235 254
        # Deny
236
        status = self.app_action(app2_id, "deny", h_admin)
255
        status = self.project_action(project_id, "deny", app_id,
256
                                     headers=h_admin)
237 257
        self.assertEqual(status, 200)
238 258

  
239
        r = client.get(reverse("api_application", kwargs={"app_id": app2_id}),
259
        # Get project
260
        r = client.get(reverse("api_project",
261
                               kwargs={"project_id": project_id}),
240 262
                       **h_owner)
241 263
        body = json.loads(r.content)
242
        self.assertEqual(body["state"], "denied")
264
        self.assertEqual(body["last_application"]["id"], app_id)
265
        self.assertEqual(body["last_application"]["state"], "denied")
266
        self.assertEqual(body["state"], "uninitialized")
243 267

  
244 268
        # Dismiss
245
        status = self.app_action(app2_id, "dismiss", h_owner)
269
        status = self.project_action(project_id, "dismiss", app_id,
270
                                     headers=h_owner)
246 271
        self.assertEqual(status, 200)
247 272

  
248
        # Resubmit
249
        status, body = self.modify(app2, project_id, h_owner)
273
        # Get project
274
        r = client.get(reverse("api_project",
275
                               kwargs={"project_id": project_id}),
276
                       **h_owner)
277
        body = json.loads(r.content)
278
        self.assertEqual(body["last_application"]["id"], app_id)
279
        self.assertEqual(body["last_application"]["state"], "dismissed")
280
        self.assertEqual(body["state"], "deleted")
281

  
282
        # Create the project again
283
        status, body = self.create(app2, h_owner)
250 284
        self.assertEqual(status, 201)
251
        app3_id = body["application"]
285
        project_id = body["id"]
286
        app_id = body["application"]
252 287

  
253 288
        # Approve
254
        status = self.app_action(app3_id, "approve", h_admin)
289
        status = self.project_action(project_id, "approve", app_id,
290
                                     headers=h_admin)
255 291
        self.assertEqual(status, 200)
256 292

  
257
        # Get related apps
258
        req = {"body": json.dumps({"project": project_id})}
259
        r = client.get(reverse("api_applications"), req, **h_owner)
260
        self.assertEqual(r.status_code, 200)
261
        body = json.loads(r.content)
262
        self.assertEqual(len(body), 3)
263

  
264
        # Get apps
265
        r = client.get(reverse("api_applications"), **h_owner)
266
        self.assertEqual(r.status_code, 200)
293
        # Check memberships
294
        r = client.get(reverse("api_memberships"), **h_plain)
267 295
        body = json.loads(r.content)
268
        self.assertEqual(len(body), 5)
296
        self.assertEqual(len(body), 1)
269 297

  
270 298
        # Enroll
271 299
        status, body = self.enroll(project_id, self.user3, h_owner)
272 300
        self.assertEqual(status, 200)
273 301
        m_plain_id = body["id"]
274 302

  
303
        # Get project
304
        r = client.get(reverse("api_project",
305
                               kwargs={"project_id": project_id}),
306
                       **h_owner)
307
        body = json.loads(r.content)
275 308
        # Join
276 309
        status, body = self.join(project_id, h_owner)
277 310
        self.assertEqual(status, 200)
......
280 313
        # Check memberships
281 314
        r = client.get(reverse("api_memberships"), **h_plain)
282 315
        body = json.loads(r.content)
283
        self.assertEqual(len(body), 1)
284
        m = body[0]
316
        self.assertEqual(len(body), 2)
317
        m = find(lambda m: m["project"] == project_id, body)
318
        self.assertNotEqual(m, NotFound)
285 319
        self.assertEqual(m["user"], self.user3.uuid)
286 320
        self.assertEqual(m["state"], "accepted")
287 321

  
288 322
        r = client.get(reverse("api_memberships"), **h_owner)
289 323
        body = json.loads(r.content)
290
        self.assertEqual(len(body), 2)
324
        self.assertEqual(len(body), 3)
291 325

  
292 326
        # Check membership
293 327
        r = client.get(reverse("api_membership", kwargs={"memb_id": memb_id}),
......
359 393
        ## Simple user mode
360 394
        r = client.get(reverse("api_projects"), **h_plain)
361 395
        body = json.loads(r.content)
362
        self.assertEqual(len(body), 1)
396
        self.assertEqual(len(body), 2)
363 397
        p = body[0]
364 398
        with assertRaises(KeyError):
365 399
            p["pending_application"]
366 400

  
367 401
        ## Owner mode
368
        filters = {"filter": {"state": ["active", "cancelled"]}}
369
        req = {"body": json.dumps(filters)}
370
        r = client.get(reverse("api_projects"), req, **h_owner)
402
        filters = {"state": "active"}
403
        r = client.get(reverse("api_projects"), filters, **h_owner)
371 404
        body = json.loads(r.content)
372 405
        self.assertEqual(len(body), 2)
373
        assertIn("pending_application", body[0])
374 406

  
375
        filters = {"filter": {"state": "pending"}}
376
        req = {"body": json.dumps(filters)}
377
        r = client.get(reverse("api_projects"), req, **h_owner)
407
        filters = {"state": "deleted"}
408
        r = client.get(reverse("api_projects"), filters, **h_owner)
378 409
        body = json.loads(r.content)
379
        self.assertEqual(len(body), 1)
380
        self.assertEqual(body[0]["id"], project2_id)
410
        self.assertEqual(len(body), 2)
381 411

  
382
        filters = {"filter": {"name": "test.pr"}}
383
        req = {"body": json.dumps(filters)}
384
        r = client.get(reverse("api_projects"), req, **h_owner)
412
        filters = {"state": "uninitialized"}
413
        r = client.get(reverse("api_projects"), filters, **h_owner)
385 414
        body = json.loads(r.content)
386 415
        self.assertEqual(len(body), 2)
387 416

  
417
        filters = {"name": "test.pr"}
418
        r = client.get(reverse("api_projects"), filters, **h_owner)
419
        body = json.loads(r.content)
420
        self.assertEqual(len(body), 4)
421

  
388 422
        # Leave failed
389 423
        status = self.memb_action(m_plain_id, "leave", h_owner)
390 424
        self.assertEqual(status, 403)
......
394 428
        self.assertEqual(status, 200)
395 429

  
396 430
        # Suspend failed
397
        status = self.project_action(project_id, "suspend", h_owner)
431
        status = self.project_action(project_id, "suspend", headers=h_owner)
398 432
        self.assertEqual(status, 403)
399 433

  
400 434
        # Unsuspend failed
401
        status = self.project_action(project_id, "unsuspend", h_admin)
435
        status = self.project_action(project_id, "unsuspend", headers=h_admin)
402 436
        self.assertEqual(status, 409)
403 437

  
404 438
        # Suspend
405
        status = self.project_action(project_id, "suspend", h_admin)
439
        status = self.project_action(project_id, "suspend", headers=h_admin)
406 440
        self.assertEqual(status, 200)
407 441

  
408 442
        # Cannot view project
......
411 445
        self.assertEqual(r.status_code, 403)
412 446

  
413 447
        # Unsuspend
414
        status = self.project_action(project_id, "unsuspend", h_admin)
448
        status = self.project_action(project_id, "unsuspend", headers=h_admin)
415 449
        self.assertEqual(status, 200)
416 450

  
417 451
        # Cannot approve, project with same name exists
418
        status = self.app_action(project2_app_id, "approve", h_admin)
452
        status = self.project_action(project2_id, "approve", project2_app_id,
453
                                     headers=h_admin)
419 454
        self.assertEqual(status, 409)
420 455

  
421 456
        # Terminate
422
        status = self.project_action(project_id, "terminate", h_admin)
457
        status = self.project_action(project_id, "terminate", headers=h_admin)
423 458
        self.assertEqual(status, 200)
424 459

  
425 460
        # Join failed
......
427 462
        self.assertEqual(status, 409)
428 463

  
429 464
        # Can approve now
430
        status = self.app_action(project2_app_id, "approve", h_admin)
465
        status = self.project_action(project2_id, "approve", project2_app_id,
466
                                     headers=h_admin)
431 467
        self.assertEqual(status, 200)
432 468

  
433 469
        # Join new project
......
436 472
        m_project2 = body["id"]
437 473

  
438 474
        # Get memberships of project
439
        body = {"body": json.dumps({"project": project2_id})}
440
        r = client.get(reverse("api_memberships"), body, **h_owner)
475
        filters = {"project": project2_id}
476
        r = client.get(reverse("api_memberships"), filters, **h_owner)
441 477
        body = json.loads(r.content)
442 478
        self.assertEqual(len(body), 1)
443 479
        self.assertEqual(body[0]["id"], m_project2)
......
447 483
        self.assertEqual(status, 200)
448 484

  
449 485
        # Reinstate failed
450
        status = self.project_action(project_id, "reinstate", h_admin)
486
        status = self.project_action(project_id, "reinstate", headers=h_admin)
451 487
        self.assertEqual(status, 409)
452 488

  
453 489
        # Rename
......
461 497
        r = client.get(reverse("api_project",
462 498
                               kwargs={"project_id": project_id}), **h_owner)
463 499
        body = json.loads(r.content)
464
        self.assertEqual(body["application"], app3_id)
465
        self.assertEqual(body["pending_application"], app2_renamed_id)
500
        self.assertEqual(body["last_application"]["id"], app2_renamed_id)
466 501
        self.assertEqual(body["state"], "terminated")
467 502
        assertIn("deactivation_date", body)
503
        self.assertEqual(body["last_application"]["state"], "pending")
504
        self.assertEqual(body["last_application"]["name"], "new.name")
505
        status = self.project_action(project_id, "approve", app2_renamed_id,
506
                                     headers=h_admin)
507
        self.assertEqual(r.status_code, 200)
468 508

  
469
        # Get application
470
        r = client.get(reverse("api_application",
471
                               kwargs={"app_id": app2_renamed_id}), **h_plain)
472
        self.assertEqual(r.status_code, 403)
509
        # Change homepage
510
        status, body = self.modify({"homepage": "new.page"},
511
                                   project_id, h_owner)
512
        self.assertEqual(status, 201)
473 513

  
474
        r = client.get(reverse("api_application",
475
                               kwargs={"app_id": app2_renamed_id}), **h_owner)
476
        self.assertEqual(r.status_code, 200)
514
        r = client.get(reverse("api_project",
515
                               kwargs={"project_id": project_id}), **h_owner)
477 516
        body = json.loads(r.content)
478
        self.assertEqual(body["state"], "pending")
479
        self.assertEqual(body["name"], "new.name")
480

  
481
        # Approve (automatically reinstates)
482
        action = json.dumps({"approve": ""})
483
        r = client.post(reverse("api_application_action",
484
                                kwargs={"app_id": app2_renamed_id}),
485
                        action, content_type="application/json", **h_admin)
517
        self.assertEqual(body["homepage"], "")
518
        self.assertEqual(body["last_application"]["homepage"], "new.page")
519
        homepage_app = body["last_application"]["id"]
520
        status = self.project_action(project_id, "approve", homepage_app,
521
                                     headers=h_admin)
486 522
        self.assertEqual(r.status_code, 200)
523
        r = client.get(reverse("api_project",
524
                               kwargs={"project_id": project_id}), **h_owner)
525
        body = json.loads(r.content)
526
        self.assertEqual(body["homepage"], "new.page")
487 527

  
488 528
        # Bad requests
489 529
        r = client.head(reverse("api_projects"), **h_admin)
......
495 535
        self.assertEqual(r.status_code, 405)
496 536
        self.assertTrue('Allow' in r)
497 537

  
498
        r = client.head(reverse("api_applications"), **h_admin)
499
        self.assertEqual(r.status_code, 405)
500
        self.assertTrue('Allow' in r)
501

  
502 538
        r = client.head(reverse("api_memberships"), **h_admin)
503 539
        self.assertEqual(r.status_code, 405)
504 540
        self.assertTrue('Allow' in r)
505 541

  
506
        status = self.project_action(1, "nonex", h_owner)
542
        status = self.project_action(1, "nonex", headers=h_owner)
507 543
        self.assertEqual(status, 400)
508 544

  
509 545
        action = json.dumps({"suspend": "", "unsuspend": ""})
......
561 597
        status, body = self.create(ap, h_owner)
562 598
        self.assertEqual(status, 400)
563 599

  
564
        ap["resources"] = {"service1.resource11": {"member_capacity": 512}}
600
        ap["resources"] = {"service1.resource11": {
601
                "member_capacity": 512}}
602
        status, body = self.create(ap, h_owner)
603
        self.assertEqual(status, 400)
604

  
605
        ap["resources"] = {"service1.resource11": {"member_capacity": 512,
606
                                                   "project_capacity": 1024}}
565 607
        status, body = self.create(ap, h_owner)
566 608
        self.assertEqual(status, 201)
567 609

  
......
570 612
        self.assertEqual(status, 400)
571 613

  
572 614
        ap["name"] = "domain.name"
573
        ap.pop("max_members")
574
        status, body = self.create(ap, h_owner)
575
        self.assertEqual(status, 400)
576

  
577
        filters = {"filter": {"state": "nonex"}}
578
        req = {"body": json.dumps(filters)}
579
        r = client.get(reverse("api_projects"), req, **h_owner)
580
        self.assertEqual(r.status_code, 400)
581 615

  
582
        filters = {"filter": {"nonex": "nonex"}}
583
        req = {"body": json.dumps(filters)}
584
        r = client.get(reverse("api_projects"), req, **h_owner)
585
        self.assertEqual(r.status_code, 400)
586

  
587
        req = {"body": json.dumps({"project": "nonex"})}
588
        r = client.get(reverse("api_applications"), req, **h_owner)
589
        self.assertEqual(r.status_code, 400)
590

  
591
        req = {"body": json.dumps({"project": "nonex"})}
592
        r = client.get(reverse("api_memberships"), req, **h_owner)
616
        filters = {"state": "nonex"}
617
        r = client.get(reverse("api_projects"), filters, **h_owner)
593 618
        self.assertEqual(r.status_code, 400)
594 619

  
595 620

  
......
601 626
        # astakos resources
602 627
        self.resource = Resource.objects.create(name="astakos.pending_app",
603 628
                                                uplimit=0,
629
                                                project_default=0,
604 630
                                                ui_visible=False,
605 631
                                                api_visible=False,
606 632
                                                service_type="astakos")
......
608 634
        # custom service resources
609 635
        self.resource = Resource.objects.create(name="service1.resource",
610 636
                                                uplimit=100,
637
                                                project_default=0,
611 638
                                                service_type="service1")
612 639
        self.admin = get_local_user("projects-admin@synnefo.org")
613 640
        self.admin.uuid = 'uuid1'
......
673 700
    @im_settings(PROJECT_ADMINS=['uuid1'])
674 701
    def test_applications(self):
675 702
        # let user have 2 pending applications
676
        quotas.update_base_quota([self.user], 'astakos.pending_app', 2)
703

  
704
        # TODO figure this out
705
        request = {"resources": {"astakos.pending_app":
706
                                     {"member_capacity": 3,
707
                                      "project_capacity": 3}}}
708
        functions.modify_project(self.user.uuid, request)
677 709

  
678 710
        r = self.user_client.get(reverse('project_add'), follow=True)
679 711
        self.assertRedirects(r, reverse('project_add'))
b/snf-astakos-app/astakos/test/views.py
64 64
    if not ok:
65 65
        raise ProjectForbidden('Limit %s reached', limit)
66 66

  
67
    resource_policies = {'cyclades.network.private': {'member_capacity': 5}}
67
    resource_policies = {'cyclades.network.private': {'member_capacity': 5,
68
                                                      'project_capacity': 10}}
68 69
    data = {'owner': owner,
69 70
            'name': name,
70 71
            'project_id': project_id,

Also available in: Unified diff