From 8fd0da957a823c77506661abec9b99eeac27a82b Mon Sep 17 00:00:00 2001 From: "Zimin A.N." Date: Wed, 6 May 2026 21:13:42 +0300 Subject: [PATCH] =?UTF-8?q?fix(test):=20WebhookE2ETest=20=E2=80=94=20clean?= =?UTF-8?q?up=20leftover=20state=20=D0=B2=20@BeforeEach?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI fail: ConditionTimeout 60s в recordCreate_dispatchedToWebhookReceiver. Logs показали 'Webhook sendTick: 2 due deliveries' через 1с после boot — dispatcher грузился leftover'ами из предыдущего CI run (Postgres testcontainer с withReuse=true сохраняет данные между запусками). Старые subscriptions с dead URLs ели 5s timeout каждая × N циклов до того как наш новый event дойдёт до receiver. Локально работало потому что DB была свежая. Фикс: - В @BeforeEach: deliveryRepo.deleteAllInBatch() + subRepo.deleteAllInBatch() - Order важен: deliveries first (FK на subscriptions) Локально 2/2 passed за 10.8s. Race-warnings StaleObjectStateException в логах — dispatcher держит entity в Hibernate session и пытается save после нашего deleteAll'а; assertion'ы это не задевает. --- .../nstart/terravault/ordinis/app/e2e/WebhookE2ETest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ordinis-app/src/test/java/cloud/nstart/terravault/ordinis/app/e2e/WebhookE2ETest.java b/ordinis-app/src/test/java/cloud/nstart/terravault/ordinis/app/e2e/WebhookE2ETest.java index 781e468..83c9ad5 100644 --- a/ordinis-app/src/test/java/cloud/nstart/terravault/ordinis/app/e2e/WebhookE2ETest.java +++ b/ordinis-app/src/test/java/cloud/nstart/terravault/ordinis/app/e2e/WebhookE2ETest.java @@ -90,6 +90,14 @@ class WebhookE2ETest { @BeforeEach void startReceiver() throws IOException { + // Cleanup leftover state из предыдущего CI run. + // Postgres testcontainer withReuse(true) сохраняет данные между + // запусками — старые subscriptions с dead URLs дают `findDue()` + // нагрузку (5s timeout × N = слишком долго до нашего нового event'а). + // Очищаем deliveries сначала (FK на subscriptions), потом subscriptions. + deliveryRepo.deleteAllInBatch(); + subRepo.deleteAllInBatch(); + receiver = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0); receiver.createContext("/hook", exchange -> { byte[] body = exchange.getRequestBody().readAllBytes();