Files
portal/app/tests/Feature/Autopodbor/RenderCacheWiringTest.php
T
Дмитрий 06fc4680f4 feat(autopodbor): кэш отрисованных карточек 2ГИС/Яндекс за тумблером
CachingPageFetcher — декоратор над загрузчиком карточек (SelfRenderClient/
XfetchClient): кэширует в общем Cache (Redis/file) по ключу URL на N дней ТОЛЬКО
карточки (/firm/ 2ГИС, /maps/org/ Яндекс). Поиск (/search/) и ленты — всегда мимо
кэша (свежее добывание новых фирм). Пустое не кэшируем — разовый сбой не отравит кэш.

Кэш ОБЩИЙ для шага 1 (поиск) и шага 2 (изучение+разворот) и повторных прогонов:
ключ по URL → любые экземпляры делят один кэш. Вшит в AutopodborServiceProvider
через wrapCache(); 2ГИС-база RoutingBatchFetcher и self-render card reader обёрнуты,
яндекс-Playwright/ленты — нет.

Флаг AUTOPODBOR_RENDER_CACHE (ВЫКЛ по умолчанию) + render_cache_ttl_days (5).
TDD: 8 тестов CachingPageFetcher + 4 теста проводки — зелёные. Живой замер ДСК:
тёплый прогон — 26 карточек из кэша, 0 обращений к 2ГИС/Яндексу, источников 11=11.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 10:52:14 +03:00

52 lines
2.4 KiB
PHP

<?php
declare(strict_types=1);
use App\Providers\AutopodborServiceProvider;
use App\Services\Autopodbor\Agent\CompetitorAgent;
use App\Services\Autopodbor\Agent\Fetch\CachingPageFetcher;
use App\Services\Autopodbor\Agent\Fetch\XfetchClient;
use App\Services\Autopodbor\Agent\RealCompetitorAgent;
// Проводка флага render_cache: когда ВКЛ — загрузчик карточек оборачивается CachingPageFetcher
// (общий кэш для шага 1 и шага 2), когда ВЫКЛ — фетчер отдаётся как есть (регресс). Граф собирается
// в обоих режимах без ошибок.
it('render_cache ВЫКЛ → фетчер отдаётся как есть (без обёртки)', function () {
config()->set('autopodbor.render_cache', false);
$p = new AutopodborServiceProvider(app());
$inner = new XfetchClient(apiKey: 'k');
expect($p->wrapCache($inner))->toBe($inner);
});
it('render_cache ВКЛ → фетчер обёрнут CachingPageFetcher', function () {
config()->set('autopodbor.render_cache', true);
$p = new AutopodborServiceProvider(app());
$inner = new XfetchClient(apiKey: 'k');
expect($p->wrapCache($inner))->toBeInstanceOf(CachingPageFetcher::class);
});
it('граф CompetitorAgent собирается под render_cache ВКЛ (self-render, deep+real+reverse) без ошибок', function () {
config()->set('autopodbor.render_cache', true);
config()->set('autopodbor.self_render', true);
config()->set('services.self_render', ['endpoint' => 'https://render.local/render', 'key' => 'k', 'concurrency' => 4]);
config()->set('autopodbor.deep_study', true);
config()->set('autopodbor.real_find', true);
config()->set('autopodbor.phone_reverse', true);
config()->set('autopodbor.phone_reverse_yandex', true);
expect(app()->make(CompetitorAgent::class))->toBeInstanceOf(RealCompetitorAgent::class);
});
it('граф собирается под render_cache ВКЛ в режиме xf4 (self_render ВЫКЛ) — регресс', function () {
config()->set('autopodbor.render_cache', true);
config()->set('autopodbor.self_render', false);
config()->set('autopodbor.deep_study', true);
config()->set('autopodbor.real_find', true);
config()->set('autopodbor.phone_reverse', true);
expect(app()->make(CompetitorAgent::class))->toBeInstanceOf(RealCompetitorAgent::class);
});