test: дозакрытие последних 5 — advisory-lock наблюдение, cap-3, webhook фаза-3, supplier-client URL
Accessibility (Pa11y live) / a11y (push) Has been cancelled

Набор полностью зелёный (55 to 0; 1713 pass + 4 skip). Всё тест-сторона:
- AuditChainRaceConditionTest: advisory-lock в audit_chain_hash РЕАЛЬНО присутствует
  (миграция 2026_05_30 применяется) — падало наблюдение: bind-параметр в SQL-сдвиге
  (? >> 32) не сдвигал → classid не совпадал. Декомпозицию ключа считаем в PHP.
  NB: db/schema.sql хранит функцию БЕЗ блокировки (минорный дрейф канона; прод через
  миграцию защищён) — стоит перегенерить schema.sql отдельно.
- SupplierConnectionTest WARN#2: matchEligibleProjects ограничен cap=LeadDistributor::CAP=3;
  ждать 3 из 6 видимых тенантов (кросс-tenant видимость под BYPASSRLS; при RLS было бы 0).
- SupplierWebhookTest + ValidationFormatTest: фаза 3 намеренно приняла проект без
  B-префикса как DIRECT (не теряем заявки) — тесты под новый контракт (202 / 422 по vid).
- SupplierPortalClientTest: fake-паттерн под старый URL /admin/rt-projects-load; клиент
  зовёт /admin/visit/rt-projects-load — обновлён паттерн.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-06-25 08:46:43 +03:00
parent 88ace4e3d9
commit a49916b7fc
5 changed files with 34 additions and 18 deletions
@@ -28,8 +28,10 @@ it('returns 422 JSON when supplier posts invalid payload WITHOUT Accept: applica
[], // files
['HTTP_CONTENT_TYPE' => 'application/x-www-form-urlencoded'], // server: НЕТ Accept JSON
http_build_query([
'vid' => 1,
'project' => 'invalid_no_b_prefix',
// Фаза 3 сняла валидацию формата project (non-B → DIRECT), поэтому
// для проверки JSON-рендера 422 используем всё ещё обязательное поле:
// пропускаем vid → гарантированный 422.
'project' => 'B1_test.ru',
'phone' => '79991234567',
'time' => time(),
])
@@ -37,18 +39,18 @@ it('returns 422 JSON when supplier posts invalid payload WITHOUT Accept: applica
$response->assertStatus(422);
expect($response->headers->get('Content-Type'))->toContain('application/json');
$response->assertJsonStructure(['message', 'errors' => ['project']]);
$response->assertJsonStructure(['message', 'errors' => ['vid']]);
});
it('still works correctly for postJson clients (regression)', function () {
$response = $this->postJson('/api/webhook/supplier/test-secret-32chars-aaaaaaaaaaaaaa', [
'vid' => 1,
'project' => 'invalid_no_b_prefix',
// vid пропущен намеренно → 422 (project-формат больше не валидируется, фаза 3).
'project' => 'B1_test.ru',
'phone' => '79991234567',
'time' => time(),
]);
$response->assertStatus(422)->assertJsonValidationErrors('project');
$response->assertStatus(422)->assertJsonValidationErrors('vid');
});
it('non-webhook routes still use default render (no JSON forced)', function () {