All checks were successful
Deploy / changes (push) Successful in 9s
Deploy Trade-In / changes (push) Successful in 13s
Deploy / build-frontend (push) Has been skipped
Deploy / deploy-caddy (push) Has been skipped
Deploy Trade-In / build-frontend (push) Has been skipped
Deploy Trade-In / build-browser (push) Has been skipped
Deploy / build-backend (push) Successful in 2m23s
Deploy Trade-In / test (push) Successful in 3m56s
Deploy / build-worker (push) Successful in 4m16s
Deploy Trade-In / build-backend (push) Successful in 1m19s
Deploy / deploy (push) Successful in 1m49s
Deploy / deploy-status (push) Successful in 1s
Deploy / perimeter-smoke (push) Successful in 12s
Deploy Trade-In / deploy (push) Successful in 2m25s
Deploy Trade-In / deploy-status (push) Successful in 1s
Deploy Trade-In / perimeter-smoke (push) Successful in 11s
83 lines
5.4 KiB
Python
83 lines
5.4 KiB
Python
"""Тип постановления определяется по первому упоминанию, а не по порядку проверок (#2464).
|
||
|
||
`_detect_kind` проверял «резервир» ПЕРВЫМ и возвращал «резервирование» безусловно.
|
||
Постановление об изъятии, где резервирование упомянуто вскользь — типовая
|
||
формулировка «ранее зарезервированных земель», ссылка на утративший силу акт, —
|
||
переклассифицировало **весь документ**: `kind` в `extract_reservations` один на
|
||
все участки, поэтому ошибка размножается на каждую строку `land_reservation`.
|
||
|
||
Побеждает то слово, что встретилось раньше. Тема документа стоит в заголовке,
|
||
поэтому позиция — сигнал сильнее порядка проверок, и он симметричен: заголовок
|
||
«О резервировании» так же выигрывает у «изъятия» в теле.
|
||
|
||
Формулировки взяты с прода: `basis_act` в `land_reservation` (источник
|
||
`izyatie_ekb_ocr`, 27 строк, все «изъятие») начинается со слов «Сообщение о
|
||
планируемом изъятии земельных участков…».
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from app.services.scrapers.page_reservation_parser import (
|
||
_detect_kind,
|
||
extract_reservations,
|
||
)
|
||
|
||
# Заголовок — с прода, дословно.
|
||
_ЗАГОЛОВОК_ИЗЪЯТИЕ = (
|
||
"Сообщение о планируемом изъятии земельных участков и объектов недвижимого "
|
||
"имущества для муниципальных нужд в целях строительства улицы Энергостроителей"
|
||
)
|
||
|
||
|
||
def test_izyatie_in_title_wins_over_later_rezervirovanie() -> None:
|
||
"""Головной: упоминание резервирования в теле не переписывает тему заголовка.
|
||
|
||
На origin/main возвращается «резервирование» — неверное значение, а не отказ.
|
||
"""
|
||
text = (
|
||
f"{_ЗАГОЛОВОК_ИЗЪЯТИЕ}. Изъятию подлежат участки, ранее зарезервированные "
|
||
"постановлением о резервировании земель от 12.03.2019."
|
||
)
|
||
assert _detect_kind(text, "изъятие") == "изъятие", (
|
||
"документ об изъятии классифицирован по случайному упоминанию в теле"
|
||
)
|
||
|
||
|
||
def test_all_parcels_of_the_document_are_affected() -> None:
|
||
"""Ошибка типа размножается на КАЖДЫЙ участок — kind в документе один на всех."""
|
||
text = (
|
||
f"{_ЗАГОЛОВОК_ИЗЪЯТИЕ}. Изъять земельные участки с кадастровыми номерами "
|
||
"66:41:0303004:22, 66:41:0303004:23, 66:41:0206032:8499, ранее "
|
||
"зарезервированные постановлением о резервировании земель."
|
||
)
|
||
records = extract_reservations(text, default_kind="изъятие")
|
||
assert len(records) == 3, f"разобрано участков: {len(records)}"
|
||
kinds = {r.reservation_kind for r in records}
|
||
assert kinds == {"изъятие"}, f"типы участков: {kinds} — ошибка ушла бы во все строки"
|
||
|
||
|
||
def test_rezervirovanie_in_title_still_wins() -> None:
|
||
"""Контроль симметрии: заголовок о резервировании выигрывает у изъятия в теле.
|
||
|
||
Ловит «починку» через простую смену порядка проверок — она сломала бы этот случай.
|
||
"""
|
||
text = (
|
||
"Постановление о резервировании земель для муниципальных нужд. "
|
||
"Зарезервированные участки не подлежат изъятию до истечения срока."
|
||
)
|
||
assert _detect_kind(text, "изъятие") == "резервирование"
|
||
|
||
|
||
def test_single_keyword_documents_unchanged() -> None:
|
||
"""Контроль: документы с одним словом-маркером распознаются как раньше."""
|
||
assert _detect_kind("Об изъятии земельного участка", "резервирование") == "изъятие"
|
||
assert _detect_kind("О резервировании земель", "изъятие") == "резервирование"
|
||
|
||
|
||
def test_no_keyword_falls_back_to_default() -> None:
|
||
"""Контроль: без маркеров остаётся default_kind, а не выдуманный тип."""
|
||
assert _detect_kind("Об утверждении схемы расположения участка", "изъятие") == "изъятие"
|
||
assert (
|
||
_detect_kind("Об утверждении схемы расположения участка", "резервирование")
|
||
== "резервирование"
|
||
)
|