# TimeToLeave - Manual Testing Checklist Use this checklist for browser, mobile, and integration testing before release. ## Prerequisites - [ ] `npm install` has been run. - [ ] Required environment variables are configured. - [ ] Web app is running locally or deployed. - [ ] Mobile app has a reachable `EXPO_PUBLIC_API_BASE_URL` when tested on a device. - [ ] Network access is available for HAFAS, Nominatim, OSRM, Wiener Linien, and calendar providers. ## Web Dashboard - [ ] Open `/`. - [ ] Verify the departure desk loads without console errors. - [ ] Add or import at least two future events. - [ ] Verify the dashboard shows the next upcoming event. - [ ] Verify edit and remove actions work from the event card. - [ ] Verify event data persists after browser refresh. ## Web Calendar Import - [ ] Open `/calendar`. - [ ] Import a valid allowed ICS URL. - [ ] Upload a local `.ics` file. - [ ] Verify imported events with locations merge into the local event store. - [ ] Verify duplicate imports do not create unusable duplicate records. - [ ] Use batch destination editing and confirm edited destinations are retained. ## Google Calendar Web Sync - [ ] Confirm `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET`, `GOOGLE_REDIRECT_URI`, and `DEPLOYMENT_URL` are configured. - [ ] Open the Google tab on `/calendar`. - [ ] Connect Google Calendar through OAuth. - [ ] Verify sync returns upcoming events with locations. - [ ] Disconnect Google Calendar. - [ ] Verify status returns to disconnected. ## Settings and Reminders - [ ] Enable browser notifications when prompted. - [ ] Change reminder buffer and arrival buffer. - [ ] Toggle walking option off and on. - [ ] Toggle bike option off and on. - [ ] Refresh the page and verify settings persist. - [ ] Verify disabling bike hides or disables bike mode. - [ ] Verify disabling walking removes the final-walk adjustment from train mode. ## Train Mode - [ ] Use an event with a real destination and origin station. - [ ] Verify destination geocoding completes. - [ ] Verify destination station lookup completes. - [ ] Verify `/api/hafas` is called with `TripSearch`. - [ ] Verify journey rows show departure, arrival, platform, train labels, delay, changes, and cancellations when present. - [ ] Verify leave-by time is based on a journey that arrives before the event minus arrival buffer and final walk. - [ ] Increase arrival buffer and verify leave-by can move earlier. ## Bike and Walking Routes - [ ] Switch to bike mode. - [ ] Verify `/api/bike-route` is called with four coordinate parameters. - [ ] Verify bike duration, distance, and steps are displayed. - [ ] Switch back to train mode with walking enabled. - [ ] Verify `/api/walk-route` is called for station-to-destination walking. - [ ] Verify walking duration and distance appear in the train section. - [ ] Test route error handling with invalid or very distant coordinates. ## Wiener Linien - [ ] Use a destination near Vienna public transport. - [ ] Verify `/api/wienerlinien/stops` returns nearby stops. - [ ] Verify `/api/wienerlinien/monitor` returns live departures for selected stops. - [ ] Verify loading, empty, and error states are readable. ## API Guards - [ ] Verify remote calendar URLs from unsupported hosts are rejected. - [ ] Verify private or localhost calendar URLs are rejected. - [ ] Verify overly large HAFAS POST bodies are rejected. - [ ] Verify invalid coordinates return client errors. - [ ] Verify CORS allows only configured origins. - [ ] Verify rate limiting returns `429` after the configured threshold. ## Mobile Event Flow - [ ] Start the Expo app. - [ ] Add a manual event. - [ ] Edit the event. - [ ] Delete the event. - [ ] Restart the app and verify stored events persist. - [ ] Open event detail and verify train, bike, walking, and nearby-stop sections load when data is available. ## Mobile Calendar Import - [ ] Import an ICS URL. - [ ] Grant calendar permission. - [ ] Verify native calendars are listed. - [ ] Select and deselect individual calendars. - [ ] Use select all and deselect all. - [ ] Sync native calendars for the next 30 days. - [ ] Verify events without locations are excluded. - [ ] Verify CalDAV/DAVx, Apple, Google, Exchange, subscribed, local, and other source labels render correctly when available on the device. ## Mobile Settings and Notifications - [ ] Search for an origin station. - [ ] Use current location to find nearest origin station. - [ ] Change reminder buffer and arrival buffer. - [ ] Toggle walking and bike options. - [ ] Toggle notifications. - [ ] Verify notification settings persist after app restart. - [ ] Verify scheduled notifications are recreated when settings change. - [ ] Toggle dark/light theme and verify it persists. ## Offline and Failure States - [ ] Disable network and open web event detail data. - [ ] Verify geocoding, HAFAS, route, and Wiener Linien errors are visible and non-blocking. - [ ] Re-enable network and verify retry/refresh paths work. - [ ] Test mobile with the backend URL unavailable and verify errors are understandable. ## Accessibility and Layout - [ ] Navigate web controls with keyboard only. - [ ] Verify modal focus and close behavior. - [ ] Verify buttons and interactive controls have accessible labels or readable text. - [ ] Test narrow mobile browser width, tablet width, and desktop width. - [ ] Verify mobile screens do not clip primary controls. ## Sign-Off - [ ] Web smoke test passed. - [ ] Mobile smoke test passed. - [ ] Calendar import tested. - [ ] Live transit integration tested. - [ ] Notifications tested. - [ ] No critical bugs remain. Tested by: Date: Build/version: