verification
use it
# add to stunt.yaml
services:
sqs:
adapter: embedded:sqs-style
# then
$ stunt upThe embedded: source extracts this adapter from the binary — no git clone, fully offline.
how to mock the Amazon SQS API locally
Install stunt, paste the service block above into stunt.yaml, run stunt up — then point your client at localhost instead of Amazon SQS API. It works offline, keeps state across requests and restarts, and every response is synthetic: the route shapes, status codes, pagination, and webhook delivery follow the real Amazon SQS API 2012-11-05 surface — the data is fake, the behavior is real.
backing stores
queuesmessages
api surface (2)
generated from the adapter manifest — exactly what boots, nothing more
2 routes
POST/
POST/{queueName}
SDK-verified behaviors (6)
- ✓CreateQueue/GetQueueUrl via real SigV4
- ✓SendMessage/ReceiveMessage with ms-precision system attributes
- ✓visibility timeout: in-flight hidden, expiry redelivers
- ✓DeleteMessage consumes the redelivered message
- ✓SendMessageBatch correlated results
- ✓missing-queue typed error surface
VM-verified behaviors (20)
- ✓signed calls pass on both transports with the real MD5
- ✓missing and garbage auth are 403
- ✓tampered signatures and wrong or unknown keys are 403
- ✓a stale x-amz-date is RequestTimeTooSkewed; a fresh signature passes
- ✓a delayed send is not receivable until the delay lapses
- ✓MaxNumberOfMessages bounds are enforced
- ✓receive hides the message until the timeout lapses, counted NotVisible
- ✓redelivery mints a fresh receipt handle and bumps the receive count
- ✓ChangeMessageVisibility extends the in-flight window
- ✓delete removes the message; stale handles are ReceiptHandleIsInvalid
- ✓one bad entry fails alone; the rest of the batch still sends
- ✓delivered entries round-trip their message attributes
- ✓oversize and duplicate-id batches are rejected
- ✓purge empties the queue immediately over the queue-URL transport
- ✓a second purge inside 60s is 403, then works again after the window
- ✓create, GetQueueUrl, and prefix-filtered ListQueues round-trip
- ✓identical re-create is idempotent; conflicting attributes are QueueAlreadyExists
- ✓SetQueueAttributes persists; unknown names are InvalidAttributeName
- ✓DeleteQueue tears the queue down for its messages too
- ✓the throttled profile alternates empty receives deterministically
Not implemented (4)
- No ListQueues MaxResults/NextToken paging; no AttributeNames prefix wildcards (.*)
- No AddPermission/RemovePermission, Tag/Untag/ListQueueTags, or ListDeadLetterSourceQueues
- No presigned URL (query-parameter) auth; SigV4 Authorization header only
- FIFO queues allowed by name only; no MessageGroupId or deduplication semantics
Differs from the real API (5)
- QueueUrl omits the 12-digit account id; http://<host>/<queueName> instead of the AWS path
- No long polling: WaitTimeSeconds is validated but never blocks; receive returns at once
- MD5OfMessageAttributes omitted (compound encoding not reproduced), only body MD5
- PurgeQueue is immediate, not async; the one-purge-per-60s rule is still enforced
- Message ids and receipt handles are synthetic deterministic strings, not real AWS ids
want more of the Amazon SQS API surface? adapters are YAML + Starlark — the authoring guide covers adding routes, fixtures, and state machines. Open an issue for anything big first, or just file a PR — merged routes ship in the next release.