звонок2';
$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 = ''
.'x';
$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 = 'главный'
.'филиал';
$r = (new HtmlPhoneScanner)->scan($html);
expect($r['code'])->toHaveKey('73912713333')
->and($r['code'])->toHaveKey('73912000000');
});
it('достраивает короткий номер кодом региона, когда на странице нет полного', function () {
// на странице ТОЛЬКО короткий 281-00-00, полных номеров нет → берём код города из запроса (391)
$html = 'единственный';
$r = (new HtmlPhoneScanner)->scan($html, '391');
expect($r['code'])->toHaveKey('73912810000');
});
it('достройка не привязана к региону: работает для любого кода города', function () {
// Москва (495): код города берётся со страницы, никакой привязки к Красноярску
$msk = (new HtmlPhoneScanner)->scan(
'офисфилиал'
);
expect($msk['code'])->toHaveKey('74957712233');
// Санкт-Петербург (812): тот же механизм, другой код
$spb = (new HtmlPhoneScanner)->scan(
'офисфилиал'
);
expect($spb['code'])->toHaveKey('78126405566');
// запасной код региона из запроса — тоже любой (Екатеринбург 343)
$ekb = (new HtmlPhoneScanner)->scan('единственный', '343');
expect($ekb['code'])->toHaveKey('73433556677');
});
it('НЕ слепляет фальшивку из обрезка полного номера (страна+код)', function () {
// Сайт делит номер на 2 tel:-ссылки: «+7 (391) 271» (обрезок) и «271-33-33» (локальная часть).
// Обрезок 7391271 начинается с 7+391 → это кусок полного номера, достраивать его НЕЛЬЗЯ.
// Локальную часть 271-33-33 достраиваем кодом 391 со страницы.
$html = 'главный'
.'обрезок'
.'локальная часть';
$r = (new HtmlPhoneScanner)->scan($html);
expect($r['code'])->toHaveKey('73912713333') // локальная часть достроена верно
->and($r['code'])->toHaveKey('73912000000') // полный
->and($r['code'])->not->toHaveKey('73917391271') // фальшивка из обрезка НЕ появилась
->and($r['uncertain'])->not->toContain('7391271'); // и в «требует проверки» обрезок не лезет
});
it('короткий номер без кода города НЕ теряет, а помечает «требует проверки»', function () {
// ни полных номеров на странице, ни кода региона → нельзя достроить, но и терять нельзя
$html = 'филиал';
$r = (new HtmlPhoneScanner)->scan($html);
expect($r['code'])->toBeEmpty()
->and($r['uncertain'])->toContain('2713333');
});