Files
lez-programs/apps/amm/tests/README.md
T
Ricardo Guilherme Schmidt 8c3e6fccfe feat(wallet): humanize shared wallet experience
Consolidate wallet account decoding and portfolio handling around the shared Rust IDL decoder. Simplify AMM wallet integration, remove obsolete caches and network plumbing, and cover account selection and live flows.
2026-08-21 17:38:45 -03:00

101 lines
5.0 KiB
Markdown

# AMM UI tests
UI-driven tests for the AMM app, driving the running app through the QML
inspector (framework from
[`logos-co/logos-qt-mcp`](https://github.com/logos-co/logos-qt-mcp)):
- `e2e/swap.mjs` selects two tokens, enters an amount, submits a swap, and verifies
the **A/B** pool reserves changed **on-chain**.
- `e2e/create-pool.mjs` selects the **A/C** pair (which the setup script leaves
unseeded — only A/B is created), submits a pool creation, and verifies the A/C
pool now exists **on-chain**.
- `e2e/add-liquidity.mjs` selects the seeded **A/B** pair, asserts the CTA stays
disabled until deposit amounts are entered, submits an add, and verifies the
A/B pool reserves grew **on-chain**.
- `e2e/custom-token.mjs` pastes token **D**'s id (created on-chain by the setup but
deliberately **absent** from the token config) into a Liquidity token slot and
verifies the app resolves it, selects it, and **persists** it to the custom-token
store — the "add an unlisted token by id" path. No pool / submit involved.
## 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.
# CUSTOM_TOKEN_CONFIG (where the app persists tokens added by id) defaults to the
# per-user store; set it to an isolated path so custom-token.mjs controls the store
# (it clears this file before + after running). Required for custom-token.mjs to
# avoid touching your real custom-token store.
LEE_WALLET_HOME_DIR=$(pwd)/apps/amm/tests/testnet/.wallet \
AMM_PROGRAM_BIN=$(pwd)/target/guest/amm.bin \
TOKENS_CONFIG=$(pwd)/apps/amm/tests/testnet/amm-tokens.json \
CUSTOM_TOKEN_CONFIG=$(pwd)/apps/amm/tests/testnet/custom-tokens.json \
nix run .#amm-ui
# 3. Terminal 2 — drive a test; watch it click through the live UI.
node apps/amm/tests/e2e/swap.mjs # swap against the seeded A/B pool
node apps/amm/tests/e2e/create-pool.mjs # create the (unseeded) A/C pool
node apps/amm/tests/e2e/add-liquidity.mjs # add liquidity to the seeded A/B pool
node apps/amm/tests/e2e/custom-token.mjs # add token D (unlisted) by id
```
Hermetic headless smoke test (no wallet or sequencer required):
```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.** `e2e/swap.mjs` loads `../../result-mcp` by default; override
with `LOGOS_QT_MCP=/abs/path/to/result-mcp`.
- **Artifacts.** On failure `e2e/swap.mjs` prints the `SwapCard` state and saves
`apps/amm/tests/e2e/swap-*.png` (git-ignored) for inspection.
## Files
- `ui-smoke.mjs` — the hermetic headless UI integration test.
- `e2e/swap.mjs` — the end-to-end swap UI test (A/B pool).
- `e2e/create-pool.mjs` — the end-to-end create-pool UI test (creates the A/C pool).
- `e2e/add-liquidity.mjs` — the end-to-end add-liquidity UI test (adds to the A/B pool).
- `e2e/custom-token.mjs` — the custom-token persistence test.
- `testnet/setup-amm-testnet.sh` — isolated testnet + wallet bootstrap (TKA/TKB/TKC,
seeds the A/B pool only).
- `qml/`, `cpp/` — the module's own QML/C++ unit tests.