mirror of
https://github.com/logos-blockchain/lez-programs.git
synced 2026-08-25 14:11:09 +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.
101 lines
5.0 KiB
Markdown
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.
|