Files
portal/app/tests/Feature/Supplier/SupplierPortalClientMultiFlagTest.php
T
Дмитрий a0e18a1dd8 fix(supplier): matching по content в saveProjectMultiFlag — реальный портал возвращает name=B1_X
Реальный портал отдаёт rt-projects-load с name='B1_<id>' / 'B2_<id>' / 'B3_<id>'
и чистым идентификатором в поле 'content'. Старое matching по name === uniqueKey
никогда не совпадало с реальным ответом → idMap пустой → SyncSupplierProjectJob
молча выходил, ничего не записав в БД, а на портале оставались orphan-группы.

Объясняет ранее задокументированное в ЭТАЛОН «проект 5 вылечен вручную —
усыновлены 3 портальные записи». Заказчик обходил тот же баг руками.

Фикс — matching по content с fallback на name, чтобы мок-тесты с упрощённым
форматом (без content) продолжали работать; реалистичная фикстура добавлена
в SupplierPortalClientMultiFlagTest.

Verified:
- Pest supplier suite (SyncSupplierProjectJob/SyncSupplierProjectsJob/multi-flag): 16/16 passed
- E2E live на crm.bp-gr.ru: ProjectService::create + sync → supplier_projects записаны
  с ext_id, pivot заполнен, портал имеет 3 группы B1/B2/B3
- Multi-tenant ночной батч с computeOrder проверен на 79991177889 (T1+T2+T3+T4
  на одном identifier — формула max(max, ceil(Σ/3)) сходится с фактом)
2026-05-20 18:42:20 +03:00

31 lines
1.4 KiB
PHP

<?php
declare(strict_types=1);
use App\Services\Supplier\Dto\SupplierProjectDto;
use App\Services\Supplier\SupplierPortalClient;
use Illuminate\Support\Facades\Http;
it('multi-flag save returns external_id per platform via listProjects', function (): void {
Http::fake([
'*/admin/visit/rt-project-save' => Http::response(['status' => 'OK', 'id' => '300'], 200),
// Real portal returns name='B1_<identifier>' with the identifier in 'content'.
'*/admin/visit/rt-projects-load*' => Http::response(['projects' => [
['id' => '100', 'name' => 'B1_okna.ru', 'content' => 'okna.ru', 'tag' => 'Москва', 'src' => 'rt'],
['id' => '200', 'name' => 'B2_okna.ru', 'content' => 'okna.ru', 'tag' => 'Москва', 'src' => 'bl'],
['id' => '300', 'name' => 'B3_okna.ru', 'content' => 'okna.ru', 'tag' => 'Москва', 'src' => 'mt'],
['id' => '999', 'name' => 'B1_other.ru', 'content' => 'other.ru', 'tag' => 'Москва', 'src' => 'rt'],
]], 200),
]);
$dto = new SupplierProjectDto(
platform: 'B1', signalType: 'site', uniqueKey: 'okna.ru', limit: 9,
workdays: [1, 2, 3, 4, 5, 6, 7], regions: [82], regionsReverse: false, status: 'active',
tag: 'Москва', platforms: ['B1', 'B2', 'B3'],
);
$ids = app(SupplierPortalClient::class)->saveProjectMultiFlag($dto);
expect($ids)->toBe(['B1' => 100, 'B2' => 200, 'B3' => 300]);
});