2024-02-23 18:24:57 +00:00
|
|
|
from bs4 import BeautifulSoup
|
|
|
|
from flask.testing import FlaskClient
|
2024-02-23 21:15:06 +00:00
|
|
|
from tests.base_test import TestBase
|
2024-02-23 18:24:57 +00:00
|
|
|
|
2024-02-23 18:33:19 +00:00
|
|
|
|
2024-02-23 21:15:06 +00:00
|
|
|
class TestFunctionalRequirements(TestBase):
|
2024-02-23 22:07:57 +00:00
|
|
|
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")
|
|
|
|
)
|
2024-02-23 21:15:06 +00:00
|
|
|
assert response.status_code == 200
|
2024-02-23 22:07:57 +00:00
|
|
|
|
|
|
|
# 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)
|