Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions apps/amm/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,9 @@ amm-tokens.json

# Screenshot artifacts written by tests/swap.mjs
tests/*.png

# Isolated wallet home used by tests/testnet/setup-amm-testnet.sh
tests/testnet/.wallet/

# Isolated token config written by tests/testnet/setup-amm-testnet.sh
tests/testnet/amm-tokens.json
5 changes: 5 additions & 0 deletions apps/amm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,11 @@ selects two tokens, enters a sell amount, submits a swap end-to-end, and then
verifies the pool reserves actually changed on-chain (read back from the
sequencer via the app's `resolvePool`).

> **For the fully isolated, script-driven test flow** (a dedicated wallet from a
> fixed mnemonic + auto-created pool + isolated token config, touching nothing in
> your local setup), see **[`apps/amm/tests/README.md`](tests/README.md)**. The
> steps below run the test against *your own* local wallet/config instead.

The test framework itself — the `test()` / `run()` / `app.*` API that the tests
import from `test-framework/framework.mjs` — comes from the
[**`logos-co/logos-qt-mcp`**](https://github.com/logos-co/logos-qt-mcp) repo.
Expand Down
76 changes: 76 additions & 0 deletions apps/amm/tests/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# AMM UI tests

UI-driven tests for the AMM app. `swap.mjs` drives the running app through the
QML inspector (framework from
[`logos-co/logos-qt-mcp`](https://github.com/logos-co/logos-qt-mcp)): it selects
two tokens, enters an amount, submits a swap, and verifies the pool reserves
changed **on-chain**.

## Isolation

Test runs never touch your personal setup. Everything test-related lives under
`apps/amm/tests/testnet/` and is git-ignored:

| Concern | Test (isolated) | Your local dev |
| --- | --- | --- |
| Wallet home | `apps/amm/tests/testnet/.wallet/` | `~/.lee/wallet/` |
| Token config | `apps/amm/tests/testnet/amm-tokens.json` | `apps/amm/amm-tokens.json` |

`testnet/setup-amm-testnet.sh` bootstraps an isolated wallet from a **fixed
mnemonic** (`test test … junk`) so the token/holding account ids are
deterministic and reproducible across machines, then deploys the programs,
creates a seeded pool, and writes the test token config.

## Full isolated run

From the **repo root**, with `wallet` / `spel` / `cargo` / `nix` on `PATH`, a
local sequencer running, and the guest binaries built (`make build-programs`):

```bash
# 0. Once: build the JS test framework (symlinked where swap.mjs expects it)
nix build .#test-framework -o apps/amm/result-mcp

# 1. Bootstrap the isolated wallet + deploy programs + create the pool.
# Writes apps/amm/tests/testnet/{.wallet, amm-tokens.json}. Nothing else is touched.
TEST_SEQUENCER_ADDR=http://127.0.0.1:3040 apps/amm/tests/testnet/setup-amm-testnet.sh

# 2. Terminal 1 — launch the UI against ONLY the isolated wallet + test tokens.
LEE_WALLET_HOME_DIR=$(pwd)/apps/amm/tests/testnet/.wallet \
AMM_PROGRAM_BIN=$(pwd)/programs/amm/methods/guest/target/riscv32im-risc0-zkvm-elf/docker/amm.bin \
TOKENS_CONFIG=$(pwd)/apps/amm/tests/testnet/amm-tokens.json \
nix run .#amm-ui

# 3. Terminal 2 — drive the swap test; watch it click through the live UI.
node apps/amm/tests/swap.mjs
```

Headless CI variant (no window, launches the app itself, pass/fail only):

```bash
nix build .#integration-test -L
```

## Notes

- **Wallet password.** The wallet's key storage is encrypted with a password —
the one you enter to **unlock** it (the UI's **Connect** modal) so the app can
sign transactions. First-time setup reads a throwaway password (the script
feeds it via stdin, so it doesn't block), then `restore-keys` rebuilds the
wallet from the test mnemonic and sets the **real** password to
`TEST_WALLET_PASSWORD` (default `test`). So **unlock the UI with `test`**.
Prefer no password? Run with `TEST_WALLET_PASSWORD=""` and unlock with an empty
password.
- **Re-bootstrap.** `FORCE_BOOTSTRAP=1 apps/amm/tests/testnet/setup-amm-testnet.sh`
re-restores the isolated `.wallet` (rewrites only that directory).
- **Overrides.** `TEST_WALLET_HOME`, `TEST_MNEMONIC`, `TEST_WALLET_PASSWORD`,
`TEST_WALLET_DEPTH`, `TEST_SEQUENCER_ADDR` — see the script header.
- **Framework location.** `swap.mjs` loads `../result-mcp` by default; override
with `LOGOS_QT_MCP=/abs/path/to/result-mcp`.
- **Artifacts.** On failure `swap.mjs` prints the `SwapCard` state and saves
`apps/amm/tests/swap-*.png` (git-ignored) for inspection.

## Files

- `swap.mjs` — the end-to-end swap UI test.
- `testnet/setup-amm-testnet.sh` — isolated testnet + wallet bootstrap.
- `qml/`, `cpp/` — the module's own QML/C++ unit tests.
Loading