TabanTalayeNafis Test UI not authenticated Base URL:
Register anonymous
201 = created, 400 = validation (age < 18 etc.), 409 = duplicate phone.
Login (2-step MFA) anonymous
Step 1 returns LoginTicketId; OTP is sent by FakeSmsSender → read it from the server console.
Wrong ticket/OTP → 400/401. Success stores AccessToken + RefreshToken (localStorage).
Tokens (editable — for invalid/expired-token tests)
Current session (JWT required)
Refresh / Logout Reuse of an already-rotated refresh token revokes the whole chain → repeat this twice with the same token to see it.
Step-up MFA (JWT required)
OTP again on server console.
KYC (JWT required)
Level3 (register-only) users must pass Level2 before trading/depositing.

Submit Level2 (multipart)
Missing/wrong-format file → 400. ≤5MB, jpg/png/pdf.

Submit Level1 (requires Level2 approved)

Legal entity (requires Level1-approved representative)

Document upload
Wallet (JWT required)
Admin variants (GET /api/wallet/{userId}[/history]) are on the Admin tab — a normal user gets 403 there.
Trade buy/sell (JWT + KYC≥Level2 + Idempotency-Key)
Empty key → 400. Level3 user → 403. Same key twice → idempotent replay.
User gets own invoice only; other user's → 403/404.
Deposits (JWT + KYC≥Level2 + Idempotency-Key)
Deposit status: initiate returns DepositId + redirectUrl; the browser must open redirectUrl at ZarinPal (use /deposit.html for the real end-to-end payment).
Deposit lifecycle (real ZarinPal gateway — sandbox or prod per server config)
The gateway is real ZarinPal now — there is no fake/simulated provider. Verify outcome depends on the actual sandbox payment. A Status=OK replay for an authority that was never paid returns verify error -55 → final Failed.
Full success path: run the payment in the browser via /deposit.html → pay in sandbox → auto verify → wallet credit. NOK → verify is never called (status stays CallbackReceived). Unresolved gateway → stays Verifying → admin retry-verify.
Dashboard Admin/SuperAdmin
Users Admin/SuperAdmin

Freeze / Unfreeze

SuperAdmin-only SuperAdmin
Admin (non-super) calling this → 403.
Audit logs Admin/SuperAdmin
Deposits admin Admin/SuperAdmin
Trade offset Admin/SuperAdmin
Negative value → 400. Public history visible on Public tab.
KYC review Admin/SuperAdmin
Pricing config (backend has no [Authorize] on this controller — verify!)
Provider rankings (priority/failover)
ProviderKeyPriorityEnabled
Priority = عدد کوچک‌تر اول امتحان می‌شود (1 بالاترین). Provider ذخیره‌نشده = disabled. اعتبارسنجی بک‌اند: keys تکراری/لیست خالی → 400؛ کلید ناشناخته → در کنسول سرور Warning و skip.
Public (no auth)
These work unauthenticated — quick liveness check.
Callback (browser return from gateway — no JWT)
Unknown authority → 404. OK triggers server-side verify against the real gateway (from dev host it is IP-whitelisted; plain browser navigation is exempt anywhere).
Authorization matrix quick-tests
Run these while logged-in as the indicated role, or with cleared tokens, to check 401/403 behavior. Results appear in the panel below.
Runs: me (no token → 401 if cleared), admin/dashboard as normal user → 403, admin/users as normal user → 403, trade without idem-key → 400, trade as Level3 → 403, wallet/{otherUserId} as normal user → 403.

      
Call log (newest first — click a row to re-show its result)
Ready. All calls hit the real backend.