Skip to content

UC-2 Student views passport and progress

Primary actor Student
Priority Must
Satisfies FR-C2, FR-C3, FR-C4, FR-C5, FR-C6
Precondition The student is signed in and enrolled.
Trigger The student opens the passport.

Main success scenario

  1. The app requests the passport for the active challenge.
  2. The system derives each week's status from its own date window and the student's check-ins: locked, available, missed, or complete.
  3. The app renders the themed week tiles, the progress countdown ("3 of 7 complete"), and the prize-eligibility indicator, and saves a snapshot for offline viewing.

Extensions

  • 1a. Offline. The last saved snapshot renders with an offline banner. With no snapshot, the app says so instead of showing an empty passport.
  • 2a. A week's window has closed unattempted. It shows as missed and stays completable; no later week is gated on it.
  • 2b. Task groups. A week that says "complete N of these M" counts completions within the group.
  • Installed app. The PWA is installable; a new release activates predictably and never leaves the installed app dead-ended.

Acceptance criteria (Gherkin)

Feature file Test module
missed_weeks_stay_open.feature test_missed_weeks_stay_open_bdd.py
installed_app_exits.feature test_installed_app_exits_bdd.py
app_update_activation.feature test_app_update_activation_bdd.py
pwa_browser_coverage.feature test_pwa_browser_coverage_bdd.py (browser tier)
self_hosted_fonts.feature test_self_hosted_fonts_bdd.py
student_desktop_week_grid.feature test_student_desktop_week_grid_bdd.py (browser tier)
student_navigation_rail.feature and frontend/student_navigation_rail.feature test_student_navigation_rail_bdd.py
top_app_bar_home.feature and frontend/top_app_bar_home.feature test_top_app_bar_home_bdd.py
frontend/desktop_icon_components.feature Vitest (see the scenario's Proven by lines)

Plain pytest: test_passport.py, test_prize_eligibility.py, test_task_groups.py, test_campus_clock.py. Frontend: Passport.test.tsx, useAppUpdate.test.tsx.

Views

Code: backend/app/services/passport.py, backend/app/services/eligibility.py, frontend/src/components/Passport/, frontend/src/offline/, frontend/src/pwa/.