|
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 9s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 3m0s
CI / backend-tests (pull_request) Successful in 17m31s
Обе функции ходят через один браузерный контекст, под один и тот же WAF.
`get_json` держит до пяти попыток с экспоненциальным backoff на 429/5xx/0,
а `download_binary` не имел ретраев вовсе: один 429 ронял загрузку
картинки насовсем, и вызывающий (`download_plan_image`, `download_photos`)
писал в лог «не удалось» — неотличимо от «файла нет».
Правильный образец лежал в этом же классе, двадцатью строками выше.
Непереходные коды (403, 404) поднимаются сразу, без ожидания: повтор их
не изменит, а лишний стук под WAF вредит. Разбор статуса вынесен ЗА
семафор — sleep не должен держать слот.
Двусторонне: против origin/main транзиентные тесты красные с конкретным
значением («вместо байтов получили RuntimeError('binary http 429…');
попыток=1»), ни одного ImportError/TypeError.
Контроли зелёные с обеих сторон: 403 и 404 не повторяются, исчерпание
попыток даёт честную ошибку, а не пустые байты, успех с первой попытки не
порождает лишних запросов.
Отдельный контроль на паузы: без него «ретраит» и «долбит без пауз»
неотличимы в тесте, а под WAF разница между ними решающая — проверяется,
что задержки растут как 1, 2 секунды.
pytest backend/tests/services/scrapers/ — 340 passed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| __init__.py | ||
| test_2464_act_date_citation.py | ||
| test_2464_catalog_batch_commits.py | ||
| test_2464_catalog_skipped_counter.py | ||
| test_2464_catalog_waf_breaker.py | ||
| test_2464_detect_kind_position.py | ||
| test_2464_download_binary_retry.py | ||
| test_2464_status_negation.py | ||
| test_domrf_catalog_browsersession_throttle.py | ||
| test_domrf_catalog_object.py | ||
| test_domrf_catalog_object_browsersession_throttle.py | ||
| test_domrf_catalog_parse.py | ||
| test_domrf_flat_plan_url.py | ||
| test_domrf_kn_isolation.py | ||
| test_domrf_kn_normalize.py | ||
| test_domrf_kn_upsert_sql.py | ||
| test_ekb_krt_registry.py | ||
| test_ekb_ppt_tep_parser.py | ||
| test_flat_plan_download.py | ||
| test_gisogd_so_client.py | ||
| test_izyatie_ocr.py | ||
| test_okn_egrkn_client.py | ||
| test_page_reservation_parser.py | ||
| test_stealth_throttle_proxy.py | ||