Files
lez-programs/apps/amm/tests
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
..

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):

  • 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):

# 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):

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.