5.9 KiB
title, tags, created
| title | tags | created | |||||
|---|---|---|---|---|---|---|---|
| Marketplace E2E Smoke Runner |
|
2026-06-06 |
Marketplace E2E Smoke Runner
The backend repo has a committed marketplace runner:
backend/scripts/smoke/marketplace-e2e-notifications.sh
It creates isolated test actors, runs buyer/seller marketplace flows, checks
persisted notifications after every business mutation, and writes JSON/Markdown
reports under ignored backend/tmp/e2e-reports/.
Required Environment
Do not put secrets in command history or docs. Load these from an ignored local env file or a secure shell session:
| Variable | Purpose |
|---|---|
BASE_URL |
Target API, for example https://dev.amn.gg. Defaults to local http://127.0.0.1:5001. |
ADMIN_EMAIL |
Admin account email used only to create test users. |
ADMIN_PASSWORD |
Admin account password, never committed or printed. |
PAYMENT_MODE |
status, record, or live. Defaults to status. |
CONCURRENCY_LEVELS |
Comma-separated worker ramp, for example 1,2,4,8. |
ROUNDS |
Rounds per worker. Use 2 for the basic two-round requirement. |
SELLERS_PER_WORKER |
Sellers per flow. Minimum enforced by runner is 2; default is 3. |
SKIP_WRONG_RECIPIENT_CHECK |
Optional escape hatch for rate-limited environments. Defaults to false. |
Payment Modes
| Mode | Use | Notes |
|---|---|---|
status |
Cheap full-flow smoke without wallet funds. | Moves the request to payment through the status route, then exercises seller delivery and buyer confirmation. |
record |
Tests legacy POST /api/marketplace/payments. |
Current dev run shows this route returns HTTP 500 with generated buyer/seller ids. Keep this mode for regression coverage. |
live |
Tests BSC Testnet tUSDT direct-balance scanner rail. | Requires E2E_PAYMENT_PRIVATE_KEY or E2E_PAYMENT_MNEMONIC, gas, and tUSDT. Sends ERC-20 transfer and calls direct-balance check. |
Live mode also reads:
| Variable | Default |
|---|---|
E2E_NETWORK |
bsc-testnet |
E2E_CHAIN_ID |
97 |
E2E_TOKEN_SYMBOL |
USDT |
RPC_URL_CHAIN_97 / BSC_TESTNET_RPC_URL |
public BSC Testnet RPC fallback |
Example Commands
Two-round full-flow smoke without wallet funds:
BASE_URL=https://dev.amn.gg \
PAYMENT_MODE=status \
CONCURRENCY_LEVELS=1 \
ROUNDS=2 \
bash scripts/smoke/marketplace-e2e-notifications.sh
Concurrency profile starting at one worker:
BASE_URL=https://dev.amn.gg \
PAYMENT_MODE=status \
CONCURRENCY_LEVELS=1,2,4,8,16,32 \
ROUNDS=1 \
bash scripts/smoke/marketplace-e2e-notifications.sh
Live BSC Testnet tUSDT smoke:
BASE_URL=https://dev.amn.gg \
PAYMENT_MODE=live \
CONCURRENCY_LEVELS=1 \
ROUNDS=1 \
bash scripts/smoke/marketplace-e2e-notifications.sh
Notification Behavior
The runner treats each state-changing business step as a notification checkpoint. Each checkpoint records:
- actor and role;
- expected related id;
- whether a persisted notification was found;
- whether the missing notification is a known gap;
- unread count from the notification list response.
By default, known gaps do not abort the flow. Set STRICT_NOTIFICATIONS=true
to make known gaps fail the run. Set ABORT_ON_NOTIFICATION_FAILURE=true to
stop at the first missing notification.
Output
Reports are ignored by Git:
backend/tmp/e2e-reports/marketplace-e2e-<runId>.json
backend/tmp/e2e-reports/marketplace-e2e-<runId>.md
The report includes:
- flow pass/fail counts;
- notification found/missing/known-gap counts;
- wrong-recipient notification count;
- API p50/p95/p99/max timings;
- request, offer, payment, token, and transaction ids where applicable.
Actor tokens and admin credentials are never written to the report.
Reference Dev Run - 2026-06-06
Command shape:
BASE_URL=https://dev.amn.gg PAYMENT_MODE=record CONCURRENCY_LEVELS=1 ROUNDS=2 ...
Result:
| Metric | Value |
|---|---|
| flows passed | 0/2 |
| request-created notifications found | 8/8 |
| buyer new-offer notifications found | 6/6 |
| rejected-seller notifications found | 4/4 |
| selected-seller accepted notifications by related id | 0/2 |
| wrong-recipient notifications | 0 |
| legacy marketplace payment records | 0/2, HTTP 500 |
Observed defects:
- Selected-seller accepted notification is not discoverable by the selected
offer
relatedId. The service path appears to create the accepted-offer notification with an incomplete related id. POST /api/marketplace/paymentsreturned HTTP 500 after offer selection with generated test actors. This blocksPAYMENT_MODE=record; usePAYMENT_MODE=statusfor flow-only smoke orPAYMENT_MODE=livefor scanner verification.- Dev API rate limiting is
100requests per900s; concurrency runs must use a fresh window or a non-rate-limited test environment.
Reference Direct-Backend Run - 2026-06-06
Command shape:
BASE_URL=http://127.0.0.1:15001 PAYMENT_MODE=status CONCURRENCY_LEVELS=1 ROUNDS=1 ...
This used a temporary SSH tunnel to the dev backend container to avoid the public edge rate-limit window.
Result:
| Metric | Value |
|---|---|
| flows passed | 1/1 |
| final request status | delivered |
| wrong-recipient notifications | 0 |
| required notification missing | 1 |
| known notification gaps | 2 |
Key ids:
| Field | Value |
|---|---|
| purchaseRequestId | dc6ec076-9c15-46a1-ab6b-1d9d17604614 |
| selectedOfferId | 9f56dd00-8b08-4c9f-b91c-5875e1949113 |
Observed notification result:
- request-created notifications passed for buyer and three targeted sellers;
- buyer new-offer notifications passed for all three seller bids;
- rejected-seller notifications passed;
- selected-seller accepted notification still failed by selected offer
relatedId; - payment-confirmed notification was found in
PAYMENT_MODE=status; - seller delivery and buyer delivery confirmation notifications are known gaps.