Skip to content

Commit 10aa701

Browse files
update product tests and add duplicate duplicate links test
1 parent 8e9ab0a commit 10aa701

File tree

3 files changed

+71
-27
lines changed

3 files changed

+71
-27
lines changed

tests/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,6 @@ def _create(name, description=None, subcategories=None, headers=None):
9393
payload["description"] = description
9494
if subcategories is not None:
9595
payload["subcategories"] = subcategories
96-
return client.post("/product/create", json=payload, headers=headers)
96+
return client.post("/products", json=payload, headers=headers)
9797

9898
return _create

tests/test_product.py

Lines changed: 43 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import sqlite3
2+
13
import pytest
4+
from sqlalchemy.exc import IntegrityError
25

36
from app.models import Product
47
from tests import utils
@@ -40,17 +43,20 @@ def test_create_product(self, create_product):
4043

4144
def test_create_product_duplicate_name(self, create_product):
4245
create_product(self.TEST_PRODUCT_NAME, self.TEST_PRODUCT_DESC)
43-
response = create_product(self.TEST_PRODUCT_NAME, self.TEST_PRODUCT_DESC)
4446

45-
assert response.status_code == 500
47+
with pytest.raises(IntegrityError) as ie:
48+
create_product(self.TEST_PRODUCT_NAME, self.TEST_PRODUCT_DESC)
49+
50+
assert isinstance(ie.value.orig, sqlite3.IntegrityError)
51+
assert "UNIQUE constraint failed" in str(ie.value.orig)
4652
assert self._count_products() == 1
4753
self._verify_product_in_db(self.TEST_PRODUCT_NAME)
4854

4955
def test_get_product_by_id(self, create_product):
5056
response = create_product("Pixel 6", "Google phone")
5157
data = response.get_json()
5258
p_id = data["id"]
53-
get_resp = self.client.get(f"/product/{p_id}")
59+
get_resp = self.client.get(f"/products/{p_id}")
5460

5561
assert get_resp.status_code == 200
5662
data = get_resp.get_json()
@@ -76,30 +82,50 @@ def test_update_product(self, create_authenticated_headers, create_product):
7682
p_id = data["id"]
7783

7884
update_resp = self.client.put(
79-
f"/product/{p_id}/update",
85+
f"/products/{p_id}",
8086
json={"name": "NewProduct", "description": "NewDesc"},
8187
headers=create_authenticated_headers(),
8288
)
8389

84-
assert update_resp.status_code == 201
90+
assert update_resp.status_code == 200
8591
data = update_resp.get_json()
8692
assert data["name"] == "NewProduct"
8793
assert data["description"] == "NewDesc"
8894
assert data["id"] == p_id
8995
self._verify_product_in_db("NewProduct")
9096
self._verify_product_in_db("OldProduct", should_exist=False)
9197

98+
def test_update_product_duplicate_name(
99+
self, create_authenticated_headers, create_product
100+
):
101+
create_product("OldProduct", "OldDesc")
102+
response = create_product("NewProduct", "NewDesc")
103+
data = response.get_json()
104+
cat_id = data["id"]
105+
106+
with pytest.raises(IntegrityError) as ie:
107+
self.client.put(
108+
f"/products/{cat_id}",
109+
json={"name": "OldProduct"},
110+
headers=create_authenticated_headers(),
111+
)
112+
113+
assert isinstance(ie.value.orig, sqlite3.IntegrityError)
114+
assert "UNIQUE constraint failed" in str(ie.value.orig)
115+
self._verify_product_in_db("OldProduct")
116+
self._verify_product_in_db("NewProduct")
117+
92118
def test_delete_product(self, create_authenticated_headers, create_product):
93119
response = create_product("ToDelete", "desc")
94120
data = response.get_json()
95121
p_id = data["id"]
96122

97123
delete_resp = self.client.delete(
98-
f"/product/{p_id}", headers=create_authenticated_headers()
124+
f"/products/{p_id}", headers=create_authenticated_headers()
99125
)
100126

101-
assert delete_resp.status_code == 200
102-
get_resp = self.client.get(f"/product/{p_id}")
127+
assert delete_resp.status_code == 204
128+
get_resp = self.client.get(f"/products/{p_id}")
103129
assert get_resp.status_code == 404
104130
self._verify_product_in_db("ToDelete", should_exist=False)
105131

@@ -118,19 +144,15 @@ def test_get_product_by_name(self, create_product, name):
118144
data = response.get_json()
119145
p_id = data["id"]
120146

121-
get_resp = self.client.get("/product", query_string={"name": name})
147+
get_resp = self.client.get("/products", query_string={"name": name})
122148
assert get_resp.status_code == 200
123-
prod_data = get_resp.get_json()
149+
prod_data = get_resp.get_json()["products"][0]
124150
assert prod_data["id"] == p_id
125151
assert prod_data["name"] == name
126152
assert prod_data["description"] == "desc"
127153

128-
not_found_resp = self.client.get("/product", query_string={"name": "Non existent product"})
129-
assert not_found_resp.status_code == 404
130-
131-
def test_get_product_by_name_missing_param_returns_400(self):
132-
resp = self.client.get("/product") # no query param
133-
assert resp.status_code == 400
154+
not_found_resp = self.client.get("/products", query_string={"name": "Non existent product"})
155+
assert not_found_resp.get_json()["products"] == []
134156

