186 lines
5.9 KiB
Markdown
186 lines
5.9 KiB
Markdown
---
|
|
title: Marketplace E2E Smoke Runner
|
|
tags: [testing, smoke, e2e, notifications, performance]
|
|
created: 2026-06-06
|
|
---
|
|
|
|
# Marketplace E2E Smoke Runner
|
|
|
|
The backend repo has a committed marketplace runner:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```text
|
|
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:
|
|
|
|
```bash
|
|
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:
|
|
|
|
1. 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.
|
|
2. `POST /api/marketplace/payments` returned HTTP 500 after offer selection
|
|
with generated test actors. This blocks `PAYMENT_MODE=record`; use
|
|
`PAYMENT_MODE=status` for flow-only smoke or `PAYMENT_MODE=live` for scanner
|
|
verification.
|
|
3. Dev API rate limiting is `100` requests per `900s`; concurrency runs must
|
|
use a fresh window or a non-rate-limited test environment.
|
|
|
|
## Reference Direct-Backend Run - 2026-06-06
|
|
|
|
Command shape:
|
|
|
|
```bash
|
|
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.
|