Skip to main content

Tracking app — system tests (TRK-ST-*)

Human-driven protocol for @enode/tracking, executed on a real device (iOS or Android Capacitor build) against backdev. Environment, accounts, and run recording: system test plan. Requirements covered: tracking-app.md + shared.md.

Work top to bottom; sections marked (hardware) need SmartBar sensors. Record Result (✅ / ❌ / ⚠️ / ⛔) and Notes in a copy of the run template (docs/testing/test-runs/_template.md). Case IDs are TRK-ST-<section>.<case> and are stable — append, never renumber.

Preconditions for the whole run: Pro coach account on backdev with today's scheduled workout, ≥1 template, ≥2 athletes; a One account; 2 charged SmartBar sensors; device with camera permission available.

1. Auth & app entry

#Use caseCoversStepsExpected resultResultNotes
1.1Pro sign-inSHR-AUTH-01, TRK-AUTH-01Fresh install/cleared storage → sign in with the Pro coach accountLogin transition plays; lands on /workouts/today with today's schedule[automate]
1.2One user blockedTRK-AUTH-02Sign in with the One accountBlocked with a message pointing to the One app (backend 314); no session created
1.3RegistrationSHR-AUTH-03Register a fresh account; try an invalid email/short password on the wayValidation errors shown on the step; valid input completes and signs in
1.4Cold-start redirectSHR-AUTH-02Kill the app while signed in; relaunchNo login screen; straight to /workouts/today[automate]
1.5Sign outSHR-AUTH-05Sign out from the profile/settings drawerReturns to login; relaunch shows login (token cleared)

2. Today's schedule

#Use caseCoversStepsExpected resultResultNotes
2.1Week's workouts listedTRK-SCHED-01Open the today paneToday's scheduled + recurring workouts for the current week appear with correct names[automate]
2.2Pull-to-refreshTRK-SCHED-02Create a new scheduled workout for today in the portal, then pull to refreshThe new workout appears without app restart
2.3Empty stateTRK-SCHED-03Use an account/day with no workoutsExplicit empty state (no blank screen, no error)
2.4Load failure retryTRK-SCHED-03, SHR-ERR-04Load the pane with connectivity off, then restore and tap "Try again"Failure shows the try-again state; retry recovers to the list

3. Stations & recording slots

#Use caseCoversStepsExpected resultResultNotes
3.1Multi-station layoutTRK-STATION-01On a tablet, open 3 stations; on a phone observe layoutTablet: up to 3 columns side by side; phone: exactly 1 full-viewport station
3.2Open/close stationsTRK-STATION-02Open stations from the rail/spine; close one; shrink so open stations no longer fitStations open/close cleanly; the "close hidden stations" confirm appears when they don't fit
3.3Recording-slot licensingTRK-STATION-03Open more stations than the device session's recording weight allows; try to record in an over-limit stationOver-limit station shows the "request another slot" overlay instead of recording
3.4Athlete pinned to one stationTRK-STATION-04Sign in as an athlete-role userOnly a single station is available

4. Starting & editing workouts

#Use caseCoversStepsExpected resultResultNotes
4.1Start scheduled workoutTRK-WORKOUT-01FAB → start today's scheduled workout in a stationPrep drawer shows its exercises/participants; starting mounts the live session in that station[automate]
4.2Create workout from scratchTRK-WORKOUT-01FAB → new workout → add 2 exercises + 1 participant → startSession starts with exactly those exercises/participants
4.3Start from templateTRK-WORKOUT-01FAB → template picker → pick the test template → startSession matches the template's exercises
4.4Pre-start editingTRK-WORKOUT-02Before starting: edit participants, tags, notes; build a superset; reorder exercisesAll edits reflected in the prep drawer and carried into the started session
4.5Feedback-only trainingTRK-WORKOUT-03FAB → feedback (sensor-only) trainingSensor-only session starts without a workout plan
4.6Retrospective logTRK-WORKOUT-04FAB → log past workout → pick a source workout → fill sets → saveFilled sets upload; the session appears in history as a past workout
4.7Blocked athlete can't recordTRK-WORKOUT-05Add a blocked athlete + an active one to a workout; start it; complete a set for the active athlete; finishPicker warns "No data will be recorded" but still allows the pick; the blocked athlete's chip is badged; they are absent from the athlete switcher; the upload carries only the active athlete's sessionneeds a blocked athlete on backdev
4.8All-blocked workout can't startTRK-WORKOUT-05Build a workout whose only participant(s) are blockedStart is disabled with "No data can be recorded for these athletes."needs a blocked athlete on backdev
4.9Archived athlete hidden from a workoutSHR-ARCH-01, SHR-ARCH-02Schedule a workout for 2 athletes in the portal; archive one; reopen the workout in tracking and start itThe archived athlete is absent from the participant chips and the athlete switcher; the picker doesn't offer them; finishing uploads no session for them. The other athlete is unaffectedneeds an athlete archived after scheduling

