Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 8 additions & 12 deletions app/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -881,16 +881,16 @@ def delete_product(p_id):
return "Error occured", 500


@app.route('/product/<string:name>', methods=['GET'])
def get_product_by_name(name):
@app.route('/product', methods=['GET'])
def get_product_by_name():
"""
Get Product by Name
---
tags:
- Product
description: Get a product by name.
parameters:
- in: path
- in: query
name: name
required: true
type: string
Expand All @@ -903,18 +903,14 @@ def get_product_by_name(name):
500:
description: Error occurred.
"""
name = request.args.get('name')
if not name:
abort(400, description="Missing required query parameter 'name'")

product = Product.query.filter(Product.name == name).first()
if product is None:
abort(404)

try:
product_json = product.to_json()
subcategories = Subcategory.query.filter(Subcategory.id.in_(product_json["subcategories"]))
c_ids = set(c.id for sc in subcategories for c in sc.categories)
product_json["categories"] = list(c_ids)
return product_json, 200
except:
return "Error occured", 500
return jsonify(product.to_json()), 200


@app.route('/products', methods=['GET'])
Expand Down
27 changes: 27 additions & 0 deletions tests/test_product.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from urllib.parse import quote

import pytest

from app.models import Product
Expand Down Expand Up @@ -114,6 +116,31 @@ def test_delete_product(self, create_authenticated_headers, create_product):
assert get_resp.status_code == 404
self._verify_product_in_db("ToDelete", should_exist=False)

@pytest.mark.parametrize(
"name",
[
"Test Product With Spaces And / And @",
"Café",
"C++",
"20% off"
]
)
def test_get_product_by_name(self, create_product, name):
response = create_product(name, "desc")
assert response.status_code == 201
data = response.get_json()
p_id = data["id"]

get_resp = self.client.get("/product", query_string={"name": name})
assert get_resp.status_code == 200
prod_data = get_resp.get_json()
assert prod_data["id"] == p_id
assert prod_data["name"] == name
assert prod_data["description"] == "desc"

not_found_resp = self.client.get("/product", query_string={"name": "Non existent product"})
assert not_found_resp.status_code == 404

@pytest.mark.parametrize(
"get_headers, expected_code",
[
Expand Down