Files
PoleDanceApp/MANUAL_TESTS.md
Dianaka123 789d2bf0a6 Full app rebuild: FastAPI backend + React Native mobile with auth, championships, admin
Backend (FastAPI + SQLAlchemy + SQLite):
- JWT auth with access/refresh tokens, bcrypt password hashing
- User model with member/organizer/admin roles, auto-approve members
- Championship, Registration, ParticipantList, Notification models
- Alembic async migrations, seed data with test users
- Registration endpoint returns tokens for members, pending for organizers
- /registrations/my returns championship title/date/location via eager loading
- Admin endpoints: list users, approve/reject organizers

Mobile (React Native + Expo + TypeScript):
- Zustand auth store, Axios client with token refresh interceptor
- Role-based registration (Member vs Organizer) with contextual form labels
- Tab navigation with Ionicons, safe area headers, admin tab for admin role
- Championships list with status badges, detail screen with registration progress
- My Registrations with championship title, progress bar, and tap-to-navigate
- Admin panel with pending/all filter, approve/reject with confirmation
- Profile screen with role badge, Ionicons info rows, sign out
- Password visibility toggle (Ionicons), keyboard flow hints (returnKeyType)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 22:46:50 +03:00

160 lines
6.3 KiB
Markdown

# Manual Test Tracker — Pole Championships App
Mark each item with ✅ PASS / ❌ FAIL / ⏭ SKIP
---
## Setup
| # | Action | Expected | Result |
|---|--------|----------|--------|
| S1 | Backend running at `http://localhost:8000` | `{"status":"ok"}` at `/internal/health` | |
| S2 | Expo app loaded on phone | Login screen visible | |
| S3 | Seed data present | Run `backend/.venv/Scripts/python seed.py` — no errors | |
---
## 1. Registration (new account)
| # | Action | Expected | Result | Notes |
|---|--------|----------|--------|-------|
| 1.1 | Tap "Don't have an account? Register" | Register screen opens | | |
| 1.2 | Submit form with all fields empty | Error: "fill in all required fields" | | |
| 1.3 | Fill: Name=`Test User`, Email=`test@test.com`, Password=`Test1234` → Submit | "Application Submitted" screen shown | | |
| 1.4 | Tap "Go to Sign In" | Login screen shown | | |
| 1.5 | Try to register same email again | Error: "Email already registered" | | |
---
## 2. Login — Pending account (cannot access app)
| # | Action | Expected | Result | Notes |
|---|--------|----------|--------|-------|
| 2.1 | Login with `pending@pole.dev` / `Pending1234` | Login succeeds but stays on auth screen (status=pending) | | |
| 2.2 | Login with wrong password `pending@pole.dev` / `wrongpass` | Error: "Invalid credentials" | | |
| 2.3 | Login with non-existent email | Error: "Invalid credentials" | | |
---
## 3. Login — Approved member
| # | Action | Expected | Result | Notes |
|---|--------|----------|--------|-------|
| 3.1 | Login with `member@pole.dev` / `Member1234` | App opens, Championships tab visible | | |
| 3.2 | Championships list loads | 2 championships shown (Spring Open 2026, Summer Championship 2026) | | |
| 3.3 | Spring Open 2026 shows green OPEN badge | Green badge visible | | |
| 3.4 | Summer Championship 2026 shows grey DRAFT badge | Grey badge visible | | |
| 3.5 | Spring Open shows entry fee 50 BYN | "💰 Entry fee: 50 BYN" visible | | |
| 3.6 | Spring Open shows location | "📍 Cultural Center, Minsk" visible | | |
| 3.7 | Spring Open shows image | Banner image loads | | |
---
## 4. Championship Detail
| # | Action | Expected | Result | Notes |
|---|--------|----------|--------|-------|
| 4.1 | Tap "Spring Open 2026" | Detail screen opens | | |
| 4.2 | Detail shows title, location, date | All fields visible | | |
| 4.3 | Categories shown: Novice, Amateur, Professional | 3 purple tags visible | | |
| 4.4 | Judges section shows 2 judges | Oksana Ivanova + Marta Sokolova | | |
| 4.5 | "Open Registration Form ↗" button visible | Tapping opens link in browser | | |
| 4.6 | "Register for Championship" button visible | Button at bottom | | |
| 4.7 | Tap "Summer Championship 2026" | Detail opens, no Register button (status=draft) | | |
---
## 5. Registration Flow
| # | Action | Expected | Result | Notes |
|---|--------|----------|--------|-------|
| 5.1 | On Spring Open detail, tap "Register for Championship" | Confirmation alert appears | | |
| 5.2 | Tap Cancel in alert | Alert dismisses, no registration created | | |
| 5.3 | Tap Register → confirm | Success alert shown | | |
| 5.4 | After registering: progress steps appear | "Application submitted" step shown as green | | |
| 5.5 | "Register for Championship" button disappears | No duplicate registration possible | | |
| 5.6 | Go back, tap Spring Open again | Progress steps still visible | | |
| 5.7 | Try registering for same championship again (via API or re-tap) | Error: "Already registered" | | |
---
## 6. My Registrations Tab
| # | Action | Expected | Result | Notes |
|---|--------|----------|--------|-------|
| 6.1 | Tap "My Registrations" tab | Screen opens | | |
| 6.2 | Registration for Spring Open visible | Shows reg ID + SUBMITTED badge (yellow) | | |
| 6.3 | Pull to refresh | List refreshes | | |
| 6.4 | Login as `pending@pole.dev` | My Registrations shows empty | | |
---
## 7. Profile Tab
| # | Action | Expected | Result | Notes |
|---|--------|----------|--------|-------|
| 7.1 | Tap Profile tab | Profile screen opens | | |
| 7.2 | Shows full name, email, role=member, status=approved | All correct | | |
| 7.3 | Avatar shows first letter of name | "A" for Anna Petrova | | |
| 7.4 | Tap "Sign Out" | Confirmation alert appears | | |
| 7.5 | Confirm sign out | Redirected to Login screen | | |
| 7.6 | After logout, reopen app | Login screen shown (not auto-logged in) | | |
---
## 8. Token Persistence (session restore)
| # | Action | Expected | Result | Notes |
|---|--------|----------|--------|-------|
| 8.1 | Login as member, close Expo Go completely | — | | |
| 8.2 | Reopen Expo Go, scan QR | App opens directly on Championships (no re-login) | | |
| 8.3 | Restart backend server while logged in | App still works after backend restarts | | |
---
## 9. Admin user (via API — no admin UI yet)
| # | Action | Expected | Result | Notes |
|---|--------|----------|--------|-------|
| 9.1 | Login as `admin@pole.dev` / `Admin1234` | App opens (role=admin, status=approved) | | |
| 9.2 | Championships visible | Same list as member | | |
| 9.3 | Approve pending user via API:<br>`curl -X PATCH http://localhost:8000/api/v1/users/<user_id>/approve -H "Authorization: Bearer <token>"` | Returns `status: approved` | | |
---
## 10. Edge Cases & Error Handling
| # | Action | Expected | Result | Notes |
|---|--------|----------|--------|-------|
| 10.1 | Stop backend server, open app | Championships shows "Failed to load championships" | | |
| 10.2 | Stop backend, try login | Login shows error message (not crash) | | |
| 10.3 | Pull to refresh on Championships | Spinner appears, list reloads | | |
| 10.4 | Very slow network (throttle in phone settings) | Loading spinners show while waiting | | |
---
## Summary
| Section | Total | Pass | Fail | Skip |
|---------|-------|------|------|------|
| 1. Registration | 5 | | | |
| 2. Login — Pending | 3 | | | |
| 3. Login — Member | 7 | | | |
| 4. Championship Detail | 7 | | | |
| 5. Registration Flow | 7 | | | |
| 6. My Registrations | 4 | | | |
| 7. Profile | 6 | | | |
| 8. Session Restore | 3 | | | |
| 9. Admin | 3 | | | |
| 10. Edge Cases | 4 | | | |
| **Total** | **49** | | | |
---
## Known Limitations (not bugs)
- No admin UI — user approval done via API only
- Organizer role has no extra UI in the mobile app yet
- Push notifications not implemented
- Instagram sync not implemented (requires credentials)