diff --git a/app/routes.py b/app/routes.py index 58f33c9..0858b11 100644 --- a/app/routes.py +++ b/app/routes.py @@ -881,8 +881,8 @@ def delete_product(p_id): return "Error occured", 500 -@app.route('/product/', methods=['GET']) -def get_product_by_name(name): +@app.route('/product', methods=['GET']) +def get_product_by_name(): """ Get Product by Name --- @@ -890,7 +890,7 @@ def get_product_by_name(name): - Product description: Get a product by name. parameters: - - in: path + - in: query name: name required: true type: string @@ -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']) diff --git a/tests/test_product.py b/tests/test_product.py index 905f5f1..f1502cb 100644 --- a/tests/test_product.py +++ b/tests/test_product.py @@ -114,6 +114,35 @@ 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 + + def test_get_product_by_name_missing_param_returns_400(self): + resp = self.client.get("/product") # no query param + assert resp.status_code == 400 + @pytest.mark.parametrize( "get_headers, expected_code", [