135157
@pytest.mark.parametrize(
136158
"get_headers, expected_code",
@@ -143,7 +165,7 @@ def test_get_product_by_name_missing_param_returns_400(self):
143165
def test_create_product_token_error(self, get_headers, expected_code):
144166
headers = get_headers(self)
145167
response = self.client.post(
146-
"/product/create", json={"name": "CreateTokenError"}, headers=headers
168+
"/products", json={"name": "CreateTokenError"}, headers=headers
147169
)
148170
utils.verify_token_error_response(response, expected_code)
149171
self._verify_product_in_db("CreateTokenError", should_exist=False)
@@ -163,7 +185,7 @@ def test_update_product_token_error(self, get_headers, create_product, expected_
163185

164186
update_headers = get_headers(self)
165187
update_resp = self.client.put(
166-
f"/product/{p_id}/update",
188+
f"/products/{p_id}",
167189
json={"name": "UpdatedName"},
168190
headers=update_headers,
169191
)
@@ -186,7 +208,7 @@ def test_delete_product_token_error(self, get_headers, create_product, expected_
186208
p_id = data["id"]
187209

188210
delete_headers = get_headers(self)
189-
delete_resp = self.client.delete(f"/product/{p_id}", headers=delete_headers)
211+
delete_resp = self.client.delete(f"/products/{p_id}", headers=delete_headers)
190212

191213
utils.verify_token_error_response(delete_resp, expected_code)
192214
self._verify_product_in_db("DeleteTokenError")
@@ -195,8 +217,8 @@ def test_products_pagination(self, create_product):
195217
for i in range(15):
196218
create_product(f"Product{i}", f"Description{i}")
197219

198-
# Page 1
199-
resp1 = self.client.get("/products?page=1")
220+
# Page 1 - default
221+
resp1 = self.client.get("/products")
200222
assert resp1.status_code == 200
201223
data1 = resp1.get_json()
202224
assert "products" in data1

tests/test_relationships.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -170,11 +170,33 @@ def test_update_product_adds_subcategories(self, create_authenticated_headers, c
170170
product = create_product("UP", "desc", subcategories=[subcategory1["id"]]).get_json()
171171

172172
headers = create_authenticated_headers()
173-
update_response = self.client.put(f"/product/{product['id']}/update", json={"subcategories": [subcategory2["id"]]}, headers=headers)
174-
assert update_response.status_code == 201
173+
update_response = self.client.put(f"/products/{product['id']}", json={"subcategories": [subcategory2["id"]]}, headers=headers)
174+
assert update_response.status_code == 200
175175

176176
assert self._product_subcategory_ids(product["id"]) == sorted([subcategory1["id"], subcategory2["id"]])
177177

178+
def test_update_product_adds_linked_subcategories(
179+
self, create_authenticated_headers, create_product, create_subcategory
180+
):
181+
subcategory1 = create_subcategory("UPS1").get_json()
182+
subcategory2 = create_subcategory("UPS2").get_json()
183+
product = create_product(
184+
"UP", "desc", subcategories=[subcategory1["id"], subcategory2["id"]]
185+
).get_json()
186+
187+
with pytest.raises(IntegrityError) as ie:
188+
self.client.put(
189+
f"/products/{product['id']}",
190+
json={"subcategories": [subcategory1["id"]]},
191+
headers=create_authenticated_headers(),
192+
)
193+
194+
assert isinstance(ie.value.orig, sqlite3.IntegrityError)
195+
assert "UNIQUE constraint failed" in str(ie.value.orig)
196+
assert self._product_subcategory_ids(product["id"]) == sorted(
197+
[subcategory1["id"], subcategory2["id"]]
198+
)
199+
178200
def test_get_category_subcategories_empty(self, create_category):
179201
category = create_category("Cat_NoSC").get_json()
180202
resp = self.client.get(f"/categories/{category['id']}/subcategories")
@@ -246,15 +268,15 @@ def test_get_subcategory_products_populated_with_pagination(self, create_subcate
246268

247269
def test_get_product_subcategories_empty(self, create_product):
248270
product = create_product("Prod_NoSC", "desc").get_json()
249-
resp = self.client.get(f"/product/{product['id']}/subcategories")
271+
resp = self.client.get(f"/products/{product['id']}/subcategories")
250272
self._assert_related_collection(resp, "subcategories")
251273

252274
def test_get_product_subcategories_populated(self, create_product, create_subcategory):
253275
subcategory1 = create_subcategory("S1").get_json()
254276
subcategory2 = create_subcategory("S2").get_json()
255277
product = create_product("Prod_SC", "desc", subcategories=[subcategory1["id"], subcategory2["id"]]).get_json()
256278

257-
resp = self.client.get(f"/product/{product['id']}/subcategories")
279+
resp = self.client.get(f"/products/{product['id']}/subcategories")
258280
self._assert_related_collection(resp, "subcategories", expected_ids=[subcategory1["id"], subcategory2["id"]])
259281

260282
@pytest.mark.parametrize(
@@ -264,7 +286,7 @@ def test_get_product_subcategories_populated(self, create_product, create_subcat
264286
"/categories/999999/products",
265287
"/subcategories/999999/categories",
266288
"/subcategories/999999/products",
267-
"/product/999999/subcategories",
289+
"/products/999999/subcategories",
268290
],
269291
)
270292
def test_relationship_getters_404(self, path):

0 commit comments

Comments
 (0)