from bs4 import BeautifulSoup from flask.testing import FlaskClient from tests.base_test import TestBase class TestFunctionalRequirements(TestBase): def test_product_filters(self, test_client: FlaskClient): base_url = '/products/Car Part?filter={{FILTER}}' # Make get request for all products in car parts response = test_client.get( base_url.replace("{{FILTER}}", "Price: High -> Low") ) assert response.status_code == 200 # Extract first and last product first, last = self.get_first_and_last_product(response.data) # Get Prices of each first_cost = float(self.get_tag_value( str(first), "product-price").replace('£', '') ) last_cost = float(self.get_tag_value( str(last), "product-price").replace('£', '') ) # Check filter is working assert first_cost >= last_cost # ============================================= # Test the reverse of the previous filter # Get html data response = test_client.get( base_url.replace("{{FILTER}}", "Price: Low -> High") ) assert response.status_code == 200 # Extract first and last product first, last = self.get_first_and_last_product(response.data) # Get Prices of each first_cost = float(self.get_tag_value( str(first), "product-price").replace('£', '') ) last_cost = float(self.get_tag_value( str(last), "product-price").replace('£', '') ) # Check filter is working assert first_cost <= last_cost def get_tag_value(self, html: str, class_name: str) -> str: """ Returns the value of a given tag in a html element """ soup = BeautifulSoup(html, features='html.parser') return str(soup.find("div", {'class': class_name}).contents[0]) def get_first_and_last_product(self, html: str) -> (str, str): """ Returns the first and last product on the page """ soup = BeautifulSoup(html, features='html.parser') products = soup.findAll("a", {"class": "product"}) assert len(products) > 0 first = products[0] last = products[-1] return (first, last)