From deb0dba45d61c66d32d2ef072afec1233ce7c4d6 Mon Sep 17 00:00:00 2001 From: Matthew Meszaros Date: Sun, 11 Oct 2026 17:18:35 +0000 Subject: [PATCH] feat: require typed classified IMAP retry evidence in the stopped mailbox replacement and automatic reoffer recovery regression --- .../app/worker/mailmanager/recovery_probe_test.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/internal/app/worker/mailmanager/recovery_probe_test.go b/internal/app/worker/mailmanager/recovery_probe_test.go index b7066b8ee..538b946a0 100644 --- a/internal/app/worker/mailmanager/recovery_probe_test.go +++ b/internal/app/worker/mailmanager/recovery_probe_test.go @@ -1,6 +1,7 @@ package mailmanager import ( + "errors" "net" "testing" "time" @@ -38,8 +39,12 @@ func TestRecoveryProbeFailedReplacementRetainsStoppedButReofferRecovers(t *testi creds.IMAP = &models.Service{Host: "127.0.0.1", Port: port, Username: "local", Password: "local", Security: models.MailSecurityNone} s.Credentials = &creds retry.SmtpImap, retry.ImapSync = &s, true - if err := m.AddWMail(t.Context(), &retry); err != errx.ErrMailServerUnreachable { - t.Fatalf("initial unavailable provider: %v", err) + loadErr := m.AddWMail(t.Context(), &retry) + var failure *errx.MailError + want := errx.ErrMailServerUnreachableAt(errx.MailConnectionStageIMAPDial, errors.New(errx.MailConnectionReasonRefused)) + if !errors.As(loadErr, &failure) || failure.Type != want.Type || failure.Code != want.Code || + failure.ResolveMethod != want.ResolveMethod || failure.Message != want.Message || !errx.IsKnownIMAPConnectionMessage(failure.Message) { + t.Fatalf("initial unavailable provider: %v", loadErr) } if m.Get(d.ID) != old || !m.Has(d.ID) || old.Ctx.Err() == nil { t.Fatal("failed replacement did not retain stopped pointer") @@ -50,7 +55,7 @@ func TestRecoveryProbeFailedReplacementRetainsStoppedButReofferRecovers(t *testi if old.SameExecution(d) || old.SameExecution(&retry) { t.Fatal("stopped pointer bypasses reload on republish") } - old.CaptureError(errx.ErrMailServerUnreachable) + old.CaptureError(failure) if events != 0 { t.Fatal("retired pointer emitted a fresh transport report") }