133eb9d0f0
Второй пробел после фикса таймаута рендера: номера, написанные на сайте простым текстом (не кликабельные tel:/schema, без коллтрекинга), терялись. Пример Центрофинанс: 8 800 200-00-10 («Телефон:» у юр. адреса), +7 931 106-54-50 (подвал) — движок брал только tel:-ссылки. - HtmlPhoneScanner: тело сканируем БЕЗ <script>/<style> (меньше шума из конфигов) - CandidateBuilder: без трекера body-номера (не в code/visible) → kind 'text' «проверьте» - SourceAggregator + DeepStudyCollector: text-only → phone_kind 'unverified' (не теряем, но и за 100% настоящий не выдаём); code/справочник перебивают → 'real' - фронт: бейдж «⚠ на сайте — проверьте» (amber), сортировка ниже настоящих, легенда - 7 тестов (scanner/builder/aggregator/DeepStudy); вся ветка 493/493, build ок Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
64 lines
3.7 KiB
PHP
64 lines
3.7 KiB
PHP
<?php
|
|
|
|
use App\Services\Autopodbor\Agent\Extract\CandidateBuilder;
|
|
use App\Services\Autopodbor\Agent\Extract\HtmlPhoneScanner;
|
|
use App\Services\Autopodbor\Agent\Extract\SourceAggregator;
|
|
use App\Services\Autopodbor\Agent\Fetch\FetchedSite;
|
|
|
|
/**
|
|
* Второй пробел (после фикса таймаута рендера): номера, написанные на сайте ПРОСТЫМ ТЕКСТОМ
|
|
* (не кликабельные tel:, без коллтрекинга), терялись. Пример — Центрофинанс: 8 800 200-00-10
|
|
* («Телефон:» у юр. адреса), +7 931 106-54-50 (подвал). Их надо показывать клиенту с пометкой
|
|
* «на сайте — проверьте» (phoneKind unverified), аккуратно, без шума из <script>.
|
|
*/
|
|
|
|
it('scanner: не тянет в тело номера из <script>/<style> (шум конфигов)', function () {
|
|
$html = '<script>var t="8 (495) 111-22-33";</script><style>/* 8 (495) 444-55-66 */</style>'
|
|
.'<div>Телефон: 8 (495) 011-03-59</div>';
|
|
$r = (new HtmlPhoneScanner)->scan($html);
|
|
expect($r['body'])->toHaveKey('74950110359') // видимый текстовый — есть
|
|
->and($r['body'])->not->toHaveKey('74951112233') // из <script> — нет
|
|
->and($r['body'])->not->toHaveKey('74954445566'); // из <style> — нет
|
|
});
|
|
|
|
it('builder: текстовый номер (не tel:, без трекера) → кандидат kind=text «проверьте»', function () {
|
|
$site = new FetchedSite(
|
|
url: 'https://k.ru/',
|
|
rawHtml: '<a href="tel:+74950110359">кликабельный</a>'
|
|
.'<div>Телефон: 8 (800) 200-00-10</div>',
|
|
);
|
|
$byNum = collect((new CandidateBuilder)->build([$site], []))->keyBy('number');
|
|
|
|
expect($byNum['74950110359']['kind'])->toBe('code'); // из tel: — настоящий
|
|
expect($byNum)->toHaveKey('78002000010'); // текстовый НЕ потерян
|
|
expect($byNum['78002000010']['kind'])->toBe('text');
|
|
expect($byNum['78002000010']['label'])->toContain('проверьте');
|
|
});
|
|
|
|
it('builder: номер и в tel:, и в тексте — только code (без дубля text)', function () {
|
|
$site = new FetchedSite(
|
|
url: 'https://k.ru/',
|
|
rawHtml: '<a href="tel:88007003767">8 800 700-37-67</a> звоните 8 800 700-37-67',
|
|
);
|
|
$kinds = collect((new CandidateBuilder)->build([$site], []))
|
|
->where('number', '78007003767')->pluck('kind');
|
|
expect($kinds)->toContain('code')->and($kinds)->not->toContain('text');
|
|
});
|
|
|
|
it('aggregator: текстовый номер не отбрасывает, помечает phoneKind=unverified', function () {
|
|
$out = (new SourceAggregator)->aggregate([
|
|
['number' => '78002000010', 'kind' => 'text', 'label' => 'в тексте сайта — проверьте', 'url' => 'https://k.ru/', 'office' => null, 'tracker' => false],
|
|
]);
|
|
expect($out)->toHaveCount(1)
|
|
->and($out[0]->phoneKind)->toBe('unverified');
|
|
});
|
|
|
|
it('aggregator: номер и в тексте, и в коде — настоящий (code перебивает text)', function () {
|
|
$out = (new SourceAggregator)->aggregate([
|
|
['number' => '78007003767', 'kind' => 'text', 'label' => 'в тексте сайта — проверьте', 'url' => 'https://k.ru/', 'office' => null, 'tracker' => false],
|
|
['number' => '78007003767', 'kind' => 'code', 'label' => 'в коде сайта', 'url' => 'https://k.ru/', 'office' => null, 'tracker' => false],
|
|
]);
|
|
expect($out)->toHaveCount(1)
|
|
->and($out[0]->phoneKind)->toBe('real');
|
|
});
|