Skip to content

Commit 1697146

Browse files
Merge pull request #22 from piyush-jaiswal/feature/detect-duplicate-name-in-put
Feature/detect duplicate name in put
2 parents e0c5fc0 + 686bfcc commit 1697146

File tree

5 files changed

+82
-18
lines changed

5 files changed

+82
-18
lines changed

app/migrated_routes/category.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,12 @@ def put(self, data, id):
204204
db.session.commit()
205205
except IntegrityError as ie:
206206
db.session.rollback()
207+
if (
208+
isinstance(ie.orig, UniqueViolation)
209+
and ie.orig.diag.constraint_name
210+
== CategoryCollection._NAME_UNIQUE_CONSTRAINT.name
211+
):
212+
abort(409, message="Category with this name already exists")
207213
if (
208214
isinstance(ie.orig, UniqueViolation)
209215
and ie.orig.diag.constraint_name

app/migrated_routes/subcategory.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,12 @@ def put(self, data, id):
222222
db.session.commit()
223223
except IntegrityError as ie:
224224
db.session.rollback()
225+
if (
226+
isinstance(ie.orig, UniqueViolation)
227+
and ie.orig.diag.constraint_name
228+
== SubcategoryCollection._NAME_UNIQUE_CONSTRAINT.name
229+
):
230+
abort(409, message="Subcategory with this name already exists")
225231
if (
226232
isinstance(ie.orig, UniqueViolation)
227233
and ie.orig.diag.constraint_name

tests/test_category.py

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,14 @@ def test_get_all_categories(self, create_category):
7575
assert "B" in names
7676

7777
def test_update_category(self, create_authenticated_headers, create_category):
78-
headers = create_authenticated_headers()
79-
response = create_category("OldName", headers=headers)
78+
response = create_category("OldName")
8079
data = response.get_json()
8180
cat_id = data["id"]
81+
8282
update_resp = self.client.put(
83-
f"/categories/{cat_id}", json={"name": "NewName"}, headers=headers
83+
f"/categories/{cat_id}",
84+
json={"name": "NewName"},
85+
headers=create_authenticated_headers(),
8486
)
8587

8688
assert update_resp.status_code == 200
@@ -91,12 +93,34 @@ def test_update_category(self, create_authenticated_headers, create_category):
9193
self._verify_category_in_db("NewName")
9294
self._verify_category_in_db("OldName", should_exist=False)
9395

96+
def test_update_category_duplicate_name(
97+
self, create_authenticated_headers, create_category
98+
):
99+
create_category("OldName")
100+
response = create_category("NewName")
101+
data = response.get_json()
102+
cat_id = data["id"]
103+
104+
with pytest.raises(IntegrityError) as ie:
105+
self.client.put(
106+
f"/categories/{cat_id}",
107+
json={"name": "OldName"},
108+
headers=create_authenticated_headers(),
109+
)
110+
111+
assert isinstance(ie.value.orig, sqlite3.IntegrityError)
112+
assert "UNIQUE constraint failed" in str(ie.value.orig)
113+
self._verify_category_in_db("OldName")
114+
self._verify_category_in_db("NewName")
115+
94116
def test_delete_category(self, create_authenticated_headers, create_category):
95-
headers = create_authenticated_headers()
96-
response = create_category("ToDelete", headers=headers)
117+
response = create_category("ToDelete")
97118
data = response.get_json()
98119
cat_id = data["id"]
99-
delete_resp = self.client.delete(f"/categories/{cat_id}", headers=headers)
120+
121+
delete_resp = self.client.delete(
122+
f"/categories/{cat_id}", headers=create_authenticated_headers()
123+
)
100124

101125
assert delete_resp.status_code == 204
102126
get_resp = self.client.get(f"/categories/{cat_id}")

tests/test_product.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,14 @@ def test_get_all_products(self, create_product):
7171
assert "B" in names
7272

7373
def test_update_product(self, create_authenticated_headers, create_product):
74-
headers = create_authenticated_headers()
75-
response = create_product("OldProduct", "OldDesc", headers=headers)
74+
response = create_product("OldProduct", "OldDesc")
7675
data = response.get_json()
7776
p_id = data["id"]
77+
7878
update_resp = self.client.put(
79-
f"/product/{p_id}/update", json={"name": "NewProduct", "description": "NewDesc"}, headers=headers
79+
f"/product/{p_id}/update",
80+
json={"name": "NewProduct", "description": "NewDesc"},
81+
headers=create_authenticated_headers(),
8082
)
8183

8284
assert update_resp.status_code == 201
@@ -88,11 +90,13 @@ def test_update_product(self, create_authenticated_headers, create_product):
8890
self._verify_product_in_db("OldProduct", should_exist=False)
8991

9092
def test_delete_product(self, create_authenticated_headers, create_product):
91-
headers = create_authenticated_headers()
92-
response = create_product("ToDelete", "desc", headers=headers)
93+
response = create_product("ToDelete", "desc")
9394
data = response.get_json()
9495
p_id = data["id"]
95-
delete_resp = self.client.delete(f"/product/{p_id}", headers=headers)
96+
97+
delete_resp = self.client.delete(
98+
f"/product/{p_id}", headers=create_authenticated_headers()
99+
)
96100

97101
assert delete_resp.status_code == 200
98102
get_resp = self.client.get(f"/product/{p_id}")

tests/test_subcategory.py

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,14 @@ def test_get_all_subcategories(self, create_subcategory):
7575
assert "B" in names
7676

7777
def test_update_subcategory(self, create_authenticated_headers, create_subcategory):
78-
headers = create_authenticated_headers()
79-
response = create_subcategory("OldSubcat", headers=headers)
78+
response = create_subcategory("OldSubcat")
8079
data = response.get_json()
8180
sc_id = data["id"]
81+
8282
update_resp = self.client.put(
83-
f"/subcategories/{sc_id}", json={"name": "NewSubcat"}, headers=headers
83+
f"/subcategories/{sc_id}",
84+
json={"name": "NewSubcat"},
85+
headers=create_authenticated_headers(),
8486
)
8587

8688
assert update_resp.status_code == 200
@@ -90,12 +92,34 @@ def test_update_subcategory(self, create_authenticated_headers, create_subcatego
9092
self._verify_subcategory_in_db("NewSubcat")
9193
self._verify_subcategory_in_db("OldSubcat", should_exist=False)
9294

95+
def test_update_subcategory_duplicate_name(
96+
self, create_authenticated_headers, create_subcategory
97+
):
98+
create_subcategory("OldSubcat")
99+
response = create_subcategory("NewSubcat")
100+
data = response.get_json()
101+
sc_id = data["id"]
102+
103+
with pytest.raises(IntegrityError) as ie:
104+
self.client.put(
105+
f"/subcategories/{sc_id}",
106+
json={"name": "OldSubcat"},
107+
headers=create_authenticated_headers(),
108+
)
109+
110+
assert isinstance(ie.value.orig, sqlite3.IntegrityError)
111+
assert "UNIQUE constraint failed" in str(ie.value.orig)
112+
self._verify_subcategory_in_db("OldSubcat")
113+
self._verify_subcategory_in_db("NewSubcat")
114+
93115
def test_delete_subcategory(self, create_authenticated_headers, create_subcategory):
94-
headers = create_authenticated_headers()
95-
response = create_subcategory("ToDelete", headers=headers)
116+
response = create_subcategory("ToDelete")
96117
data = response.get_json()
97118
sc_id = data["id"]
98-
delete_resp = self.client.delete(f"/subcategories/{sc_id}", headers=headers)
119+
120+
delete_resp = self.client.delete(
121+
f"/subcategories/{sc_id}", headers=create_authenticated_headers()
122+
)
99123

100124
assert delete_resp.status_code == 204
101125
get_resp = self.client.get(f"/subcategories/{sc_id}")

0 commit comments

Comments
 (0)