Backend: migration 007 adds a case-insensitive unique index on user names per event. join endpoint returns 409 conflict when the name is taken. find_by_event_and_name uses LOWER() for case-insensitive recovery. Frontend: join page handles 409 with a name-taken view — amber warning, name-choice tips, inline PIN recovery form, and "Anderen Namen wählen" button. Test guide updated with Steps 8 and 9. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
58 lines
3.2 KiB
Markdown
58 lines
3.2 KiB
Markdown
## Frontend Testing — Step by Step
|
|
|
|
Please test each step in order and report any errors (console errors, wrong text, broken UI, API errors).
|
|
|
|
### Step 1 — Join flow + PIN modal
|
|
1. Open **http://localhost:5173/** in your browser (or navigate there if already open)
|
|
2. You should land on the **join page** (`/join`) with a name input
|
|
3. Enter your name (e.g. `Max`) and click **Beitreten**
|
|
4. ✅ Expected: A modal appears showing your 4-digit PIN in large monospace font with a "Kopieren" button
|
|
5. Click **Weiter zur Galerie**
|
|
|
|
### Step 2 — Onboarding guide
|
|
6. You should land on the **feed page** (`/feed`)
|
|
7. ✅ Expected: A dark overlay appears at the bottom (or center on desktop) — the onboarding guide — showing step 1 of 4 with a step indicator and the Willkommen screen
|
|
8. Click **Weiter** through all 4 steps, then **Los geht's!**
|
|
9. ✅ Expected: Overlay disappears
|
|
|
|
### Step 3 — Feed & navigation
|
|
10. ✅ Expected: Feed shows "Noch keine Fotos." empty state with an upload button
|
|
11. ✅ Expected: Top-right has an **upload button** (blue) and a **person icon** link
|
|
|
|
### Step 4 — My Account page
|
|
12. Click the **person icon** in the top-right
|
|
13. ✅ Expected: `/account` page shows your name (`Max`), a blue "Gast" badge, session expiry date, and your PIN displayed large in an amber box
|
|
14. Click **Kopieren** — check clipboard contains your PIN
|
|
15. ✅ Expected: Button briefly shows "Kopiert!"
|
|
16. Click **Zur Galerie** to go back to the feed
|
|
|
|
### Step 5 — Upload
|
|
17. Click **Hochladen** — this takes you to `/upload`
|
|
18. Try uploading a photo from your device library
|
|
19. ✅ Expected: Photo appears in queue with a progress bar, then completes
|
|
20. Go back to `/feed` — ✅ Expected: your photo appears in the feed grid
|
|
|
|
### Step 6 — Onboarding guide not shown again
|
|
21. Reload the page at `/feed`
|
|
22. ✅ Expected: The onboarding overlay does **not** appear (already dismissed)
|
|
|
|
### Step 7 — Recover (open a private/incognito window)
|
|
23. Open a new **private/incognito** window at **http://localhost:5173/recover**
|
|
24. Enter the same name (`Max`) and the PIN you copied
|
|
25. ✅ Expected: You're redirected to the feed with the same account
|
|
|
|
### Step 8 — Upload rate-limit auto-retry
|
|
26. Upload more than 20 photos in one hour to trigger the rate limit
|
|
27. ✅ Expected: When the limit is hit, remaining items stay **Wartend** (not error)
|
|
28. ✅ Expected: An amber banner appears in the queue: "Upload-Limit erreicht. Wird in Xs automatisch fortgesetzt."
|
|
29. ✅ Expected: The countdown ticks down and uploads resume automatically when it reaches 0
|
|
|
|
### Step 9 — Name uniqueness (case-insensitive)
|
|
30. In a private/incognito window go to **http://localhost:5173/join**
|
|
31. Enter `max` or `MAX` — the same name already taken in Step 1 (different case)
|
|
32. ✅ Expected: Instead of creating a new account, an amber warning appears: „Max ist bereits vergeben." with name tips
|
|
33. ✅ Expected: A PIN input and **Anmelden** button appear, plus an **Anderen Namen wählen** button
|
|
34. Enter your PIN from Step 1 and click **Anmelden**
|
|
35. ✅ Expected: You're signed in to the existing `Max` account and redirected to the feed
|
|
36. Alternatively, click **Anderen Namen wählen** — ✅ Expected: the name input reappears with `max` pre-filled so you can edit it
|