Skip to main content

Test Coverage Specification

Source of truth for what must be tested on forsyt.io. Update the Status Tracker (below) after every implementation. Reference docs/INTERACTION_PATTERNS.md for code patterns for each scenario type.


Status Tracker

Quick summary: 3 passing · 3 skeleton (placeholder selectors) · 28+ not started Update this after every test implementation. Do not leave stale statuses.

Test IDStatus
test_homepage_opens✅ Done
test_homepage_mobile_viewport✅ Done
test_homepage_desktop_viewport✅ Done
test_login_page_loads🟡 Skeleton — placeholder selectors
test_login_with_valid_credentials🟡 Skeleton — placeholder selectors
test_login_invalid_credentials_shows_error🟡 Skeleton — placeholder selectors
test_splash_page_loads⬜ Not started
test_splash_logo_visible⬜ Not started
test_splash_transitions_to_app⬜ Not started
test_sports_feed_loads⬜ Not started
test_sports_feed_heading_visible⬜ Not started
test_bottom_nav_visible⬜ Not started
test_bottom_nav_sports_tab_tap⬜ Not started
test_bottom_nav_live_tab_tap⬜ Not started
test_bottom_nav_mybets_tab_tap⬜ Not started
test_sport_filter_tabs_visible⬜ Not started
test_sport_filter_changes_content⬜ Not started
test_event_cards_visible⬜ Not started
test_live_page_loads⬜ Not started
test_live_events_list_visible⬜ Not started
test_my_bets_page_loads⬜ Not started
test_my_bets_redirects_unauthenticated⬜ Not started
test_account_page_loads⬜ Not started
test_logout_works⬜ Not started
test_event_detail_page_loads⬜ Not started
test_404_page_renders⬜ Not started
test_no_console_errors_on_home⬜ Not started
test_no_horizontal_overflow_home⬜ Not started
test_touch_targets_bottom_nav⬜ Not started

Legend: ✅ Done · 🟡 Skeleton (placeholder selectors) · 🔴 Failing · ⬜ Not started · 🚫 Removed


Coverage Tiers

TierMarkerRuns whenGoalMax time
Smoke@pytest.mark.smokeEvery commit, every deployApp is alive< 2 min total
Regression@pytest.mark.regressionNightly, pre-releaseNothing is broken< 15 min total
Visual@pytest.mark.visualWeekly, post Figma changeUI matches designOn-demand
AI@pytest.mark.aiOn-demandAI pipeline worksOn-demand

Device Matrix

Every smoke and regression test must pass on both:

KeyViewportEmulation
mobile (default)402×874is_mobile=true, touch
desktop1280×720is_mobile=false, no touch

Additional devices for extended regression:

KeyViewportNotes
iphone_14_pro393×852Safari engine → use BROWSER=webkit
pixel_7412×915Chrome on Android
tablet768×1024Mid-size layout

Page Coverage


1. Splash Screen

URL: / Figma: Node 837:22442 — 402×874 mobile frame Description: First screen users see. White logo centred on background. Status bar at top. Bottom nav hidden.

Test IDScenarioTierDevicePattern
test_splash_page_loadsPage navigates without errorsmokemobile+desktopPage load
test_splash_logo_visibleForsyt.io logo is rendered and visiblesmokemobile+desktopElement visibility
test_splash_status_bar_presentiPhone-style status bar is present at the topregressionmobileElement visibility
test_splash_bottom_nav_hiddenBottom navigation is not visible on the splashregressionmobileElement visibility
test_splash_transitions_to_appSplash auto-transitions or has a CTA to enter the appsmokemobileNavigation flow
test_splash_no_console_errorsNo JS errors during splash screen loadregressionmobile+desktopConsole errors
test_splash_no_horizontal_overflowNo content wider than the viewportregressionmobileScroll/overflow

2. Home / Sports Feed

URL: / or /sports (post-splash) Description: Main content page. Sport filter tabs at top. Event cards in a scrollable list. Bottom nav visible.

2a. Page & Layout

Test IDScenarioTierDevicePattern
test_sports_feed_loadsSports feed renders without errorsmokemobile+desktopPage load
test_sports_feed_heading_visiblePage heading is visiblesmokemobile+desktopElement visibility
test_sports_no_horizontal_overflowNo horizontal scrollbar on mobileregressionmobileScroll/overflow
test_sports_no_console_errorsNo JS errors on sports feedregressionmobile+desktopConsole errors

2b. Bottom Navigation (mobile)

