d4ade05446
RussianRegions::canonicalRegionName + resolveSubjectCode: take last pipe segment, expand обл.->область, alias federal cities / Удмуртская / Кузбасс. Fixes 98% unmapped phone_ranges (exact-match -> normalized). Unit-tested.
62 lines
3.2 KiB
PHP
62 lines
3.2 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
use App\Support\RussianRegions;
|
||
|
||
/**
|
||
* Нормализация регионов реестра Россвязи → subject_code.
|
||
* Кейсы взяты из реальных топ-50 unmapped-форматов прод-реестра (02.06.2026).
|
||
*/
|
||
it('maps cities of federal significance with the г. prefix', function (): void {
|
||
expect(RussianRegions::resolveSubjectCode('г. Москва'))->toBe(82)
|
||
->and(RussianRegions::resolveSubjectCode('г. Санкт-Петербург'))->toBe(83)
|
||
->and(RussianRegions::resolveSubjectCode('г. Севастополь'))->toBe(84);
|
||
});
|
||
|
||
it('still maps a plain canonical federal-city name', function (): void {
|
||
expect(RussianRegions::resolveSubjectCode('Москва'))->toBe(82);
|
||
});
|
||
|
||
it('takes the last pipe segment as the subject region', function (): void {
|
||
// регион = последний сегмент после |
|
||
expect(RussianRegions::resolveSubjectCode('г. Оренбург|Оренбургская обл.'))->toBe(62)
|
||
->and(RussianRegions::resolveSubjectCode('г. Воскресенск|р-н Воскресенский|Московская обл.'))->toBe(56);
|
||
});
|
||
|
||
it('expands the обл. abbreviation to область', function (): void {
|
||
expect(RussianRegions::resolveSubjectCode('г. Иркутск|Иркутская обл.'))->toBe(45)
|
||
->and(RussianRegions::resolveSubjectCode('г. Балашиха|Московская обл.'))->toBe(56);
|
||
});
|
||
|
||
it('keeps already-canonical край/республика segments', function (): void {
|
||
expect(RussianRegions::resolveSubjectCode('г. Красноярск|Красноярский край'))->toBe(29)
|
||
->and(RussianRegions::resolveSubjectCode('г. Уфа|Республика Башкортостан'))->toBe(3);
|
||
});
|
||
|
||
it('reorders the Удмуртская Республика inverted form', function (): void {
|
||
expect(RussianRegions::resolveSubjectCode('г. Ижевск|Республика Удмуртская'))->toBe(21);
|
||
});
|
||
|
||
it('maps the Кузбасс special form to Кемеровская область', function (): void {
|
||
expect(RussianRegions::resolveSubjectCode('г. Кемерово|Кемеровская область - Кузбасс обл.'))->toBe(48);
|
||
});
|
||
|
||
it('returns null for hopeless / ambiguous / city-only strings', function (string $raw): void {
|
||
expect(RussianRegions::resolveSubjectCode($raw))->toBeNull();
|
||
})->with([
|
||
'-',
|
||
'Российская Федерация',
|
||
'Москва и Московская область', // неоднозначно — два субъекта
|
||
'г.о. Тольятти', // нет региона в строке
|
||
'г.о. город Уфа',
|
||
'',
|
||
' ',
|
||
]);
|
||
|
||
it('exposes the canonical name via canonicalRegionName', function (): void {
|
||
expect(RussianRegions::canonicalRegionName('г. Оренбург|Оренбургская обл.'))->toBe('Оренбургская область')
|
||
->and(RussianRegions::canonicalRegionName('г. Ижевск|Республика Удмуртская'))->toBe('Удмуртская Республика')
|
||
->and(RussianRegions::canonicalRegionName('-'))->toBeNull();
|
||
});
|