b78c3edb8c
Сканер кода сайта выкидывал короткие локальные номера (271-33-33, 2-828-828 и т.п.) как мусор — терялись реальные телефоны филиалов. Теперь короткий номер из tel:/schema/microdata достраивается кодом города: сперва по преобладающему коду полных номеров той же страницы, иначе по коду региона запроса; если код не определить — номер не теряется, а помечается «требует проверки» (phoneKind=uncertain). Из тела текста короткие формы не достраиваются (защита от ложных). TDD: 6 новых тестов, весь Autopodbor 40/40. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
52 lines
2.8 KiB
PHP
52 lines
2.8 KiB
PHP
<?php
|
|
|
|
use App\Services\Autopodbor\Agent\Extract\HtmlPhoneScanner;
|
|
|
|
it('берёт номера из tel:-ссылок', function () {
|
|
$html = '<a href="tel:+7 (843) 203-25-33">звонок</a><a href="tel:88432452533">2</a>';
|
|
$r = (new HtmlPhoneScanner)->scan($html);
|
|
expect($r['code'])->toHaveKey('78432032533')
|
|
->and($r['code']['78432032533'])->toContain('tel')
|
|
->and($r['code'])->toHaveKey('78432452533');
|
|
});
|
|
|
|
it('берёт номера из schema.org и microdata', function () {
|
|
$html = '<script type="application/ld+json">{"telephone":"+7(843)203-25-33"}</script>'
|
|
.'<span itemprop="telephone" content="+78432452533">x</span>';
|
|
$r = (new HtmlPhoneScanner)->scan($html);
|
|
expect($r['code']['78432032533'])->toContain('schema')
|
|
->and($r['code']['78432452533'])->toContain('microdata');
|
|
});
|
|
|
|
it('считает вхождения в тело и берёт e-mail-цифры', function () {
|
|
$html = 'тел 8(843)203-25-33, ещё 8(843)203-25-33. почта 2032533@mail.ru';
|
|
$r = (new HtmlPhoneScanner)->scan($html);
|
|
expect($r['body']['78432032533'])->toBe(2)
|
|
->and($r['emails'])->toContain('2032533');
|
|
});
|
|
|
|
it('достраивает короткий локальный номер кодом города со страницы', function () {
|
|
// на странице есть полный номер с кодом 391 (Красноярск) → код города = 391;
|
|
// короткий локальный 271-33-33 (7 цифр, без кода) НЕ выкидываем, а достраиваем до 73912713333
|
|
$html = '<a href="tel:+7 (391) 200-00-00">главный</a>'
|
|
.'<a href="tel:271-33-33">филиал</a>';
|
|
$r = (new HtmlPhoneScanner)->scan($html);
|
|
expect($r['code'])->toHaveKey('73912713333')
|
|
->and($r['code'])->toHaveKey('73912000000');
|
|
});
|
|
|
|
it('достраивает короткий номер кодом региона, когда на странице нет полного', function () {
|
|
// на странице ТОЛЬКО короткий 281-00-00, полных номеров нет → берём код города из запроса (391)
|
|
$html = '<a href="tel:281-00-00">единственный</a>';
|
|
$r = (new HtmlPhoneScanner)->scan($html, '391');
|
|
expect($r['code'])->toHaveKey('73912810000');
|
|
});
|
|
|
|
it('короткий номер без кода города НЕ теряет, а помечает «требует проверки»', function () {
|
|
// ни полных номеров на странице, ни кода региона → нельзя достроить, но и терять нельзя
|
|
$html = '<a href="tel:271-33-33">филиал</a>';
|
|
$r = (new HtmlPhoneScanner)->scan($html);
|
|
expect($r['code'])->toBeEmpty()
|
|
->and($r['uncertain'])->toContain('2713333');
|
|
});
|