Test IDScenarioTierDevicePattern
test_bottom_nav_visibleBottom nav bar is renderedsmokemobileElement visibility
test_bottom_nav_sports_tab_existsSports tab icon+label is visiblesmokemobileElement visibility
test_bottom_nav_live_tab_existsLive tab icon+label is visiblesmokemobileElement visibility
test_bottom_nav_mybets_tab_existsMy Bets tab icon+label is visiblesmokemobileElement visibility
test_bottom_nav_badge_visibleNotification badge renders when count > 0regressionmobileElement visibility
test_bottom_nav_badge_count_is_numericBadge shows a number, not empty textregressionmobileData validation
test_bottom_nav_sports_tab_tapTapping Sports tab navigates to sportssmokemobileTab navigation
test_bottom_nav_live_tab_tapTapping Live tab navigates to live pagesmokemobileTab navigation
test_bottom_nav_mybets_tab_tapTapping My Bets tab navigates to my-betssmokemobileTab navigation
test_bottom_nav_tab_touch_targetEach tab is at least 44×44pxregressionmobileTouch target
test_bottom_nav_active_tab_indicates_currentActive tab is visually highlightedregressionmobileData change

2c. Sport Filter Tabs

Test IDScenarioTierDevicePattern
test_sport_filter_tabs_visibleFilter tabs (Football, Basketball, etc.) are renderedsmokemobile+desktopElement visibility
test_sport_filter_tabs_swipeableTab bar can be swiped horizontally on mobileregressionmobileSwipe
test_sport_filter_changes_contentTapping a sport tab updates the event listregressionmobile+desktopData change
test_sport_filter_active_state_updatesActive tab indicator moves to the tapped tabregressionmobileData change

2d. Event Cards

Test IDScenarioTierDevicePattern
test_event_cards_visibleAt least one event card is renderedsmokemobile+desktopElement count
test_event_card_shows_team_namesEach card shows team / participant namesregressionmobile+desktopData validation
test_event_card_shows_oddsEach card shows at least 2 odds valuesregressionmobile+desktopData validation
test_event_card_shows_time_or_statusEach card shows match time or statusregressionmobileData validation
test_event_card_is_tappableTapping an event card opens event detailregressionmobileButton tap
test_scroll_loads_more_eventsScrolling down loads more events (infinite scroll)regressionmobileVertical scroll

3. Live / In-Play

URL: /live Description: Real-time events page. Shows in-progress matches with live scores and odds.

Test IDScenarioTierDevicePattern
test_live_page_loadsLive page renderssmokemobile+desktopPage load
test_live_heading_visible"Live" heading or indicator is visiblesmokemobile+desktopElement visibility
test_live_events_list_visibleEvent cards are shownsmokemobile+desktopElement count
test_live_score_displayedLive scores are rendered on event cardsregressionmobileData validation
test_live_filter_by_sportSport filter changes the live event listregressionmobile+desktopData change
test_live_score_not_empty_after_waitScore values are still present after 5sregressionmobileData validation
test_live_no_console_errorsNo JS errors on the live pageregressionmobile+desktopConsole errors

4. Login / Authentication

URL: /login

4a. Page Elements

Test IDScenarioTierDevicePattern
test_login_page_loadsLogin page renderssmokemobile+desktopPage load
test_login_email_field_visibleEmail input field is visiblesmokemobile+desktopElement visibility
test_login_password_field_visiblePassword input field is visiblesmokemobile+desktopElement visibility
test_login_submit_button_visibleSubmit / Sign In button is visiblesmokemobile+desktopElement visibility
test_login_submit_button_tappableSubmit button responds to tapregressionmobileButton tap
test_login_submit_button_touch_targetSubmit button is at least 44×44pxregressionmobileTouch target
test_login_forgot_password_link_visibleForgot password link is presentregressionmobile+desktopElement visibility

4b. Form Behaviour

Test IDScenarioTierDevicePattern
test_login_accepts_email_inputEmail field accepts text inputregressionmobile+desktopForm fill
test_login_accepts_password_inputPassword field accepts text inputregressionmobile+desktopForm fill
test_login_password_maskedPassword input is of type password (masked)regressionmobile+desktopForm fill
test_login_empty_form_shows_validationSubmitting empty form shows validationregressionmobile+desktopForm validation
test_login_invalid_email_shows_errorInvalid email format triggers errorregressionmobileForm validation
test_login_invalid_credentials_shows_errorWrong credentials shows error bannerregressionmobile+desktopError state
test_login_error_message_has_textError message element is not emptyregressionmobile+desktopData validation

