from datetime import date, timedelta from app.services.scrapers.avito import _parse_relative_date def test_days_ago(): assert _parse_relative_date("5 дней назад") == date.today() - timedelta(days=5) def test_week_ago(): assert _parse_relative_date("2 недели назад") == date.today() - timedelta(days=14) def test_hour_ago_is_today(): assert _parse_relative_date("3 часа назад") == date.today() def test_none_passthrough(): assert _parse_relative_date(None) is None assert _parse_relative_date("") is None assert _parse_relative_date("random text") is None # Keyword shortcuts — без \d+ (Avito SERP формат для свежих cards) def test_today_keyword(): assert _parse_relative_date("сегодня в 12:30") == date.today() def test_yesterday_keyword(): assert _parse_relative_date("вчера в 18:45") == date.today() - timedelta(days=1) def test_day_before_yesterday(): assert _parse_relative_date("позавчера") == date.today() - timedelta(days=2) def test_just_now(): assert _parse_relative_date("только что") == date.today() # Absolute dates — «18 мая», «5 июня в 12:30» def test_absolute_date_recent(): today = date.today() # Take a day-month combo near current (last month) — gradening для CI stability if today.month >= 2: target = date(today.year, today.month - 1, 15) else: target = date(today.year - 1, 12, 15) ru_months = { 1: "января", 2: "февраля", 3: "марта", 4: "апреля", 5: "мая", 6: "июня", 7: "июля", 8: "августа", 9: "сентября", 10: "октября", 11: "ноября", 12: "декабря", } text = f"{target.day} {ru_months[target.month]} в 12:30" assert _parse_relative_date(text) == target def test_absolute_date_future_month_rolls_back(): """Если today январь, а текст «5 декабря» — это прошлый год.""" today = date.today() if today.month == 1: # Today already January, «декабря» → previous year December result = _parse_relative_date("5 декабря") assert result == date(today.year - 1, 12, 5) else: # Skip when not January — would change semantics result = _parse_relative_date("5 января") # Either matches current year January (если уже прошло) или previous assert result is not None and result.month == 1 and result.day == 5