fcfbb1c420
Закрывает Phase 5 deferred item. Завершает webhooks v2 покрытие. WebhookE2ETest (2 tests): Test 1: success path - Стартует JDK HttpServer на random localhost port (no extra deps) - Создаёт WebhookSubscription указывающий на /hook - POST record в dictionary → outbox event - Ждёт что receiver получит POST в течение 20s - Verify body содержит business_key - Verify HMAC signature header валиден (HmacSigner.sign(secret, body) matches X-Ordinis-Signature) - Verify Ordinis headers (X-Ordinis-Event-Type, X-Ordinis-Scope=PUBLIC) - Verify DB delivery row.status = delivered + lastStatusCode = 200 Test 2: retry path - Receiver всегда 500 - POST record → outbox → dispatcher tries deliver - Verify delivery transitions to status=retrying + lastStatusCode=500 - Не ждём DLQ (1000 attempts × 1m backoff = недели) SSRF guard через ordinis.webhook.allowed-hosts=localhost,127.0.0.1 test override (production deny private CIDR остаётся включённым). Test config: - ordinis.outbox.enabled=true (для outbox poller) - ordinis.webhook.enabled=true (для dispatcher) - match-interval-ms=200, send-interval-ms=200 (faster tests) Webhooks v2 — все 5 phases закрыты.