Files
portal/app/tests/Unit/Supplier/SupplierRegionsTest.php
T
Дмитрий 1cc1fc292a style(supplier-import): pint + larastan source fixes (убраны избыточные array_values)
Pint formatting (fully_qualified_strict_types и др.) + устранены 2 источниковых
arrayValues.list (parseGibddRegions / buildPlan return — аргумент уже list).
Production-код larastan-чист; test-only TestCall/Mockery (квирк #25) — baseline
на чистом checkout при интеграции.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 10:17:10 +03:00

70 lines
3.7 KiB
PHP

<?php
declare(strict_types=1);
use App\Support\SupplierRegions;
use Tests\TestCase;
// Бутстрапим приложение — mapToSupplier() пишет Log::warning при отбросе непереводимых.
uses(TestCase::class);
// Regression: Лидерра нумерует субъекты по конституционному порядку (RussianRegions,
// Красноярский=29), поставщик crm.bp-gr.ru — по автокодам ГИБДД (Красноярский=24,
// Архангельск=29). Sync слал Лидерра-код как есть → у поставщика выбирался ЧУЖОЙ регион.
// SupplierRegions::mapToSupplier переводит Лидерра-код → код поставщика.
it('translates Liderra constitutional codes to supplier (ГИБДД) codes', function (): void {
expect(SupplierRegions::mapToSupplier([29]))->toBe([24]); // Красноярский край
expect(SupplierRegions::mapToSupplier([35]))->toBe([29]); // Архангельская обл.
expect(SupplierRegions::mapToSupplier([24]))->toBe([21]); // Чувашская Республика
expect(SupplierRegions::mapToSupplier([82]))->toBe([77]); // Москва
expect(SupplierRegions::mapToSupplier([83]))->toBe([78]); // Санкт-Петербург
});
it('returns empty for all-Russia (no regions)', function (): void {
expect(SupplierRegions::mapToSupplier([]))->toBe([]);
});
it('ignores sentinel 0 (Вся РФ)', function (): void {
expect(SupplierRegions::mapToSupplier([0]))->toBe([]);
});
it('drops regions the supplier does not offer', function (): void {
// Поставщик НЕ предлагает: Московская (56), Ленинградская (53), Крым (13), новые территории.
expect(SupplierRegions::mapToSupplier([56]))->toBe([]); // Московская обл.
expect(SupplierRegions::mapToSupplier([53]))->toBe([]); // Ленинградская обл.
expect(SupplierRegions::mapToSupplier([13]))->toBe([]); // Крым
// mixed: оставляем переводимые, отбрасываем непереводимые
expect(SupplierRegions::mapToSupplier([29, 56]))->toBe([24]); // Красноярский kept, Московская dropped
});
it('dedupes and sorts supplier codes', function (): void {
// 35→29 (Архангельск), 29→24 (Красноярский), дубль 35 → unique+sorted [24,29]
expect(SupplierRegions::mapToSupplier([35, 29, 35]))->toBe([24, 29]);
});
it('every map entry points to a distinct supplier code (no collisions)', function (): void {
$targets = array_values(SupplierRegions::LIDERRA_TO_SUPPLIER);
expect(count($targets))->toBe(count(array_unique($targets)));
});
test('mapFromSupplier inverts LIDERRA_TO_SUPPLIER bijection', function (): void {
// ГИБДД 24 → Лидерра 29 (Красноярский); ГИБДД 77 → Лидерра 82 (Москва)
expect(SupplierRegions::mapFromSupplier([24]))->toBe([29]);
expect(SupplierRegions::mapFromSupplier([77]))->toBe([82]);
});
test('mapFromSupplier maps multiple codes, sorted ascending, deduped', function (): void {
// ГИБДД 77→82 (Москва), 78→83 (СПб), 24→29 (Красноярский)
expect(SupplierRegions::mapFromSupplier([78, 24, 77, 24]))->toBe([29, 82, 83]);
});
test('mapFromSupplier drops unknown supplier codes', function (): void {
// 999 нет в карте → отброшен; 24 → 29
expect(SupplierRegions::mapFromSupplier([999, 24]))->toBe([29]);
});
test('mapFromSupplier returns [] for empty input', function (): void {
expect(SupplierRegions::mapFromSupplier([]))->toBe([]);
});