mirror of
https://github.com/logos-blockchain/lez-programs.git
synced 2026-08-25 06:01:11 +00:00
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.
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.mjsselects two tokens, enters an amount, submits a swap, and verifies the A/B pool reserves changed on-chain.e2e/create-pool.mjsselects 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.mjsselects 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.mjspastes 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-keysrebuilds the wallet from the test mnemonic and sets the real password toTEST_WALLET_PASSWORD(defaulttest). So unlock the UI withtest. Prefer no password? Run withTEST_WALLET_PASSWORD=""and unlock with an empty password. - Re-bootstrap.
FORCE_BOOTSTRAP=1 apps/amm/tests/testnet/setup-amm-testnet.shre-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.mjsloads../../result-mcpby default; override withLOGOS_QT_MCP=/abs/path/to/result-mcp. - Artifacts. On failure
e2e/swap.mjsprints theSwapCardstate and savesapps/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.