1+ import sqlite3
2+
13import pytest
4+ from sqlalchemy .exc import IntegrityError
25
36from app .models import Product
47from 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
0 commit comments