Skip to Content
Living documentation — last reviewed 2026-05-28
FeaturesProgress PhotosProgress Photos — QA Plan

Progress Photos — QA Plan

1. Upload

#ScenarioExpected
1.1Member uploads a portrait JPEG, ~3MB201; row inserted; thumbnail generated; presigned URL returns image
1.2Member uploads a HEICIf sharp handles HEIC (depends on build), 201; otherwise 500 — verify behavior
1.3Member uploads a PDF400 — Progress photo must be an image
1.4Upload arrives without prior staged-PUT404 from uploads.lookupStaged
1.5Same uploadId posted twiceSecond fails (already consumed)
1.6Corrupt image bytessharp throws; 500; staged upload remains for janitor

2. List

#ScenarioExpected
2.1Member lists own with no paramsNewest 50 returned; hasMore correct
2.2Cursor paginationPage 2 starts strictly older than page 1’s last createdAt
2.3from/to date filterHonors range
2.4Soft-deleted rowExcluded
2.5Presigned URLs workOpen in browser, image loads

3. Staff access

#ScenarioExpected
3.1Coach views member’s photos200; same list shape
3.2Coach from another org tries404 (member not in org)
3.3Coach lacking staff role (e.g. only member)403

4. Delete

#ScenarioExpected
4.1Member deletes own200; deleted_at set
4.2Member tries to delete another member’s photo403
4.3Staff tries DELETE /members/me/... against a member’s photo403 (route is self-scoped; staff has no delete-on-behalf path today)

5. RTL UI

#ScenarioExpected
5.1Member views gallery in heTimeline reads right-to-left; date labels in Hebrew
5.2Notes contain HebrewRenders correctly

6. Privacy

#ScenarioExpected
6.1Photo URL leaked to a third partyURL expires in 1h; subsequent fetch returns 403 from R2
6.2EXIF with GPSKnown gap: GPS coordinates persist in the binary in R2. Document for follow-up

7. Smoke

  • Upload from phone → coach sees in member detail.
  • Thumbnail loads faster than the original (CDN cache OK).
  • Delete then re-list excludes the row.