commit 9b52b2f660839ee41699d16663b0a8ac4b913e32 Author: VolkovaV Date: Thu Oct 29 10:38:30 2026 +0400 Задание 5: модульные тесты product_calculator diff --git a/logic/__init__.py b/logic/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/logic/__pycache__/__init__.cpython-314.pyc b/logic/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000..dd7f64d Binary files /dev/null and b/logic/__pycache__/__init__.cpython-314.pyc differ diff --git a/logic/__pycache__/product_calculator.cpython-314.pyc b/logic/__pycache__/product_calculator.cpython-314.pyc new file mode 100644 index 0000000..3b207a7 Binary files /dev/null and b/logic/__pycache__/product_calculator.cpython-314.pyc differ diff --git a/logic/product_calculator.py b/logic/product_calculator.py new file mode 100644 index 0000000..0b244b2 --- /dev/null +++ b/logic/product_calculator.py @@ -0,0 +1,44 @@ +"""Расчет показателей товара для каталога.""" + +from datetime import timedelta + +DISCOUNT_PERCENT = 25 +MANY_QUANTITY_THRESHOLD = 5 + + +def calculate_discounted_price(price, order_dates, calculation_date): + """Возвращает цену товара с учетом скидки. + + Скидка 25% предоставляется, если в предыдущем календарном месяце + (относительно даты расчета) по товару не было заказов. + + :param price: цена товара в рублях + :param order_dates: список дат заказов товара (datetime.date), может быть пустым + :param calculation_date: дата расчета (datetime.date) + :return: цена с учетом скидки, округленная до копеек + """ + if price < 0: + raise ValueError("Цена не может быть отрицательной.") + + current_month_start = calculation_date.replace(day=1) + previous_month_start = (current_month_start - timedelta(days=1)).replace(day=1) + has_orders_in_previous_month = any( + previous_month_start <= order_date < current_month_start + for order_date in order_dates + ) + + if has_orders_in_previous_month: + return price + return round(price * (100 - DISCOUNT_PERCENT) / 100, 2) + + +def get_quantity_label(total_quantity): + """Возвращает «много», если пар больше пяти, иначе «мало». + + :param total_quantity: количество пар суммарно по всем размерам + """ + if total_quantity < 0: + raise ValueError("Количество не может быть отрицательным.") + if total_quantity > MANY_QUANTITY_THRESHOLD: + return "много" + return "мало" diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/__pycache__/__init__.cpython-314.pyc b/tests/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000..1a4dc5b Binary files /dev/null and b/tests/__pycache__/__init__.cpython-314.pyc differ diff --git a/tests/__pycache__/test_product_calculator.cpython-314-pytest-9.1.1.pyc b/tests/__pycache__/test_product_calculator.cpython-314-pytest-9.1.1.pyc new file mode 100644 index 0000000..128624e Binary files /dev/null and b/tests/__pycache__/test_product_calculator.cpython-314-pytest-9.1.1.pyc differ diff --git a/tests/test_product_calculator.py b/tests/test_product_calculator.py new file mode 100644 index 0000000..c861b58 --- /dev/null +++ b/tests/test_product_calculator.py @@ -0,0 +1,31 @@ +from datetime import date + +from logic.product_calculator import calculate_discounted_price, get_quantity_label + +def test_discounted_price_no_orders_in_previous_month_returns_price_with_discount(): + price = 2000 + order_dates = [] + calculation_date = date(2027, 6, 15) + + result = calculate_discounted_price(price, order_dates, calculation_date) + + assert result == 1500 + +def test_discounted_price_order_in_previous_month_returns_price_without_discount(): + price = 2000 + order_dates = [date(2027, 5, 10)] + calculation_date = date(2027, 6, 15) + + result= calculate_discounted_price(price, order_dates, calculation_date) + + assert result == 2000 + +def test_quantity_label_five_pairs_returns_few(): + result = get_quantity_label(5) + + assert result == "мало" + +def test_quantity_label_six_pairs_return_many(): + result = get_quantity_label(6) + + assert result == "много"