5. Sensors & live tracking (hardware)

Precondition: 2 charged SmartBar sensors; Bluetooth on.

#Use caseCoversStepsExpected resultResultNotes
5.1Single-sensor pairingTRK-LIVE-01In a live session, open the connect-sensor sheet; connect 1 sensorSensor pairs; connection state visible on the station
5.2Dual-sensor + placementTRK-LIVE-01Connect a 2nd sensor to the same stationBoth pair; the sensor-placement prompt guides positioning
5.3Live rep detectionTRK-LIVE-02Perform a set of ~5 controlled reps with the sensor on a barReps appear live (pending-rep overlay/flash); final count matches performed reps
5.4Focus metric & rest timerTRK-LIVE-03Complete a set; observe between-set UIConfigured focus metric shown for the set; rest timer counts toward the rest target
5.5Video captureTRK-VIDEO-01Record a clip via the camera overlay during a setClip records and attaches to the set; no crash on permission grant
5.6Video reviewTRK-VIDEO-02Open the recorded clipPlayer opens; scrubbing works

6. Set completion & in-session tools

#Use caseCoversStepsExpected resultResultNotes
6.1Complete-set sheetTRK-LIVE-04After a set, open the complete-set sheet; adjust reps and load; saveDetected values pre-filled; edits persist to the set list
6.2Edit 1RMTRK-LIVE-05Edit a participant's 1RM in-session; repeat on a bodyweight exerciseNew 1RM applies to load recommendations; bodyweight handled (no absurd values)
6.3Reorder setsTRK-LIVE-06Drag a set to a new position via the move-set drawerNew order persists
6.4RecommendationsTRK-LIVE-07Trigger conditions for a switch/rest-stop recommendation (e.g. degrading velocity across sets)Recommendation card appears; accepting it applies the changeflag SWITCH_RECOMMENDATIONS
6.5Spoken rep feedbackTRK-LIVE-08Enable rep voice; perform repsReps spoken via TTS, matching the on-screen feedbackflag-gated
6.6Muscle-quality viewTRK-LIVE-09Open the muscle-quality body view mid-sessionBody view renders with plausible per-muscle tinting; no crash
6.7Technique feedback modeTRK-LIVE-10Set the feedback mode to Technique on a barbell exercise; record a set with the camera overlay open, then one without it; repeat on a flywheel exerciseSagittal + frontal bar path render side by side over their body backdrops; the focus-metric values are fully readable (not vertically clipped) in both layouts; the flywheel exercise shows metrics/velocity only, with no empty trajectory gridLayout preview without a sensor: /debug/recording

7. Insights & finishing

#Use caseCoversStepsExpected resultResultNotes
7.1Overview tabTRK-INSIGHT-01Open the insights sheet after ≥2 completed setsSession summary reflects completed sets
7.2Performance tabTRK-INSIGHT-02Open the Performance tabPer-metric/per-rep charts render for the session's sets
7.3Technique tabTRK-INSIGHT-03Open the Technique tab after a sensor setOrientation/velocity traces render; force vectors per flag stateflag FORCE_VECTORS
7.4Finish → set reviewTRK-FINISH-01Finish the trainingSet-review overlay lists all sets for confirmation
7.5Results persistedTRK-FINISH-02Confirm the review; then check portal historySession appears in the portal history with matching sets[automate] (assertion half)
7.6Technique follows the latest setTRK-INSIGHT-05Record ≥2 sensor sets, open the Technique tab, then record another setThe tab opens on the newest set (not set 1) and switches to each newly recorded set as it arrivesAlso check the tablet split view (trackingDetailMode), where the tab stays mounted
7.7Empty finish is confirmedTRK-FINISH-03Start a training, record nothing, tap "Finish training""Nothing recorded yet" confirm appears; "Keep training" (or backdrop/Escape/Back) returns to the training with the workout intact; "Close and discard" closes itRegression: with ≥1 completed set the confirm must NOT appear
7.8Sensor prompt is escapableTRK-FINISH-04With a sensor paired, trigger finish and discard; on "Keep sensor connected?" use the corner ✕, backdrop, Escape and Back in turnEach returns to the training — sensor still connected, sets and videos intact, station not closedOne Back press closes only the prompt; a second shows "Leave training?"

8. Offline, sync & crash recovery

