1cc1fc292a
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>
70 lines
3.7 KiB
PHP
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([]);
|
|
});
|