test(tradein/scraper-kit): golden-parity + config-footgun proof for avito_imv (#2334) #2344

Merged
lekss361 merged 1 commit from feat/tradein-migrate-avito-imv-kit into main 2026-07-03 23:04:12 +00:00
Owner

Closes #2334 (Group E1 эпика #2277 — sub-issue #2308, core valuation).

Контекст

evaluate_via_imv не имел вообще никакого parity-покрытия в репо. Построен с нуля через
реальные live-captured фикстуры (issue #565, 2026-05, ул. Малышева 125) — legacy и kit дают
побайтово идентичный IMVEvaluation, без единого ignore_fields/tolerance. Production-код
не тронут — только новый тест-файл.

Callers avito_imv (3 найдено, ни один не тронут здесь)

  • estimator.py#2337
  • house_imv_backfill.py's process_houses_imv_batchважно: вызывается АВТОМАТИЧЕСКИ из
    scrape_pipeline.py's run_avito_city_sweep (docstring в файле устарел, говорит "manual
    only"), пишет в house_imv_evaluations, которую estimator.py читает напрямую (killer
    accuracy fix #651). Тот же риск-периметр, что сам эстиматор — добавлено в scope #2337.
  • admin.py's /scrape/avito-imv debug-эндпоинт — уже мигрирован в Group A (#2305), уже
    корректно с config=RealScraperConfig().

Config-footgun (4-й подряд случай в эпике)

Kit evaluate_via_imv читает scraper_proxy_url только если передан config=. Доказано
вручную: временно сломал фикс в scraper_kit/providers/avito/imv.py → тест упал на proxy
assert → вернул → прошёл.

Проверено

  • Новый файл: 9/9 passed
  • Полный backend suite: 3226 passed / 6 skipped / 1 pre-existing unrelated failure
    (test_search_cache_hit)
  • ruff check + format — чисто
  • Code-review: APPROVE — независимо воспроизвёл manual break/restore, подтвердил реальность
    фикстур через git log --follow, проверил всю цепочку house_imv_backfill↔estimator.py

Дальше

#2337 (финальный switch) теперь ОБЯЗАН включать house_imv_backfill.py's call site вместе с
estimator.py под тем же review-гейтом — они делят data-path.

Closes #2334 (Group E1 эпика #2277 — sub-issue #2308, core valuation). ## Контекст `evaluate_via_imv` не имел вообще никакого parity-покрытия в репо. Построен с нуля через реальные live-captured фикстуры (issue #565, 2026-05, ул. Малышева 125) — legacy и kit дают побайтово идентичный `IMVEvaluation`, без единого `ignore_fields`/`tolerance`. Production-код не тронут — только новый тест-файл. ## Callers avito_imv (3 найдено, ни один не тронут здесь) - `estimator.py` — #2337 - `house_imv_backfill.py`'s `process_houses_imv_batch` — **важно**: вызывается АВТОМАТИЧЕСКИ из `scrape_pipeline.py`'s `run_avito_city_sweep` (docstring в файле устарел, говорит "manual only"), пишет в `house_imv_evaluations`, которую `estimator.py` читает напрямую (killer accuracy fix #651). Тот же риск-периметр, что сам эстиматор — добавлено в scope #2337. - `admin.py`'s `/scrape/avito-imv` debug-эндпоинт — уже мигрирован в Group A (#2305), уже корректно с `config=RealScraperConfig()`. ## Config-footgun (4-й подряд случай в эпике) Kit `evaluate_via_imv` читает `scraper_proxy_url` только если передан `config=`. Доказано вручную: временно сломал фикс в `scraper_kit/providers/avito/imv.py` → тест упал на proxy assert → вернул → прошёл. ## Проверено - Новый файл: 9/9 passed - Полный backend suite: 3226 passed / 6 skipped / 1 pre-existing unrelated failure (`test_search_cache_hit`) - ruff check + format — чисто - Code-review: ✅ APPROVE — независимо воспроизвёл manual break/restore, подтвердил реальность фикстур через `git log --follow`, проверил всю цепочку house_imv_backfill↔estimator.py ## Дальше #2337 (финальный switch) теперь ОБЯЗАН включать `house_imv_backfill.py`'s call site вместе с `estimator.py` под тем же review-гейтом — они делят data-path.
lekss361 added 1 commit 2026-07-03 22:58:23 +00:00
test(tradein/scraper-kit): golden-parity + config-footgun proof for avito_imv (#2334)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 11s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI / changes (pull_request) Successful in 11s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 1m56s
7049717782
Group E1 of the scraper_kit migration epic (#2277 -> #2308 -> #2334): prepares the
kit side of app/services/scrapers/avito_imv.py -> scraper_kit.providers.avito.imv
WITHOUT switching any real call site (estimator.py is #2337, a separate final step;
house_imv_backfill.py is deliberately deferred too, see report).

- Golden-parity: full evaluate_via_imv() async flow (geocode A/B + evaluate C) proven
  byte-identical between legacy and kit on REAL live-captured Avito API responses
  (tests/fixtures/avito_imv_geo_position.json + avito_imv_getdata.json), routed through
  the browser_fetcher transport to stay offline/deterministic. Previously this function
  had zero parity coverage (only _parse_price was covered, via admin.py Group A).
  Added cheap pure-function parity for compute_imv_cache_key/_parse_geo_position/
  _parse_placement_history/_parse_suggestions too.
- Config-footgun regression: kit evaluate_via_imv only reads config.scraper_proxy_url
  when config= is explicitly passed; called bare it silently builds a proxy-less
  curl_cffi session even with a real proxy configured. Two tests lock this down
  (without config= -> proxies=None, with config=RealScraperConfig() -> proxies wired) —
  manually verified by breaking scraper_kit/providers/avito/imv.py's config threading,
  watching the "with config" test fail on the exact proxies assertion, then reverting.

No production import switched in this commit — see PR/issue report for the full
caller audit and the house_imv_backfill.py deferral rationale.
lekss361 merged commit aa2b33f264 into main 2026-07-03 23:04:12 +00:00
lekss361 deleted branch feat/tradein-migrate-avito-imv-kit 2026-07-03 23:04:13 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2344
No description provided.