Skip to content

Commit a4d32d6

Browse files
Take product name as query param to avoid conflicts and special chars like /
1 parent b99b802 commit a4d32d6

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

app/routes.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -881,16 +881,16 @@ def delete_product(p_id):
881881
return "Error occured", 500
882882

883883

884-
@app.route('/product/<string:name>', methods=['GET'])
885-
def get_product_by_name(name):
884+
@app.route('/product', methods=['GET'])
885+
def get_product_by_name():
886886
"""
887887
Get Product by Name
888888
---
889889
tags:
890890
- Product
891891
description: Get a product by name.
892892
parameters:
893-
- in: path
893+
- in: query
894894
name: name
895895
required: true
896896
type: string
@@ -903,6 +903,10 @@ def get_product_by_name(name):
903903
500:
904904
description: Error occurred.
905905
"""
906+
name = request.args.get('name')
907+
if not name:
908+
abort(400, description="Missing required query parameter 'name'")
909+
906910
product = Product.query.filter(Product.name == name).first()
907911
if product is None:
908912
abort(404)

tests/test_product.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -116,23 +116,29 @@ def test_delete_product(self, create_authenticated_headers, create_product):
116116
assert get_resp.status_code == 404
117117
self._verify_product_in_db("ToDelete", should_exist=False)
118118

119-
def test_get_product_by_name(self, create_product):
120-
product_name = "Test Product With Spaces"
121-
response = create_product(product_name, "A test product with spaces")
119+
@pytest.mark.parametrize(
120+
"name",
121+
[
122+
"Test Product With Spaces And / And @",
123+
"Café",
124+
"C++",
125+
"20% off"
126+
]
127+
)
128+
def test_get_product_by_name(self, create_product, name):
129+
response = create_product(name, "desc")
122130
assert response.status_code == 201
123131
data = response.get_json()
124132
p_id = data["id"]
125133

126-
encoded_name = quote(product_name)
127-
get_resp = self.client.get(f"/product/{encoded_name}")
134+
get_resp = self.client.get("/product", query_string={"name": name})
128135
assert get_resp.status_code == 200
129136
prod_data = get_resp.get_json()
130137
assert prod_data["id"] == p_id
131-
assert prod_data["name"] == product_name
132-
assert prod_data["description"] == "A test product with spaces"
138+
assert prod_data["name"] == name
139+
assert prod_data["description"] == "desc"
133140

134-
encoded_name = quote("Non Existent Product")
135-
not_found_resp = self.client.get(f"/product/{encoded_name}")
141+
not_found_resp = self.client.get("/product", query_string={"name": "Non existent product"})
136142
assert not_found_resp.status_code == 404
137143

138144
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)