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>
6.3 KiB
6.3 KiB
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: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)