Inbox
Back to Developers & QA

Observation latency and delivery latency are different clocks

Polling vs Realtime for Email Tests: Choose a Wait Strategy, Not a Fake Delivery Guarantee

Polling and realtime events control how a test notices new mail after the receiving system has it; neither guarantees when the sender, queue, or SMTP path will deliver the message.

8 min read

Email tests often blame the wrong layer when they time out. Polling every second, listening to a realtime event, or refreshing a browser only changes how quickly the test notices a message after the inbox system knows about it. The sender may still queue the email, a provider may defer it, or the receiving pipeline may take time. Reliable tests separate 'has the message arrived?' from 'how are we observing the inbox?' and give each failure enough context to identify the layer.

Polling and realtime solve the same observation problem differently

PropertyPollingRealtime/event-driven
MechanismAsk repeatedly whether the expected message existsReact when the inbox system emits a new-message event
ComplexitySimple control flow and explicit retry intervalRequires durable connection or event subscription behavior
LoadRepeated checks even when nothing changedFewer empty checks when events are healthy
Failure modeToo-short timeout or noisy polling can hide slow deliveryDropped connection or missed event can leave the test waiting
FallbackNaturally keeps checking until deadlineOften benefits from reconciliation or polling fallback

Design the wait around a deadline and a predicate

  1. 1

    Define the message predicate

    Specify recipient, sender, subject, request window, and any other safe attributes that identify the expected email.

  2. 2

    Choose a maximum wait

    A test needs a finite deadline that reflects the environment. Infinite polling converts delivery failures into hung jobs.

  3. 3

    Observe until the predicate is satisfied

    Use polling, realtime events, or a hybrid, but keep the match logic independent from the transport used to notice updates.

  4. 4

    Fail with layer-specific diagnostics

    Report whether no message arrived, the wrong message arrived, the event channel failed, or the expected message arrived after the test deadline.

Retryable waiting is better than arbitrary sleeping

Playwright's assertions and expect.poll support bounded retries until a condition becomes true, while Cypress retry-ability similarly retries queries and assertions up to a timeout. The useful pattern is the same even when the thing being observed is external email: wait on a meaningful condition rather than sleeping for a fixed number of seconds and hoping delivery completed inside that window.

A hard-coded sleep has two bad outcomes. If delivery is fast, the suite wastes time. If delivery is slightly slower than the sleep, the test fails even though the system might have completed moments later. A predicate plus a deadline adapts to normal variation while still producing a real failure when the deadline is exceeded.

Realtime does not make SMTP realtime

An event can be emitted immediately after the receiving system stores the message, but it cannot force the sender to dispatch earlier or remove upstream mail delays. Do not market or test a realtime inbox update mechanism as proof of zero delivery latency.

A useful asynchronous email wait should have

  • A clear message predicate.
  • A finite total timeout.
  • A sensible polling interval or reconnect strategy.
  • Protection against matching messages from before the current trigger.
  • Diagnostics that distinguish observation failure from delivery failure.
  • A fallback or reconciliation path if realtime events can be missed.

Polling and realtime are observation strategies. Build the test around an expected message, a bounded deadline, and enough evidence to tell whether the failure was sender delay, inbox delivery, event transport, or matching logic.

Need a clean recipient for manual email QA?

Use MailOnce to inspect real signup, OTP, magic-link, password-reset, and notification messages without putting a personal inbox into the test fixture.

Create temporary email

Sources & further reading

Primary security and test-runner documentation used to ground the testing guidance.

Continue testing

Move to the next boundary in the same email-testing problem space.