Задание 5: модульные тесты product_calculator

This commit is contained in:
VolkovaV 2026-10-29 10:38:30 +04:00
commit 9b52b2f660
8 changed files with 75 additions and 0 deletions

0
logic/__init__.py Normal file
View File

Binary file not shown.

Binary file not shown.

View File

@ -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 "мало"

0
tests/__init__.py Normal file
View File

Binary file not shown.

View File

@ -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 == "много"