#53 Response bad request when creating tag existed
Merged 2 years ago by hlin. Opened 2 years ago by hlin.
hlin/cts master  into  master

file modified
+22 -10
@@ -29,6 +29,7 @@ 

  from flask import render_template, request, jsonify, g, Response

  from flask_login import login_required

  from prometheus_client import generate_latest, CONTENT_TYPE_LATEST

+ from sqlalchemy.exc import IntegrityError

  

  from cts import app, conf, version, db

  from cts.errors import NotFound, Forbidden
@@ -387,15 +388,20 @@ 

              raise ValueError('Tag "documentation" is not defined.')

  

          user_data = data.get("user_data", None)

-         t = Tag.create(

-             db.session,

-             g.user.username,

-             name=name,

-             description=description,

-             documentation=documentation,

-             user_data=user_data,

-         )

-         db.session.commit()

+         try:

+             t = Tag.create(

+                 db.session,

+                 g.user.username,

+                 name=name,

+                 description=description,

+                 documentation=documentation,

+                 user_data=user_data,

+             )

+             db.session.commit()

+         except IntegrityError as e:

+             if "unique constraint" in str(e).lower():

+                 raise ValueError("Tag %s already exists" % name)

+             raise ValueError(str(e))

          return jsonify(t.json()), 200

  

      @login_required
@@ -462,7 +468,13 @@ 

              r = getattr(t, action)(g.user.username, username, user_data)

              if not r:

                  raise ValueError("User does not exist")

-         db.session.commit()

+ 

+         try:

+             db.session.commit()

+         except IntegrityError as e:

+             if "unique constraint" in str(e).lower():

+                 raise ValueError("Tag %s already exists" % name)

+             raise ValueError(str(e))

          return jsonify(t.json()), 200

  

  

file modified
+38
@@ -515,6 +515,25 @@ 

          }

          self.assertEqual(data, expected_data)

  

+     def test_tags_post_existed(self):

+         with self.test_request_context(user="root"):

+             req = {

+                 "name": "periodic",

+                 "description": "Periodic compose",

+                 "documentation": "Foo",

+                 "user_data": "Ticket #123",

+             }

+             rv = self.client.post("/api/1/tags/", json=req)

+             self.assertEqual(rv.status, "200 OK")

+ 

+             rv = self.client.post("/api/1/tags/", json=req)

+             data = json.loads(rv.get_data(as_text=True))

+ 

+         self.assertEqual(rv.status, "400 BAD REQUEST")

+         self.assertEqual(data["error"], "Bad Request")

+         self.assertEqual(data["status"], 400)

+         self.assertEqual(data["message"], "Tag %s already exists" % req["name"])

+ 

      def test_tags_post_unathorized(self):

          with self.test_request_context(user="odcs"):

              req = {
@@ -564,6 +583,25 @@ 

          }

          self.assertEqual(data, expected_data)

  

+     def test_tags_patch_existed(self):

+         self.test_tags_post()

+         with self.test_request_context(user="root"):

+             for name in ["t1", "t2"]:

+                 req = {

+                     "name": name,

+                     "description": "test",

+                     "documentation": "test",

+                 }

+                 self.client.post("/api/1/tags/", json=req)

+ 

+             rv = self.client.patch("/api/1/tags/1", json={"name": "t2"})

+             data = json.loads(rv.get_data(as_text=True))

+ 

+         self.assertEqual(rv.status, "400 BAD REQUEST")

+         self.assertEqual(data["error"], "Bad Request")

+         self.assertEqual(data["status"], 400)

+         self.assertEqual(data["message"], "Tag %s already exists" % req["name"])

+ 

      def test_tags_patch_unauthorized(self):

          self.test_tags_post()

          with self.test_request_context(user="odcs"):

FIXES: https://pagure.io/cts/issue/43
JIRA: RHELCMP-3834
Signed-off-by: Haibo Lin hlin@redhat.com

rebased onto 4fd741e

2 years ago

Pull-Request has been merged by hlin

2 years ago
Metadata