Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : master
---------------------------------------------------------------
commit c8a01c8354fdfc991b09f96d33f9489147385ae2
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Mon Aug 31 14:42:51 2015 +0200
[frontend][api] Added DELETE method to /builds/<id> resource
---------------------------------------------------------------
.../coprs/rest_api/resources/build.py | 31 ++++----
.../coprs_frontend/tests/test_api/test_build_r.py | 79 +++++++++++++++++---
2 files changed, 86 insertions(+), 24 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/rest_api/resources/build.py
b/frontend/coprs_frontend/coprs/rest_api/resources/build.py
index 5c2a2b5..80e5b17 100644
--- a/frontend/coprs_frontend/coprs/rest_api/resources/build.py
+++ b/frontend/coprs_frontend/coprs/rest_api/resources/build.py
@@ -172,24 +172,27 @@ class BuildListR(Resource):
class BuildR(Resource):
def get(self, build_id):
-
build = get_one_safe(BuildsLogic.get(build_id),
"Not found build with id: {}".format(build_id))
return render_build(build)
+ @rest_api_auth_required
+ def delete(self, build_id):
+ build = get_one_safe(BuildsLogic.get(build_id),
+ "Not found build with id: {}".format(build_id))
+ try:
+ BuildsLogic.delete_build(flask.g.user, build)
+ db.session.commit()
+ except ActionInProgressException as err:
+ db.session.rollback()
+ raise CannotProcessRequest("Cannot delete build due to: {}"
+ .format(err))
+ except InsufficientRightsException as err:
+ raise AccessForbidden("Failed to delete build: {}".format(err))
+
+ return "", 204
+
+
-# to get build details and cancel individual build chroots
-# class BuildChrootR(Resource):
-# def get(self, owner, project, name):
-# copr = get_one_safe(CoprsLogic.get(flask.g.user, owner, project),
-# "Copr {}/{} not found".format(owner, project))
-# chroot = get_one_safe(CoprChrootsLogic.get(copr, name))
-#
-# return {
-# "chroot": chroot.to_dict(),
-# "links": {
-# "self": bp_url_for(BuildChrootR.endpoint, owner=owner,
project=project, name=name)
-# }
-# }
diff --git a/frontend/coprs_frontend/tests/test_api/test_build_r.py
b/frontend/coprs_frontend/tests/test_api/test_build_r.py
index 0d9c9b9..406b7a0 100644
--- a/frontend/coprs_frontend/tests/test_api/test_build_r.py
+++ b/frontend/coprs_frontend/tests/test_api/test_build_r.py
@@ -1,20 +1,13 @@
# coding: utf-8
from cStringIO import StringIO
-
import json
-from marshmallow import pprint
import math
+import random
-import pytest
-import sqlalchemy
-from coprs import models
from coprs.helpers import BuildSourceEnum
-
-from coprs.logic.users_logic import UsersLogic
from coprs.logic.coprs_logic import CoprsLogic
from coprs.logic.builds_logic import BuildsLogic
-
-from tests.coprs_test_case import CoprsTestCase, TransactionDecorator
+from tests.coprs_test_case import CoprsTestCase
class TestBuildResource(CoprsTestCase):
@@ -343,7 +336,7 @@ class TestBuildResource(CoprsTestCase):
)
assert r0.status_code == 400
- def test_get_one(self, f_users, f_coprs, f_builds, f_db,
+ def test_get_one_build(self, f_users, f_coprs, f_builds, f_db,
f_users_api, f_mock_chroots):
build_id_list = [b.id for b in self.basic_builds]
@@ -356,3 +349,69 @@ class TestBuildResource(CoprsTestCase):
obj = json.loads(r.data)
assert obj["build"]["id"] == b_id
assert obj["_links"]["self"]["href"] == href
+
+ def test_get_one_build_not_found(self, f_users, f_coprs, f_builds, f_db,
+ f_users_api, f_mock_chroots):
+ build_id_list = [b.id for b in self.basic_builds]
+ max_id = max(build_id_list) + 1
+ self.db.session.commit()
+
+ for _ in range(10):
+ fake_id = random.randint(max_id, max_id * 10)
+ href = "/api_2/builds/{}".format(fake_id)
+
+ r = self.tc.get(href)
+ assert r.status_code == 404
+
+ def test_delete_build_ok(self, f_users, f_coprs,
+ f_mock_chroots, f_builds,f_users_api, ):
+
+
+ self.db.session.commit()
+ b_id = self.b1.id
+ href = "/api_2/builds/{}".format(b_id)
+ r = self.request_rest_api_with_auth(
+ href,
+ method="delete",
+ )
+ assert r.status_code == 204
+
+ r2 = self.tc.get(href)
+ assert r2.status_code == 404
+
+ def test_delete_build_wrong_user(self, f_users, f_coprs,
+ f_mock_chroots, f_builds,f_users_api, ):
+
+ login = self.u2.api_login
+ token = self.u2.api_token
+ self.db.session.commit()
+ b_id = self.b1.id
+ href = "/api_2/builds/{}".format(b_id)
+ r = self.request_rest_api_with_auth(
+ href,
+ method="delete",
+ login=login, token=token,
+ )
+ assert r.status_code == 403
+
+ def test_delete_build_in_progress(self, f_users, f_coprs,
+ f_mock_chroots, f_builds,f_users_api, ):
+
+ login = self.u2.api_login
+ token = self.u2.api_token
+ self.db.session.commit()
+ b_id = self.b3.id
+ href = "/api_2/builds/{}".format(b_id)
+ r = self.request_rest_api_with_auth(
+ href,
+ method="delete",
+ login=login, token=token,
+ )
+ assert r.status_code == 400
+ print(r.data)
+
+ # test_put_build_wrong_user
+ # test_put_build_not_found
+ # test_put_cancel_build
+ # test_put_cancel_build_wrong_state
+