import pytest from app.services.scrapers.avito import _clean_address def test_strips_css_noise(): raw = ( "ул. Токарей, 56к1Площадь 1905 года.css-39hgr0{fill:currentColor;" "height:1em;box-sizing:border-box;}.css-39hgr0:focus{outline:none;}" "от 31 мин.Геологическая.css-39hgr0{...}" ) assert _clean_address(raw) == "ул. Токарей, 56к1" def test_clean_address_passthrough(): assert _clean_address("ул. Малышева, 1") == "ул. Малышева, 1" def test_clean_handles_none(): assert _clean_address(None) is None assert _clean_address("") is None assert _clean_address(" ") is None def test_clean_strips_trailing_punctuation(): assert _clean_address("ул. Ленина, 5,") == "ул. Ленина, 5" # ── #1773: де-слип номера дома и маркера района/нас.пункта ──────────────────── @pytest.mark.parametrize( "raw,expected", [ # реальный кейс с прода ( "Свердловская обл., Екатеринбург, ул. Евгения Савкова, 29р-н Академический", "Свердловская обл., Екатеринбург, ул. Евгения Савкова, 29, р-н Академический", ), # литера дома слиплась с маркером ("ул. X, 17Ар-н Пионерский", "ул. X, 17А, р-н Пионерский"), ("ул. X, 44Бр-н Запад", "ул. X, 44Б, р-н Запад"), # корпус через дробь ("ул. X, 35/2р-н Юг", "ул. X, 35/2, р-н Юг"), # корпус через «сN» ("ул. X, 33с1р-н Центр", "ул. X, 33с1, р-н Центр"), # прочие маркеры ("ул. X, 12мкр Солнечный", "ул. X, 12, мкр Солнечный"), ("ул. X, 5район Кировский", "ул. X, 5, район Кировский"), ("ул. X, 100к2р-н Чкаловский", "ул. X, 100к2, р-н Чкаловский"), # маркеры населённых пунктов ("ул. X, 12с. Кашино", "ул. X, 12, с. Кашино"), ("ул. X, 10д. Малое", "ул. X, 10, д. Малое"), ("ул. X, 25г. Берёзовский", "ул. X, 25, г. Берёзовский"), ], ) def test_deglue_house_marker(raw, expected): assert _clean_address(raw) == expected @pytest.mark.parametrize( "raw", [ # уже расклеено — идемпотентность "ул. Евгения Савкова, 29, р-н Академический", # нормальные адреса без склейки — разделять НЕ надо "ул. Малышева, 1", "ул. Токарей, 56к1", "ул. Ленина, 5", "ул. Серова, 45", "г. Екатеринбург, ул. Ленина, 10", "снт Дружба, уч. 12", "ул. Декабристов, 16", ], ) def test_deglue_negative_no_change(raw): # для этих строк де-слип не должен ничего менять (кроме штатного strip пунктуации) assert _clean_address(raw) == raw.strip(" ,.\n\t") def test_deglue_idempotent(): once = _clean_address("ул. Евгения Савкова, 29р-н Академический") twice = _clean_address(once) assert once == twice == "ул. Евгения Савкова, 29, р-н Академический"