#Use caseCoversStepsExpected resultResultNotes
8.1Offline bannerTRK-OFFLINE-01, SHR-ERR-01Enable airplane mode in the appOffline banner appears; disabling it clears the banner
8.2Offline startTRK-OFFLINE-01With today's bundle loaded, go offline; start a cached workoutWorkout starts and is trackable without network
8.3Upload drainTRK-OFFLINE-02Complete a (manual-entry) training while offline; observe the pending-uploads indicator; go onlineIndicator shows queued upload; reconnect drains it; session reaches the backend
8.4Crash recoveryTRK-OFFLINE-03Mid-training, force-kill the app; relaunch"Resume interrupted training?" prompt; resuming restores the session state (sets, participants)
8.5Leave-training guardTRK-OFFLINE-04Mid-training, press system back / edge-swipeDiscard confirmation appears; cancel keeps the session intact

9. Settings & profile

#Use caseCoversStepsExpected resultResultNotes
9.1Settings & versionTRK-SET-01Open settings and profile drawers from the spine/headerBoth open; app version displayed
9.2Unit switchSHR-UNITS-01, SHR-UNITS-02, TRK-SET-02Toggle metric ↔ imperial; look at loads in an open session and 1RM sheetAll weights convert immediately, no reload
9.3Language switchSHR-I18N-02, SHR-I18N-03, TRK-SET-02Switch the app languageStatic UI text changes language; exercise names stay correctly localized by id
9.4i18n scanSHR-I18N-01Scan all screens visited this runNo raw translation keys, undefined, or untranslated dev strings

10. Cross-cutting & platform

#Use caseCoversStepsExpected resultResultNotes
10.1Keep-awakeTRK-PLATFORM-01Leave a live session idle past the device's screen timeoutScreen stays on during the session; normal timeout applies outside a session
10.2Error surfacesSHR-ERR-02Provoke a recoverable failure (e.g. save with backend briefly unreachable)Toast/inline alert with the backend's message or translated fallback — no raw error, no crash
10.3Native shell sanityTRK-PLATFORM-02Run the full protocol on the Capacitor buildSafe areas respected (no content under notch/home bar); API calls succeed through the native HTTP stack
10.4Debug hidden in prodTRK-PLATFORM-03On a production build, navigate to /debug404 / not found; no debug entry point visible

Coverage table

RequirementCases
TRK-AUTH-011.1
TRK-AUTH-021.2
TRK-SCHED-012.1
TRK-SCHED-022.2
TRK-SCHED-032.3, 2.4
TRK-STATION-013.1
TRK-STATION-023.2
TRK-STATION-033.3
TRK-STATION-043.4
TRK-WORKOUT-014.1, 4.2, 4.3
TRK-WORKOUT-024.4
TRK-WORKOUT-034.5
TRK-WORKOUT-04 (flag on)4.6
TRK-WORKOUT-054.7, 4.8
SHR-ARCH-01/024.9
TRK-LIVE-015.1, 5.2
TRK-LIVE-025.3
TRK-LIVE-035.4
TRK-LIVE-046.1
TRK-LIVE-056.2
TRK-LIVE-066.3
TRK-LIVE-07 (flag)6.4
TRK-LIVE-08 (flag)6.5
TRK-LIVE-096.6
TRK-VIDEO-015.5
TRK-VIDEO-025.6
TRK-INSIGHT-017.1
TRK-INSIGHT-027.2
TRK-INSIGHT-03 (flag)7.3
TRK-INSIGHT-04— mocked; known behaviour
TRK-FINISH-017.4
TRK-FINISH-027.5
TRK-OFFLINE-018.1, 8.2
TRK-OFFLINE-028.3
TRK-OFFLINE-038.4
TRK-OFFLINE-048.5
TRK-SET-019.1
TRK-SET-029.2, 9.3
TRK-SET-03— flag off; not testable
TRK-PLATFORM-0110.1
TRK-PLATFORM-0210.3
TRK-PLATFORM-0310.4
SHR-AUTH-01/02/03/051.1, 1.4, 1.3, 1.5
SHR-I18N-01/02/039.4, 9.3
SHR-UNITS-01/029.2
SHR-ERR-01/02/048.1, 10.2, 2.4

Known/expected behaviours (not defects)

  • Insight tabs show placeholder skeletons while history/metrics load (SKELETON_PREVIEW, TRK-INSIGHT-04) — visual placeholders, not wrong data.
  • The enode Portal link in the sidebar is intentionally hidden (PORTAL_LINK_ENABLED = false, TRK-SET-03).
  • Flag-gated cases (6.4, 6.5, 7.3 force vectors, 4.6) apply only when the flag is ON in the release build — note the flag state in the run file.
  • Device-session recording weight is dev-toggleable pending backend support; use the value your license actually grants for 3.3.