From 2d031f6fadbd76c714e1f990fb1a70a53532c7da Mon Sep 17 00:00:00 2001 From: sneak Date: Wed, 23 Sep 2026 00:31:29 +0000 Subject: [PATCH] Wait for webhook deployments in handlers tests instead of sleeping (closes #211) TestHandleWebhookProcessesValidWebhook slept 100ms after posting a webhook, racing the background deployment that writes its log under the test's temp directory against temp directory cleanup. The test context now keeps the webhook service, and the test waits on its WaitForDeployments, as the webhook service tests already do. The other webhook handler tests never start a deployment. Model: opus-5-5 --- TODO.md | 3 +++ internal/handlers/handlers_test.go | 10 +++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/TODO.md b/TODO.md index bf456fe..1e9441d 100644 --- a/TODO.md +++ b/TODO.md @@ -20,6 +20,9 @@ regress. # Completed Steps +- 2026-09-23: Fixed the same `t.TempDir` cleanup race in `internal/handlers`: + `TestHandleWebhookProcessesValidWebhook` now waits with the webhook service's + `WaitForDeployments` instead of sleeping (#211). - 2026-09-22: Vendored the canonical prettier/format toolchain from the `sneak/prompts` scaffold: added `.prettierrc` (tabWidth 4, proseWrap always), pinned `package.json` + `yarn.lock` (prettier 3.8.1), taught diff --git a/internal/handlers/handlers_test.go b/internal/handlers/handlers_test.go index 68e116e..6aa2037 100644 --- a/internal/handlers/handlers_test.go +++ b/internal/handlers/handlers_test.go @@ -8,7 +8,6 @@ import ( "strconv" "strings" "testing" - "time" "github.com/go-chi/chi/v5" "github.com/stretchr/testify/assert" @@ -43,6 +42,7 @@ type testContext struct { authSvc *auth.Service appSvc *app.Service deploySvc *deploy.Service + webhookSvc *webhook.Service middleware *middleware.Middleware } @@ -188,6 +188,7 @@ func setupTestHandlers(t *testing.T) *testContext { authSvc: authSvc, appSvc: appSvc, deploySvc: deploySvc, + webhookSvc: webhookSvc, middleware: mw, } } @@ -1213,8 +1214,7 @@ func TestHandleWebhookProcessesValidWebhook(t *testing.T) { assert.Equal(t, http.StatusOK, recorder.Code) - // Allow async deployment goroutine to complete before test cleanup. - // The deployment will fail quickly (docker not connected) but we need - // to wait for it to finish to avoid temp directory cleanup race. - time.Sleep(100 * time.Millisecond) + // Wait for the async deployment goroutine to finish so its writes + // under the temp dir complete before test cleanup. + testCtx.webhookSvc.WaitForDeployments() }