# Test in the sandbox

The [sandbox](https://docs.catena.com/sandbox.md) lets you make each payment outcome happen once, on test
money (test USDC on Base Sepolia), so you can check that your agent reads each
one correctly before it handles real money.

The sandbox **Default Policy** lets an agent send test funds to the **Catena**
counterparty with no spending rules, which means every funded payment to Catena
will complete. To produce the other outcomes, an admin adds rules to that
[policy](https://docs.catena.com/policies.md). Changes to sandbox policies do not impact your production
account's policies.

## Tests

Below are the tests you can run in the sandbox, and what your agent will see for
each one. To change your agent's policy, open **Policies** in the console, open
the policy, and choose **Edit**. Spending rules are under **Payments**, and the
counterparties an agent can pay are under **Counterparties**. When you're done,
choose **Save policy**.

| Test                                                                                                                                                                                                                                            | Agent sees (`status` / `resolution`)                                                                          | Outcome                  |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------ |
| Ask your agent to send $1.00 to Catena under the Default Policy.                                                                                                                                                                                | `processing`, then `completed` / `completed`                                                                  | Completed                |
| Set your agent's policy to require approval at $2.00, then ask your agent to send $2.50.                                                                                                                                                        | `pending` / `null`, and `reasons` names the rule                                                              | Waiting for approval     |
| While a payment waits for approval, approve it under **Approvals** in the console.                                                                                                                                                              | `processing`, then `completed` / `completed`                                                                  | Approved                 |
| While a payment waits for approval, deny it under **Approvals** in the console.                                                                                                                                                                 | `blocked` / `denied`                                                                                          | Denied                   |
| Set your agent's policy to block payments over $3.00, then ask your agent to send $4.00.                                                                                                                                                        | `blocked` / `blocked`, and `reasons` names the rule and the amount                                            | Blocked by a rule        |
| Ask your agent to note Catena's rail ID. Then remove Catena from **Who agents can pay** in your agent's policy, and ask your agent to send $1.00 to that rail.                                                                                  | `blocked` / `blocked`, and `reasons` says the counterparty is not approved                                    | Counterparty not allowed |
| Ask your agent to send more than the account's available balance.                                                                                                                                                                               | No intent. The CLI exits 1 with `movement_insufficient_funds`.                                                | Not enough funds         |
| While a payment waits for approval, ask your agent to cancel it.                                                                                                                                                                                | `blocked` / `cancelled`                                                                                       | Cancelled                |
| Leave a payment waiting for approval for 24 hours.                                                                                                                                                                                              | `failed` / `expired`                                                                                          | Expired                  |
| Set **Temporary grant requests** to **Require approval** in your agent's policy. After a send is blocked, ask your agent to request a higher limit for all accounts, approve the request under **Approvals**, and ask your agent to send again. | The request is `pending`, then `completed`, and the second send goes through                                  | Temporary grant          |
| Set **New counterparties** to **Require approval** in your agent's policy. Ask your agent to add a wallet counterparty on Base Sepolia with an address you control, then approve it under **Approvals**.                                        | `pending`, then `completed`. The agent can pay the counterparty once you add it under **Who agents can pay**. | New counterparty         |
| Ask your agent to send $1.00 twice with the same idempotency key.                                                                                                                                                                               | The same intent both times, with `replayed: true`, and no second payment                                      | Retry with the same key  |

We cover what each status means, and how to poll, in
[Intents and retries](https://docs.catena.com/intents.md).

## Related

- [Sandbox](https://docs.catena.com/sandbox.md): A separate organization that runs on test money, where you can connect an agent, write a policy, and test payments before you move real money.
- [Intents and retries](https://docs.catena.com/intents.md): Learn how an intent moves through its statuses and resolutions, which fields explain its result, and how to retry safely with idempotency keys.
- [Handle approvals](https://docs.catena.com/approvals.md): Learn what goes to the approvals queue, who can approve, when requests expire, and what happens between an approval and a completed payment.
- [Raise a limit for one task](https://docs.catena.com/recipes/raise-a-limit.md): When a single limit blocks a task, your agent can ask an admin to raise it for a while, and then finish the task once the admin approves.
