Fixtures

Inboxes and codes

A fresh email address per run, and the verification code it receives.

Sign-up, sign-in and password reset are the first flows anyone writes, and nearly all of them send a code. An inbox gives the flow an address of its own and reads the mail that arrives.

{
  "name": "Rote: sign up",
  "app": { "bundleId": "com.example.rote" },
  "goal": "Sign up with the email in data, then enter the verification code from data when asked",
  "data": { "email": "{{ inbox.new }}", "code": "{{ inbox.code }}" },
  "expectText": ["Welcome"]
}

How it works

  • {{ inbox.new }} becomes a fresh address like run-8f2a1c3d9e@mail.testedok.dev before the run starts. It lives for two hours.
  • {{ inbox.code }} is filled in at the moment of typing: the CLI waits (up to 90 seconds) for mail to arrive at the address and types the code it carries. {{ inbox.link }} gives the mail's most likely link instead.
  • Codes are picked out on arrival: a 4–8 digit number near a word like "code" ranks first, a spaced code such as 123 456 is joined, letter-and-digit codes count, and a bare year comes last. Links that say verify, confirm or login rank above footer links.
  • Each code is read once. A resend produces a new message, and the next {{ inbox.code }} waits for it.

Mail for an address that is not a live inbox is rejected, so the sending server knows.

From a coding agent

The MCP tools create_inbox and wait_for_code do the same by hand: make an address, sign up with it, then wait for the code and type it.

Limits

Twenty live inboxes per project at once; they expire on their own. The dashboard's Fixtures page shows how many are alive.