"""Тесты общего seed price-brackets констант (avito/cian/yandex).""" from itertools import pairwise from app.services.scrapers.price_brackets import ( _EKB_SECONDARY, CITY_PRICE_SEED_BRACKETS, get_price_seed_brackets, ) def test_default_returns_ekb(): """get_price_seed_brackets() без аргумента возвращает EKB-сетку.""" assert get_price_seed_brackets() == _EKB_SECONDARY assert get_price_seed_brackets("ekaterinburg") == _EKB_SECONDARY def test_unknown_city_falls_back_to_ekb(): """Неизвестный город → fallback на EKB (не KeyError).""" assert get_price_seed_brackets("atlantis") == _EKB_SECONDARY def test_last_bracket_is_open(): """Последний брекет ОТКРЫТ (hi=None) — catch-all хвоста люкса без потолка.""" brackets = get_price_seed_brackets() assert brackets[-1][1] is None # Только последний брекет открыт — остальные закрыты. for lo, hi in brackets[:-1]: assert hi is not None assert hi > lo def test_brackets_are_contiguous(): """Закрытые брекеты соприкасаются: hi[i] == lo[i+1] (без дыр/перекрытий).""" brackets = get_price_seed_brackets() for (lo, hi), (next_lo, _next_hi) in pairwise(brackets): assert hi == next_lo, f"разрыв между [{lo},{hi}] и [{next_lo},...]" def test_first_bracket_starts_at_zero(): """Первый брекет стартует с 0 (вся вторичка с нижнего края).""" assert get_price_seed_brackets()[0][0] == 0 def test_city_dict_contains_ekaterinburg(): """City-dict готов под multi-city — сейчас единственный ключ ekaterinburg.""" assert "ekaterinburg" in CITY_PRICE_SEED_BRACKETS assert CITY_PRICE_SEED_BRACKETS["ekaterinburg"] is _EKB_SECONDARY