4c. Authentication Flow

Test IDScenarioTierDevicePattern
test_login_with_valid_credentialsValid login lands on the expected pagesmokemobile+desktopNavigation flow
test_login_persists_sessionReloading after login keeps the user authenticatedregressionmobileData change

5. My Bets / Bet Slip

URL: /my-bets Requires: Authenticated session — use authenticated_page

Test IDScenarioTierDevicePattern
test_my_bets_page_loadsPage renders for authenticated userssmokemobile+desktopPage load
test_my_bets_redirects_unauthenticatedUnauthenticated users go to loginsmokemobile+desktopNavigation flow
test_active_bets_section_visibleActive bets section is renderedregressionmobileElement visibility
test_settled_bets_tab_visibleSettled / History tab is presentregressionmobileElement visibility
test_settled_bets_tab_loads_contentTapping Settled tab shows past betsregressionmobileTab navigation
test_bet_card_is_visibleAt least one bet card is renderedregressionmobileElement count
test_bet_card_shows_event_nameBet card shows the event / match nameregressionmobileData validation
test_bet_card_shows_stakeBet card shows the stake amountregressionmobileData validation
test_bet_card_expands_on_tapTapping a bet card expands detailsregressionmobileButton tap
test_my_bets_no_console_errorsNo JS errors on My BetsregressionmobileConsole errors

6. Account / Profile

URL: /account Requires: Authenticated session

Test IDScenarioTierDevicePattern
test_account_page_loadsAccount page renderssmokemobile+desktopPage load
test_account_shows_usernameLogged-in username / email is displayedregressionmobile+desktopData validation
test_account_shows_avatar_or_initialsUser avatar or initials rendersregressionmobileElement visibility
test_logout_button_visibleLogout button is presentregressionmobile+desktopElement visibility
test_logout_worksTapping logout redirects to loginregressionmobile+desktopNavigation flow

7. Event Detail

URL: /event/<id> or similar Description: Individual match/event page with odds, teams, betting options.

Test IDScenarioTierDevicePattern
test_event_detail_page_loadsEvent detail renders after tapping an event cardsmokemobile+desktopPage load
test_event_teams_visibleHome and away team names are shownsmokemobile+desktopElement visibility
test_event_odds_visibleBetting odds are displayedsmokemobile+desktopElement visibility
test_event_odds_are_numericOdds values are non-empty numbersregressionmobile+desktopData validation
test_event_back_navigationBack button / back gesture returns to feedregressionmobileBack navigation
test_event_odds_tappableTapping an odds button selects it (state changes)regressionmobileButton tap
test_event_no_console_errorsNo JS errors on event detailregressionmobileConsole errors

8. Error & Edge Cases

Test IDScenarioTierDevicePattern
test_404_page_renders/nonexistent URL shows a 404 or error pageregressionmobile+desktopError state
test_network_error_shows_error_stateSports feed shows error state when API failsregressionmobileError state (route abort)
test_no_console_errors_on_homeNo uncaught JS errors on homepageregressionmobile+desktopConsole errors

Accessibility Coverage (from Figma)

Based on the forsyt.io Figma design (mobile-first, 402×874 canvas):

Test IDScenarioTierDevice
test_touch_targets_bottom_navAll bottom nav tabs ≥ 44×44pxregressionmobile
test_touch_targets_login_formLogin button and inputs ≥ 44×44pxregressionmobile
test_touch_targets_event_cardsEvent cards large enough to tap without mis-tapregressionmobile
test_no_horizontal_overflow_homeNo horizontal scrollbar on homeregressionmobile
test_no_horizontal_overflow_sportsNo horizontal scrollbar on sports pageregressionmobile
test_text_readable_minimum_sizeNo text smaller than 12px on mobileregressionmobile
test_status_bar_not_overlapping_contentContent does not sit behind the status barregressionmobile

Visual Coverage (Figma Comparison)

Test IDFigma NodePageDevice
test_visual_splash_screen837:22442Splashmobile
test_visual_sports_feedTBDSportsmobile
test_visual_bottom_navTBDSports (authenticated)mobile
test_visual_login_formTBDLoginmobile + desktop
test_visual_event_cardTBDSportsmobile

Coverage Targets

TierTarget pass rateMax duration
Smoke — mobile100%< 2 min
Smoke — desktop100%< 2 min
Regression — mobile95%+< 15 min
Regression — desktop95%+< 15 min