perf(tradein-tests): убираем реальные паузы из 5 медленных тестов #3500
5 changed files with 30 additions and 6 deletions
|
|
@ -65,7 +65,9 @@ async def test_backfill_browser_fetcher_gets_proxy_pool_wiring(
|
||||||
db.execute.return_value.mappings.return_value.all.return_value = [
|
db.execute.return_value.mappings.return_value.all.return_value = [
|
||||||
{"id": 1, "address": "ЕКБ, ул. X, 1", "full_address": None, "lat": 56.8, "lon": 60.6}
|
{"id": 1, "address": "ЕКБ, ул. X, 1", "full_address": None, "lat": 56.8, "lon": 60.6}
|
||||||
]
|
]
|
||||||
await hib.backfill_house_imv(db, batch_size=1)
|
# request_delay_sec=0: мок дублирует строку в retry+fresh (2 записи вместо 1) — реальный
|
||||||
|
# анти-бот sleep(5с) между ними тут не нужен.
|
||||||
|
await hib.backfill_house_imv(db, batch_size=1, request_delay_sec=0)
|
||||||
|
|
||||||
captured = _CapturingFetcher.captured
|
captured = _CapturingFetcher.captured
|
||||||
assert captured["source"] == "avito"
|
assert captured["source"] == "avito"
|
||||||
|
|
|
||||||
|
|
@ -101,6 +101,12 @@ async def _run(pending: list[dict], *, force: bool = False, resolved: str | None
|
||||||
),
|
),
|
||||||
patch.object(mod, "_sleep_with_jitter", AsyncMock(return_value=None)),
|
patch.object(mod, "_sleep_with_jitter", AsyncMock(return_value=None)),
|
||||||
patch("app.services.scraper_adapters.RealScraperConfig", MagicMock()),
|
patch("app.services.scraper_adapters.RealScraperConfig", MagicMock()),
|
||||||
|
# Удачный резолв доходит до fetch_jk — без мока это реальный BrowserFetcher/прокси-пул
|
||||||
|
# (26с на живом прогоне); тесту нужен только факт «маркер не выставлен», не сам fetch.
|
||||||
|
patch(
|
||||||
|
"scraper_kit.providers.yandex.newbuilding.YandexNewbuildingScraper.fetch_jk",
|
||||||
|
AsyncMock(return_value=None),
|
||||||
|
),
|
||||||
):
|
):
|
||||||
await mod.enrich_yandex_newbuilding_sweep(
|
await mod.enrich_yandex_newbuilding_sweep(
|
||||||
db, city="ekaterinburg", limit=5, force=force, request_delay_sec=0
|
db, city="ekaterinburg", limit=5, force=force, request_delay_sec=0
|
||||||
|
|
|
||||||
|
|
@ -129,7 +129,11 @@ def _capture(method: str, **kw: object) -> list[str]:
|
||||||
|
|
||||||
def test_anchor_sweep_uses_secondary_slug_by_default() -> None:
|
def test_anchor_sweep_uses_secondary_slug_by_default() -> None:
|
||||||
"""fetch_around по умолчанию — путь вторички, geoCoords/radius сохранены в query."""
|
"""fetch_around по умолчанию — путь вторички, geoCoords/radius сохранены в query."""
|
||||||
urls = _capture("fetch_around", lat=56.84, lon=60.6, radius_m=1000, pages=1)
|
# delay_override_sec=0: сеть подменена, anti-ban sleep(5с*jitter) после единственной
|
||||||
|
# страницы тут не защищает ничего реального.
|
||||||
|
urls = _capture(
|
||||||
|
"fetch_around", lat=56.84, lon=60.6, radius_m=1000, pages=1, delay_override_sec=0
|
||||||
|
)
|
||||||
assert urls, "fetch_around не сделал запроса"
|
assert urls, "fetch_around не сделал запроса"
|
||||||
u = urlparse(urls[0])
|
u = urlparse(urls[0])
|
||||||
assert u.path == f"/ekaterinburg/kvartiry/prodam/{SECONDARY_SLUG}", u.path
|
assert u.path == f"/ekaterinburg/kvartiry/prodam/{SECONDARY_SLUG}", u.path
|
||||||
|
|
@ -139,8 +143,15 @@ def test_anchor_sweep_uses_secondary_slug_by_default() -> None:
|
||||||
|
|
||||||
def test_anchor_sweep_secondary_only_false_keeps_general_path() -> None:
|
def test_anchor_sweep_secondary_only_false_keeps_general_path() -> None:
|
||||||
"""Контроль: secondary_only=False — прежняя общая выдача."""
|
"""Контроль: secondary_only=False — прежняя общая выдача."""
|
||||||
|
# delay_override_sec=0: тот же anti-ban trailing sleep, что и в тесте выше.
|
||||||
urls = _capture(
|
urls = _capture(
|
||||||
"fetch_around", lat=56.84, lon=60.6, radius_m=1000, pages=1, secondary_only=False
|
"fetch_around",
|
||||||
|
lat=56.84,
|
||||||
|
lon=60.6,
|
||||||
|
radius_m=1000,
|
||||||
|
pages=1,
|
||||||
|
secondary_only=False,
|
||||||
|
delay_override_sec=0,
|
||||||
)
|
)
|
||||||
assert urlparse(urls[0]).path == "/ekaterinburg/kvartiry/prodam-ASgBAgICAUSSA8YQ"
|
assert urlparse(urls[0]).path == "/ekaterinburg/kvartiry/prodam-ASgBAgICAUSSA8YQ"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,9 @@ async def test_backfill_flag_on_constructs_browser_and_threads_it(
|
||||||
monkeypatch.setattr(house_imv_backfill, "_process_one_house", _fake_process)
|
monkeypatch.setattr(house_imv_backfill, "_process_one_house", _fake_process)
|
||||||
|
|
||||||
db = _fake_db_with_one_row()
|
db = _fake_db_with_one_row()
|
||||||
await house_imv_backfill.backfill_house_imv(db, batch_size=10)
|
# request_delay_sec=0: мок дублирует строку в retry+fresh (2 записи вместо 1) — реальный
|
||||||
|
# анти-бот sleep(5с) между ними тут не нужен.
|
||||||
|
await house_imv_backfill.backfill_house_imv(db, batch_size=10, request_delay_sec=0)
|
||||||
|
|
||||||
# Ровно один BrowserFetcher(source="avito"), вошли в контекст.
|
# Ровно один BrowserFetcher(source="avito"), вошли в контекст.
|
||||||
assert len(_FakeBrowserFetcher.instances) == 1
|
assert len(_FakeBrowserFetcher.instances) == 1
|
||||||
|
|
@ -91,7 +93,8 @@ async def test_backfill_flag_off_no_browser_and_none_threaded(
|
||||||
monkeypatch.setattr(house_imv_backfill, "_process_one_house", _fake_process)
|
monkeypatch.setattr(house_imv_backfill, "_process_one_house", _fake_process)
|
||||||
|
|
||||||
db = _fake_db_with_one_row()
|
db = _fake_db_with_one_row()
|
||||||
await house_imv_backfill.backfill_house_imv(db, batch_size=10)
|
# request_delay_sec=0: та же дублирующая мок-строка retry+fresh, что и в тесте выше.
|
||||||
|
await house_imv_backfill.backfill_house_imv(db, batch_size=10, request_delay_sec=0)
|
||||||
|
|
||||||
# Флаг OFF → BrowserFetcher не конструируется, browser_fetcher=None.
|
# Флаг OFF → BrowserFetcher не конструируется, browser_fetcher=None.
|
||||||
assert _FakeBrowserFetcher.instances == []
|
assert _FakeBrowserFetcher.instances == []
|
||||||
|
|
|
||||||
|
|
@ -186,7 +186,9 @@ async def test_house_imv_backfill_browser_fetcher_uses_settings_endpoint() -> No
|
||||||
db.execute.return_value.mappings.return_value.all.return_value = [
|
db.execute.return_value.mappings.return_value.all.return_value = [
|
||||||
{"id": 1, "address": "ЕКБ, ул. X, 1", "full_address": None, "lat": 56.8, "lon": 60.6}
|
{"id": 1, "address": "ЕКБ, ул. X, 1", "full_address": None, "lat": 56.8, "lon": 60.6}
|
||||||
]
|
]
|
||||||
await house_imv_backfill.backfill_house_imv(db, batch_size=1)
|
# request_delay_sec=0: мок дублирует строку в retry+fresh (2 записи вместо 1) —
|
||||||
|
# реальный анти-бот sleep(5с) между ними тут не нужен.
|
||||||
|
await house_imv_backfill.backfill_house_imv(db, batch_size=1, request_delay_sec=0)
|
||||||
|
|
||||||
# #2698: к endpoint= добавилась проводка пула — без неё сайдкар брал env-прокси
|
# #2698: к endpoint= добавилась проводка пула — без неё сайдкар брал env-прокси
|
||||||
# (узел с affinity='domclick'), и домовая оценка падала 34 дня подряд.
|
# (узел с affinity='domclick'), и домовая оценка падала 34 дня подряд.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue