From dbe3ac644dcaae79683f89f5d6b0a6e36d96beaf Mon Sep 17 00:00:00 2001 From: AmanTahiliani Date: Sun, 12 Jul 2026 18:50:50 -0400 Subject: [PATCH] fix(#74): address PR #81 review blockers for live handoff Distinguish FIA feed drops from true session end via terminal SessionStatus, consume canonical /api/v1/weekend-context (post-#72 rebase), poll until analysis-ready, and restore missing live-state styles plus transition/E2E/visual coverage. Co-authored-by: Cursor --- frontend/src/components/live/LiveHandoff.tsx | 79 +++- frontend/src/lib/liveState.ts | 74 +++- frontend/src/pages/LiveTimingPage.tsx | 101 +++-- frontend/src/styles/live-state.css | 414 +++++++++++++++++++ frontend/src/test/LiveHandoff.test.tsx | 206 +++++++++ frontend/src/test/LiveTimingPage.test.tsx | 271 +++++++++--- frontend/src/test/liveState.test.ts | 169 ++++++++ tests/live-timing.spec.ts | 143 ++++++- tests/production-smoke.spec.ts | 6 +- tests/visual/__snapshots__/desktop/live.png | Bin 12863 -> 58386 bytes tests/visual/__snapshots__/mobile/live.png | Bin 9966 -> 32994 bytes tests/visual/__snapshots__/tablet/live.png | Bin 12517 -> 47061 bytes tests/visual/helpers.ts | 6 +- tests/visual/mvp-screens.spec.ts | 6 +- 14 files changed, 1323 insertions(+), 152 deletions(-) create mode 100644 frontend/src/styles/live-state.css create mode 100644 frontend/src/test/LiveHandoff.test.tsx create mode 100644 frontend/src/test/liveState.test.ts diff --git a/frontend/src/components/live/LiveHandoff.tsx b/frontend/src/components/live/LiveHandoff.tsx index 1540948..b166dce 100644 --- a/frontend/src/components/live/LiveHandoff.tsx +++ b/frontend/src/components/live/LiveHandoff.tsx @@ -1,16 +1,18 @@ import { Archive, ChevronRight, Flag, Radio } from 'lucide-react' import type { LiveTimingRow } from '../../lib/live' import { driverCode } from '../../lib/live' -import type { LiveWeekendContext } from '../../lib/weekendContext' import type { TransportHealth } from '../../lib/liveState' import { feedHealthLabel } from '../../lib/liveState' +import type { ContextSession, WeekendContext } from '../../types' +import { analysisSessionKey } from '../../lib/weekendContext' import { formatSessionScheduleTime } from '../../lib/schedule' interface Props { - /** 'settling' immediately after a session; 'inactive' when nothing is retained. */ + /** 'settling' immediately after a session; 'inactive' when nothing is live. */ phase: 'settling' | 'inactive' transport: TransportHealth - context: LiveWeekendContext + /** Canonical weekend context (issue #72). May be undefined before it loads. */ + context: WeekendContext | undefined /** Top rows of the final snapshot (settling only), already position-sorted. */ rows: LiveTimingRow[] capturedAt?: string | null @@ -25,6 +27,15 @@ function formatCapturedAt(capturedAt: string | null | undefined): string { return date.toLocaleString() } +/** + * Fully ingested analysis (local_analysis === complete). Stricter than + * hasLocalAnalysis, which also treats partial as link-worthy — Live polling + * and "ready" chrome wait for the complete state. + */ +export function analysisIsReady(session: ContextSession | undefined): boolean { + return session?.availability?.local_analysis === 'complete' +} + export function LiveHandoff({ phase, transport, @@ -37,12 +48,28 @@ export function LiveHandoff({ const isSettling = phase === 'settling' const testid = isSettling ? 'live-settling' : 'live-inactive' const capturedLabel = formatCapturedAt(capturedAt) - const title = context.meetingName || 'Live Timing' + + const focusName = context?.focus_meeting?.meeting_name + const activeName = context?.active_session?.meeting?.meeting_name + const title = focusName || activeName || 'Live Timing' const topRows = rows.slice(0, 3) - const analysisKey = context.analysisSessionKey - const analysisName = context.analysisSessionName || 'session' - const analysisReady = context.analysisReady + // Shared analysisSessionKey prefers default_analysis_session, then previous. + const analysisKey = context ? analysisSessionKey(context) : undefined + const analysis = + !context || !analysisKey + ? undefined + : context.default_analysis_session?.session.session_key === analysisKey + ? context.default_analysis_session + : context.previous_completed_session + const analysisName = analysis?.session.session_name || 'session' + const analysisReady = analysisIsReady(analysis) + + const next = context?.next_session + const previous = context?.previous_completed_session + // Avoid a duplicate recap card when previous == the analysis target. + const showRecap = + previous && previous.session.session_key !== analysisKey && previous.session.session_key !== 0 return (
@@ -95,6 +122,7 @@ export function LiveHandoff({ className="live-handoff-action live-handoff-primary" href={`/race-hub?session_key=${analysisKey}`} data-testid="live-handoff-analysis" + data-ready={analysisReady ? 'true' : 'false'} > @@ -103,13 +131,18 @@ export function LiveHandoff({ {analysisReady ? 'Full timing, strategy & story ready' - : 'Settling — analysis will fill in as data ingests'} + : isSettling + ? 'Settling — analysis will fill in as data ingests' + : 'Analysis will fill in as data ingests'} ) : ( -
+
Analysis not ready yet @@ -119,26 +152,32 @@ export function LiveHandoff({
)} - {context.nextSession && ( + {next && (
- Up next · {context.nextSession.name} + + Up next · {next.session.session_name} + - {formatSessionScheduleTime(context.nextSession.startsAt)} + {formatSessionScheduleTime(next.session.date_start)}
)} - {context.previousSession && context.previousSession.sessionKey !== analysisKey && ( + {showRecap && ( - Recap · {context.previousSession.name} - Review the last completed session + + Recap · {previous!.session.session_name} + + + Review the last completed session + @@ -155,17 +194,19 @@ export function LiveHandoff({ View full timing (read-only) - Frozen final snapshot — no live updates + + Frozen final snapshot — no live updates + )} - {!analysisKey && !context.nextSession && !context.previousSession && !hasArchive && ( + {!analysisKey && !next && !showRecap && !hasArchive && (
- Command Center + Weekend Weekend schedule & standings diff --git a/frontend/src/lib/liveState.ts b/frontend/src/lib/liveState.ts index 36ddf5b..4d9f7d6 100644 --- a/frontend/src/lib/liveState.ts +++ b/frontend/src/lib/liveState.ts @@ -11,14 +11,23 @@ // `deriveLivePhase` collapses the first three inputs into a single UI phase so // the page never, for example, calls a finished session "offline" or lets a // dropped socket masquerade as "archive mode". +// +// Critical distinction (issue #74 P0): the server's `deactivate()` path moves a +// STILL-ACTIVE snapshot into `last_snapshot` whenever the upstream FIA SignalR +// connection ends or idles — WITHOUT changing SessionStatus. So `is_live=false` +// alone is ambiguous. We rely on the retained snapshot's terminal SessionStatus +// (Finished/Ended/…) as the only trustworthy "the session really ended" signal. +// A non-terminal retained snapshot means the feed dropped, not that the session +// finished, and must render as `disconnected` (retain snapshot, warn, recover), +// never `settling`/archive. export type TransportHealth = 'connecting' | 'connected' | 'disconnected' | 'error' export type LivePhase = | 'connecting' // cold start: no snapshot yet, still opening the feed | 'live' // a session is running and streaming - | 'disconnected' // was live, transport dropped — keep the last snapshot, warn - | 'settling' // session ended; a final snapshot is retained, analysis pending + | 'disconnected' // was live, transport/feed dropped — keep the last snapshot, warn + | 'settling' // session truly ended; a final snapshot is retained, analysis pending | 'archive' // user opened the retained snapshot as an explicit read-only view | 'inactive' // no session and nothing retained — show weekend context instead @@ -27,10 +36,39 @@ export interface LiveStateInputs { /** The feed reports an active session AND carries a snapshot for it. */ isLive: boolean hasActiveSnapshot: boolean - /** A final snapshot from the last session is retained. */ + /** A retained snapshot from the last stream is held (may be a dropped feed). */ hasArchive: boolean /** The user explicitly opened the archive as a read-only timing view. */ archiveMode: boolean + /** + * The retained snapshot ended on a *terminal* FIA SessionStatus. Only true + * here means the session genuinely finished (vs. the transport dropping). + */ + sessionEndedCleanly: boolean + /** We have observed this session live at least once in this page session. */ + wasLive: boolean + /** + * The initial `/api/v1/live/state` query has resolved. `connecting` is a + * cold-start-only phase: once we know the current state (even if the SSE + * transport handshake is still pending), an idle feed is `inactive`, not a + * perpetual "connecting…" spinner. + */ + stateLoaded: boolean +} + +// Raw FIA SessionStatus values that mean the session is genuinely over. Mirrors +// the backend `terminalSessionStatus` used by the weekend-context resolver so +// the client and server agree on "finished". +const TERMINAL_STATUSES = new Set(['finished', 'finalised', 'finalized', 'ended', 'aborted']) + +function normalizeStatus(status: string | undefined | null): string { + if (!status) return '' + return status.replace(/[^a-zA-Z]/g, '').toLowerCase() +} + +/** Whether a raw FIA SessionStatus represents a genuinely completed session. */ +export function terminalSessionStatus(status: string | undefined | null): boolean { + return TERMINAL_STATUSES.has(normalizeStatus(status)) } export function transportDown(transport: TransportHealth): boolean { @@ -40,10 +78,19 @@ export function transportDown(transport: TransportHealth): boolean { /** * Map transport + session + archive inputs to one UI phase. Session lifecycle * and transport health are deliberately orthogonal: a live session with a - * dropped socket is `disconnected` (snapshot retained), never `archive`. + * dropped socket is `disconnected` (snapshot retained), never `archive` or + * `settling`. */ export function deriveLivePhase(input: LiveStateInputs): LivePhase { - const { transport, isLive, hasActiveSnapshot, hasArchive, archiveMode } = input + const { + transport, + isLive, + hasActiveSnapshot, + hasArchive, + archiveMode, + sessionEndedCleanly, + stateLoaded, + } = input // Explicit read-only archive wins — it is a user-chosen mode. if (archiveMode && hasArchive) return 'archive' @@ -54,11 +101,20 @@ export function deriveLivePhase(input: LiveStateInputs): LivePhase { return transportDown(transport) ? 'disconnected' : 'live' } - // No active session but we still hold the final snapshot -> settling handoff. - if (hasArchive) return 'settling' + // Feed reports no active session but a snapshot is retained. Distinguish a + // genuine session end from an upstream feed drop using the *only* trustworthy + // signal: whether the retained snapshot carries a terminal SessionStatus. + if (hasArchive) { + if (sessionEndedCleanly) return 'settling' + // Non-terminal retained snapshot means the upstream feed dropped, not that + // the session finished. Hold the last frame and warn — never settle/archive. + return 'disconnected' + } - // Nothing yet and the feed is still opening. - if (transport === 'connecting') return 'connecting' + // Cold start only: still opening the feed and we have not yet learned the + // current state. Once the initial state query resolves, an idle feed is + // `inactive`, not a perpetual "connecting…". + if (transport === 'connecting' && !stateLoaded) return 'connecting' return 'inactive' } diff --git a/frontend/src/pages/LiveTimingPage.tsx b/frontend/src/pages/LiveTimingPage.tsx index 59fcd00..e7f8223 100644 --- a/frontend/src/pages/LiveTimingPage.tsx +++ b/frontend/src/pages/LiveTimingPage.tsx @@ -1,6 +1,6 @@ import { useEffect, useMemo, useRef, useState } from 'react' import { useQuery } from '@tanstack/react-query' -import { fetchLiveState, fetchLocalMeetings, fetchSeasons, fetchWeekend } from '../api' +import { fetchLiveState, fetchWeekendContext } from '../api' import type { LivePosition, LiveStreamData } from '../types' import { loadPinnedDrivers, @@ -21,10 +21,10 @@ import { allowsLiveInterpretations, deriveLivePhase, rendersSnapshot, + terminalSessionStatus, } from '../lib/liveState' import type { TransportHealth } from '../lib/liveState' -import { deriveWeekendContext } from '../lib/weekendContext' -import { pickFocusMeeting } from '../lib/schedule' +import { analysisIsReady } from '../components/live/LiveHandoff' import { SessionBanner } from '../components/live/SessionBanner' import { TrackStatusBanner } from '../components/live/TrackStatusBanner' import { TimingTower } from '../components/live/TimingTower' @@ -37,6 +37,10 @@ import { TyreDegPanel } from '../components/live/TyreDegPanel' import { LiveHandoff } from '../components/live/LiveHandoff' import '../styles/live-state.css' +/** How often to re-check weekend-context while analysis is still ingesting. */ +export const WEEKEND_CONTEXT_POLL_MS = 15_000 +const WEEKEND_CONTEXT_STALE_MS = 15_000 + export function LiveTimingPage() { const [activeSnapshot, setActiveSnapshot] = useState(null) const [archiveSnapshot, setArchiveSnapshot] = useState(null) @@ -55,61 +59,75 @@ export function LiveTimingPage() { const sessionSigRef = useRef('') const isLiveRef = useRef(false) const archiveModeRef = useRef(false) + // Whether we ever observed this session as live — used to reason about a + // dropped feed vs. a session that was never live in this page session. + const wasLiveRef = useRef(false) const hasArchive = Boolean(archiveSnapshot) - // Transport health, active-session state, and archive mode are three - // independent inputs; deriveLivePhase collapses them into one UI phase. + const { + data, + isError, + error, + isFetched: liveStateFetched, + } = useQuery({ + queryKey: ['live-state'], + queryFn: fetchLiveState, + staleTime: 5_000, + }) + + // A retained snapshot is only "settled" (session genuinely finished) if it + // carries a terminal FIA SessionStatus. Otherwise the upstream feed dropped + // while the session was still active and we must stay in `disconnected`. + const sessionEndedCleanly = terminalSessionStatus(archiveSnapshot?.SessionStatus) + + // Transport health, active-session state, and archive availability are + // orthogonal inputs; deriveLivePhase collapses them into one UI phase. const phase = deriveLivePhase({ transport: streamStatus, isLive, hasActiveSnapshot: Boolean(activeSnapshot), hasArchive, archiveMode, + sessionEndedCleanly, + wasLive: wasLiveRef.current, + stateLoaded: liveStateFetched, }) - const snapshot = phase === 'archive' ? archiveSnapshot : isLive ? activeSnapshot : null + const snapshot = + phase === 'archive' + ? archiveSnapshot + : isLive + ? activeSnapshot + : phase === 'disconnected' + ? archiveSnapshot + : null - const { data, isError, error } = useQuery({ - queryKey: ['live-state'], - queryFn: fetchLiveState, - staleTime: 5_000, + // Canonical weekend context (issue #72) — the single source of truth for + // previous/next/default-analysis identity and temporal state. Only needed + // when no session is streaming; keep it idle during a live session. Poll + // while a completed session is still ingesting so `settling` can flip to + // analysis-ready without a manual refresh. + const contextQuery = useQuery({ + queryKey: ['weekend-context'], + queryFn: fetchWeekendContext, + enabled: !isLive, + staleTime: WEEKEND_CONTEXT_STALE_MS, + refetchInterval: (query) => { + const ctx = query.state.data + if (!ctx) return WEEKEND_CONTEXT_POLL_MS + // Once the default-analysis session is fully ingested there is nothing + // left to wait for; stop polling. + return analysisIsReady(ctx.default_analysis_session) ? false : WEEKEND_CONTEXT_POLL_MS + }, + refetchIntervalInBackground: false, }) - - // Weekend context (previous/next/analysis) is only needed when no session is - // streaming; keep the queries idle during a live session. - const notLive = !isLive - const nowDate = useMemo(() => new Date(now), [now]) - const seasonsQuery = useQuery({ - queryKey: ['seasons'], - queryFn: fetchSeasons, - enabled: notLive, - }) - const latestSeason = seasonsQuery.data?.[0] ?? null - const meetingsQuery = useQuery({ - queryKey: ['meetings', latestSeason], - queryFn: () => fetchLocalMeetings(latestSeason!), - enabled: notLive && latestSeason != null, - staleTime: 60_000, - }) - const focusMeeting = useMemo( - () => pickFocusMeeting(meetingsQuery.data ?? [], nowDate), - [meetingsQuery.data, nowDate], - ) - const weekendQuery = useQuery({ - queryKey: ['weekend', focusMeeting?.meeting_key], - queryFn: () => fetchWeekend(focusMeeting!.meeting_key), - enabled: notLive && focusMeeting != null, - staleTime: 60_000, - }) - const weekendContext = useMemo( - () => deriveWeekendContext(weekendQuery.data, nowDate), - [weekendQuery.data, nowDate], - ) + const weekendContext = contextQuery.data useEffect(() => { if (!data) return const nextLive = data.is_live && Boolean(data.data) setIsLive(nextLive) isLiveRef.current = nextLive + if (nextLive) wasLiveRef.current = true if (nextLive && data.data) { setActiveSnapshot(data.data) setArchiveMode(false) @@ -159,6 +177,7 @@ export function LiveTimingPage() { setPositions({}) } isLiveRef.current = true + wasLiveRef.current = true setActiveSnapshot(state.data) setArchiveMode(false) } else { diff --git a/frontend/src/styles/live-state.css b/frontend/src/styles/live-state.css new file mode 100644 index 0000000..378e62e --- /dev/null +++ b/frontend/src/styles/live-state.css @@ -0,0 +1,414 @@ +/* ── Live → settling → analysis handoff (issue #74) ── + * + * State-transition presentation for Live: session/flag chrome that replaces + * the old connection-as-session conflation, the connection-loss warning, the + * archive read-only strip, and the settling/inactive handoff surface. + */ + +/* Session flag: primary session state. Feed health is secondary. */ +.live-session-flag { + display: inline-flex; + align-items: center; + gap: var(--s2); + padding: 5px 9px; + border-radius: 3px; + font-family: var(--f-mono); + font-size: 10px; + font-weight: 800; + letter-spacing: 0.08em; + text-transform: uppercase; + white-space: nowrap; +} + +.live-session-flag-live { + background: rgba(225, 6, 0, 0.14); + border: 1px solid rgba(225, 6, 0, 0.35); + color: #ff6b6b; +} + +.live-session-flag-live.is-stale { + background: rgba(255, 214, 0, 0.1); + border-color: rgba(255, 214, 0, 0.35); + color: var(--yellow); +} + +.live-session-flag-archive { + background: rgba(70, 140, 255, 0.12); + border: 1px solid rgba(70, 140, 255, 0.35); + color: #8bb7ff; +} + +.live-session-dot { + width: 7px; + height: 7px; + border-radius: 50%; + background: currentColor; + box-shadow: 0 0 0 0 currentColor; + animation: live-pulse 1.6s ease-in-out infinite; +} + +.live-session-flag-live.is-stale .live-session-dot { + animation: none; + opacity: 0.55; +} + +.live-feed-health { + display: inline-flex; + align-items: center; + gap: var(--s2); + padding: 4px 7px; + border-radius: 2px; + font-family: var(--f-mono); + font-size: 10px; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--text-3); + border: 1px solid var(--border-2); + background: rgba(255, 255, 255, 0.03); +} + +.live-feed-dot { + width: 6px; + height: 6px; + border-radius: 50%; + background: currentColor; +} + +.live-feed-connected { + color: var(--green); + border-color: rgba(57, 199, 58, 0.25); + background: rgba(57, 199, 58, 0.08); +} + +.live-feed-connecting { + color: var(--yellow); + border-color: rgba(255, 214, 0, 0.25); + background: rgba(255, 214, 0, 0.08); +} + +.live-feed-disconnected, +.live-feed-error { + color: #ff6b6b; + border-color: rgba(225, 6, 0, 0.24); + background: rgba(225, 6, 0, 0.08); +} + +.live-banner-archive { + border-color: rgba(70, 140, 255, 0.28); +} + +.live-archive-stamp { + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 2px; +} + +.live-archive-readonly { + font-size: 10px; + font-weight: 800; + letter-spacing: 0.08em; + color: #8bb7ff; +} + +.live-archive-captured { + font-size: 10px; + color: var(--text-3); +} + +.live-state-archive { + background: rgba(70, 140, 255, 0.12); + color: #8bb7ff; + border: 1px solid rgba(70, 140, 255, 0.28); +} + +/* Disconnected warning: a live session whose feed dropped. Distinct from the + * blue archive strip so a dropped feed is never mistaken for a read-only + * archive. The retained tower stays visible beneath it. */ +.live-status-strip.live-status-warn { + display: flex; + align-items: center; + gap: var(--s3); +} + +.live-status-strip.live-status-warn::before { + content: ''; + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--yellow); + animation: live-pulse 1.6s ease-in-out infinite; +} + +@keyframes live-pulse { + 0%, + 100% { + opacity: 1; + } + 50% { + opacity: 0.35; + } +} + +.live-status-strip.live-status-archive { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--s4); + flex-wrap: wrap; +} + +.live-archive-exit { + min-height: 28px; + padding: 0 var(--s4); + border: 1px solid rgba(70, 140, 255, 0.4); + border-radius: 4px; + background: rgba(70, 140, 255, 0.12); + color: #8bb7ff; + font-family: var(--f-mono); + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + cursor: pointer; +} + +.live-archive-exit:hover { + border-color: rgba(70, 140, 255, 0.7); + background: rgba(70, 140, 255, 0.2); +} + +/* ── Handoff surface (settling + inactive) ── */ +.live-handoff { + border: 1px solid var(--border-2); + border-radius: 10px; + padding: var(--s6) var(--s5); + background: + radial-gradient(120% 120% at 0% 0%, rgba(255, 255, 255, 0.04), transparent 55%), + var(--surface); +} + +.live-handoff-settling { + border-left: 3px solid var(--yellow); +} + +.live-handoff-inactive { + border-left: 3px solid var(--border-2); +} + +.live-handoff-head { + display: flex; + flex-direction: column; + gap: var(--s3); + margin-bottom: var(--s5); +} + +.live-handoff-eyebrow { + display: inline-flex; + align-items: center; + gap: var(--s2); + align-self: flex-start; + padding: 4px var(--s3); + border-radius: 3px; + font-size: 10px; + font-weight: 800; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.live-handoff-settling .live-handoff-eyebrow { + color: var(--yellow); + background: rgba(245, 158, 11, 0.14); + border: 1px solid rgba(245, 158, 11, 0.3); +} + +.live-handoff-inactive .live-handoff-eyebrow { + color: var(--text-2); + background: rgba(255, 255, 255, 0.05); + border: 1px solid var(--border-2); +} + +.live-handoff-title { + font-size: 26px; + line-height: 1.15; + font-weight: 800; +} + +.live-handoff-captured { + font-size: 11px; + color: var(--text-3); + text-transform: uppercase; + letter-spacing: 0.04em; +} + +.live-handoff-sub { + font-size: 13px; + color: var(--text-2); + max-width: 62ch; +} + +.live-handoff-feed { + align-self: flex-start; + margin-top: var(--s2); +} + +/* Provisional final-order snapshot chips (settling only). */ +.live-handoff-snapshot { + margin-bottom: var(--s5); + padding: var(--s4); + border: 1px dashed var(--border-2); + border-radius: 8px; + background: rgba(255, 255, 255, 0.02); +} + +.live-handoff-snapshot-label { + display: block; + margin-bottom: var(--s3); + font-size: 10px; + color: var(--text-3); + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.live-handoff-order { + display: flex; + flex-wrap: wrap; + gap: var(--s3); + list-style: none; +} + +.live-handoff-order li { + display: inline-flex; + align-items: center; + gap: var(--s2); + padding: var(--s2) var(--s3); + border: 1px solid var(--border-2); + border-radius: 4px; + background: rgba(255, 255, 255, 0.03); + font-size: 12px; +} + +.live-handoff-order li span:first-child { + color: var(--text-3); + font-size: 11px; +} + +.live-handoff-code { + font-weight: 800; + color: var(--text); +} + +/* ── Action cards ── */ +.live-handoff-actions { + display: grid; + gap: var(--s3); +} + +.live-handoff-action { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--s4); + width: 100%; + padding: var(--s4) var(--s5); + border: 1px solid var(--border-2); + border-radius: 8px; + background: rgba(255, 255, 255, 0.03); + color: var(--text); + text-align: left; + cursor: pointer; + transition: + border-color 0.15s ease, + background 0.15s ease, + transform 0.15s ease; +} + +button.live-handoff-action { + font: inherit; +} + +.live-handoff-action:hover { + border-color: var(--border-glow); + background: rgba(255, 255, 255, 0.06); + transform: translateX(2px); +} + +.live-handoff-action-body { + display: flex; + flex-direction: column; + gap: 2px; + min-width: 0; +} + +.live-handoff-action-label { + display: inline-flex; + align-items: center; + gap: var(--s2); + font-size: 14px; + font-weight: 700; +} + +.live-handoff-action-meta { + font-size: 11px; + color: var(--text-3); +} + +/* The primary "open analysis" action is the strongest affordance. */ +.live-handoff-primary { + border-color: rgba(230, 36, 41, 0.4); + background: linear-gradient(90deg, rgba(230, 36, 41, 0.14), transparent 60%); +} + +.live-handoff-primary:hover { + border-color: rgba(230, 36, 41, 0.7); + background: linear-gradient(90deg, rgba(230, 36, 41, 0.22), transparent 60%); +} + +/* Pending-analysis states read as "waiting", not actionable links. */ +.live-handoff-primary[data-ready='false'] { + border-color: rgba(245, 158, 11, 0.4); + background: linear-gradient(90deg, rgba(245, 158, 11, 0.1), transparent 60%); +} + +.live-handoff-pending { + cursor: default; + opacity: 0.75; +} + +.live-handoff-pending:hover { + transform: none; + background: rgba(255, 255, 255, 0.03); + border-color: var(--border-2); +} + +.live-handoff-next { + cursor: default; +} + +.live-handoff-next:hover { + transform: none; +} + +/* ── Responsive: keep the handoff usable at tablet / mobile widths ── */ +@media (max-width: 640px) { + .live-handoff { + padding: var(--s5) var(--s4); + } + + .live-handoff-title { + font-size: 21px; + } + + .live-handoff-action { + padding: var(--s4); + } + + .live-handoff-action-label { + font-size: 13px; + } + + .live-status-strip.live-status-archive { + flex-direction: column; + align-items: flex-start; + } +} diff --git a/frontend/src/test/LiveHandoff.test.tsx b/frontend/src/test/LiveHandoff.test.tsx new file mode 100644 index 0000000..5639161 --- /dev/null +++ b/frontend/src/test/LiveHandoff.test.tsx @@ -0,0 +1,206 @@ +import { render, screen } from '@testing-library/react' +import { describe, expect, it, vi } from 'vitest' +import { LiveHandoff, analysisIsReady } from '../components/live/LiveHandoff' +import type { LiveTimingRow } from '../lib/live' +import type { ContextSession, WeekendContext } from '../types' + +function session(key: number, name: string, type = name): ContextSession['session'] { + return { + session_key: key, + session_name: name, + session_type: type, + meeting_key: 1, + date_start: '2026-07-05T14:00:00Z', + date_end: '2026-07-05T16:00:00Z', + gmt_offset: '', + } +} + +function contextSession( + key: number, + name: string, + localAnalysis: string, +): ContextSession { + return { + session: session(key, name), + availability: { + schedule: 'available', + live_transport: 'unknown', + live_session: 'inactive', + archive: 'unavailable', + local_analysis: localAnalysis, + freshness: 'fresh', + limitations: [], + }, + } +} + +const baseContext: WeekendContext = { + temporal_state: 'session_settling', + focus_meeting: { + meeting_key: 1, + meeting_name: 'British Grand Prix', + meeting_official_name: 'British Grand Prix', + location: 'Silverstone', + country_name: 'UK', + country_code: 'GB', + country_flag: '', + circuit_short_name: 'Silverstone', + date_start: '2026-07-03T09:00:00Z', + date_end: '2026-07-05T16:00:00Z', + year: 2026, + }, + championship_round: 1, + total_championship_rounds: 1, +} + +const rows: LiveTimingRow[] = [ + { RacingNumber: '1', Position: 1, Driver: { RacingNumber: '1', Position: 1 } as never, Info: { Tla: 'VER' } as never }, + { RacingNumber: '4', Position: 2, Driver: { RacingNumber: '4', Position: 2 } as never, Info: { Tla: 'NOR' } as never }, +] + +describe('analysisIsReady', () => { + it('is true only when local analysis is complete', () => { + expect(analysisIsReady(contextSession(11, 'Race', 'complete'))).toBe(true) + expect(analysisIsReady(contextSession(11, 'Race', 'pending'))).toBe(false) + expect(analysisIsReady(contextSession(11, 'Race', 'partial'))).toBe(false) + expect(analysisIsReady(undefined)).toBe(false) + }) +}) + +describe('LiveHandoff settling', () => { + it('shows SESSION SETTLING with a pending analysis action while ingesting', () => { + render( + , + ) + + expect(screen.getByTestId('live-settling')).toBeInTheDocument() + expect(screen.getByText('SESSION SETTLING')).toBeInTheDocument() + expect(screen.getByTestId('live-handoff-captured')).toHaveTextContent('Final feed snapshot captured') + const action = screen.getByTestId('live-handoff-analysis') + expect(action).toHaveAttribute('href', '/race-hub?session_key=11') + expect(action).toHaveAttribute('data-ready', 'false') + expect(action).toHaveTextContent('Open Race analysis') + expect(action).toHaveTextContent(/analysis will fill in as data ingests/i) + // Provisional final order from the retained snapshot. + expect(screen.getByTestId('live-handoff-snapshot')).toHaveTextContent('VER') + }) + + it('flips to analysis-ready once local ingestion completes', () => { + render( + , + ) + const action = screen.getByTestId('live-handoff-analysis') + expect(action).toHaveAttribute('data-ready', 'true') + expect(action).toHaveTextContent(/full timing, strategy & story ready/i) + }) + + it('never renders live/connected chrome or a countdown in settling', () => { + const { container } = render( + , + ) + expect(screen.queryByText('LIVE SESSION')).not.toBeInTheDocument() + expect(screen.queryByTestId('live-clock')).not.toBeInTheDocument() + expect(container.querySelector('.live-session-flag-live')).toBeNull() + }) + + it('uses non-settling readiness copy when inactive and analysis is still ingesting', () => { + render( + , + ) + const action = screen.getByTestId('live-handoff-analysis') + expect(action).toHaveAttribute('data-ready', 'false') + expect(action).toHaveTextContent(/analysis will fill in as data ingests/i) + expect(action).not.toHaveTextContent(/^Settling/i) + }) +}) + +describe('LiveHandoff inactive', () => { + it('uses shared next + recap context instead of a telemetry-offline dead end', () => { + render( + , + ) + expect(screen.getByTestId('live-inactive')).toBeInTheDocument() + expect(screen.getByText('NO LIVE SESSION')).toBeInTheDocument() + expect(screen.getByTestId('live-handoff-next')).toHaveTextContent('Qualifying') + expect(screen.getByTestId('live-handoff-recap')).toHaveTextContent('Practice 2') + // No provisional-order snapshot when inactive. + expect(screen.queryByTestId('live-handoff-snapshot')).not.toBeInTheDocument() + }) + + it('does not duplicate the recap card when previous equals the analysis target', () => { + render( + , + ) + expect(screen.queryByTestId('live-handoff-recap')).not.toBeInTheDocument() + }) + + it('falls back to Weekend when the context has nothing to offer', () => { + render( + , + ) + expect(screen.getByTestId('live-handoff-fallback')).toHaveTextContent('Weekend') + }) +}) diff --git a/frontend/src/test/LiveTimingPage.test.tsx b/frontend/src/test/LiveTimingPage.test.tsx index cb831e6..925b6eb 100644 --- a/frontend/src/test/LiveTimingPage.test.tsx +++ b/frontend/src/test/LiveTimingPage.test.tsx @@ -1,32 +1,34 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query' -import { fireEvent, render, screen, waitFor } from '@testing-library/react' -import { beforeEach, describe, expect, it, vi } from 'vitest' -import { LiveTimingPage } from '../pages/LiveTimingPage' -import type { LiveStateResponse, LiveStreamData } from '../types' +import { act, fireEvent, render, screen, waitFor } from '@testing-library/react' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { LiveTimingPage, WEEKEND_CONTEXT_POLL_MS } from '../pages/LiveTimingPage' +import type { LiveStateResponse, LiveStreamData, WeekendContext } from '../types' vi.mock('../api', () => ({ fetchLiveState: vi.fn(), fetchLiveTrackOutline: vi.fn(), + fetchWeekendContext: vi.fn(), })) -import { fetchLiveState, fetchLiveTrackOutline } from '../api' +import { fetchLiveState, fetchLiveTrackOutline, fetchWeekendContext } from '../api' const mockFetchLiveState = vi.mocked(fetchLiveState) const mockFetchLiveTrackOutline = vi.mocked(fetchLiveTrackOutline) +const mockFetchWeekendContext = vi.mocked(fetchWeekendContext) +// A MockEventSource that opens on construct but never emits a snapshot, so the +// initial /api/v1/live/state query drives the rendered phase. class MockEventSource { onopen: (() => void) | null = null onerror: (() => void) | null = null - constructor() { setTimeout(() => this.onopen?.(), 0) } - addEventListener() {} close() {} } -const archivedSnapshot: LiveStreamData = { +const raceSnapshot: LiveStreamData = { Drivers: { '1': { RacingNumber: '1', @@ -63,19 +65,10 @@ const archivedSnapshot: LiveStreamData = { LastName: 'Verstappen', }, }, - Tyres: { - '1': { Compound: 'HARD', New: false, Age: 12 }, - }, + Tyres: { '1': { Compound: 'HARD', New: false, Age: 12 } }, Telemetry: {}, RCMessages: [], - Weather: { - AirTemp: 22, - TrackTemp: 41, - Humidity: 58, - WindSpeed: 3, - WindDir: 180, - Rainfall: false, - }, + Weather: { AirTemp: 22, TrackTemp: 41, Humidity: 58, WindSpeed: 3, WindDir: 180, Rainfall: false }, Session: { MeetingName: 'Testonia Grand Prix', CircuitName: 'Testring', @@ -84,9 +77,9 @@ const archivedSnapshot: LiveStreamData = { Path: '', }, TeamRadio: [], - SessionStatus: 'Finished', + SessionStatus: 'Started', TrackStatus: '1', - CurrentLap: 57, + CurrentLap: 30, TotalLaps: 57, Clock: '', ClockRefTime: '', @@ -94,17 +87,66 @@ const archivedSnapshot: LiveStreamData = { Stints: {}, } -function renderPage(response: LiveStateResponse) { - const queryClient = new QueryClient({ - defaultOptions: { queries: { retry: false } }, - }) +function weekendContext(localAnalysis: string): WeekendContext { + return { + temporal_state: 'session_settling', + focus_meeting: { + meeting_key: 1, + meeting_name: 'Testonia Grand Prix', + meeting_official_name: 'Testonia Grand Prix', + location: 'Testring', + country_name: 'Testonia', + country_code: 'TS', + country_flag: '', + circuit_short_name: 'Testring', + date_start: '2026-07-03T09:00:00Z', + date_end: '2026-07-05T16:00:00Z', + year: 2026, + }, + default_analysis_session: { + session: { + session_key: 99, + session_name: 'Race', + session_type: 'Race', + meeting_key: 1, + date_start: '2026-07-05T14:00:00Z', + date_end: '2026-07-05T16:00:00Z', + gmt_offset: '', + }, + availability: { + schedule: 'available', + live_transport: 'unknown', + live_session: 'inactive', + archive: 'available', + local_analysis: localAnalysis, + freshness: 'fresh', + limitations: [], + }, + }, + championship_round: 1, + total_championship_rounds: 1, + } +} + +function renderPage( + response: LiveStateResponse, + context?: WeekendContext, + options: { setWeekendContext?: boolean } = {}, +) { + const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }) mockFetchLiveState.mockResolvedValue(response) mockFetchLiveTrackOutline.mockResolvedValue({ circuit_key: 1, points: [], bounds: { minX: 0, maxX: 1, minY: 0, maxY: 1 }, }) - + // Allow callers to pre-configure the weekend-context mock (e.g. pending→complete + // polling) without this helper overwriting the chain. + if (options.setWeekendContext !== false) { + mockFetchWeekendContext.mockResolvedValue( + context ?? { temporal_state: 'no_season', championship_round: 0, total_championship_rounds: 0 }, + ) + } return render( @@ -112,7 +154,7 @@ function renderPage(response: LiveStateResponse) { ) } -describe('LiveTimingPage archive mode', () => { +describe('LiveTimingPage', () => { beforeEach(() => { vi.clearAllMocks() Object.defineProperty(window, 'EventSource', { @@ -122,45 +164,162 @@ describe('LiveTimingPage archive mode', () => { }) }) - it('keeps archived snapshots behind the View Last Session action', async () => { - renderPage({ - is_live: false, - data: null, - last_snapshot: archivedSnapshot, - last_positions: { - '1': { x: 10, y: 20, z: 0, status: 'OnTrack' }, + afterEach(() => { + vi.useRealTimers() + }) + + it('renders the live timing tower for an active session', async () => { + renderPage({ is_live: true, data: raceSnapshot }) + expect(await screen.findByText('Timing Tower')).toBeInTheDocument() + expect(screen.getByTestId('live-page')).toHaveAttribute('data-phase', 'live') + expect(screen.getByTestId('live-session-flag')).toHaveTextContent('LIVE SESSION') + expect(screen.getByTestId('live-feed-health')).toBeInTheDocument() + expect(screen.getAllByText('VER').length).toBeGreaterThan(0) + }) + + it('enters the settling handoff (not archive) when the session ends cleanly', async () => { + renderPage( + { + is_live: false, + data: null, + last_snapshot: { ...raceSnapshot, SessionStatus: 'Finished' }, + last_snapshot_at: '2026-07-05T16:02:00Z', }, - last_snapshot_at: '2026-07-04T14:00:00Z', + weekendContext('pending'), + ) + + const settling = await screen.findByTestId('live-settling') + expect(settling).toBeInTheDocument() + expect(screen.getByTestId('live-page')).toHaveAttribute('data-phase', 'settling') + // Canonical default-analysis session drives the primary action target. + await waitFor(() => + expect(screen.getByTestId('live-handoff-analysis')).toHaveAttribute( + 'href', + '/race-hub?session_key=99', + ), + ) + // The timing tower is not shown while settling — it is a handoff surface. + expect(screen.queryByText('Timing Tower')).not.toBeInTheDocument() + }) + + it('flips settling → analysis-ready when polling sees ingestion complete', async () => { + vi.useFakeTimers({ shouldAdvanceTime: true }) + // First fetch: pending. Subsequent polls: complete. + mockFetchWeekendContext + .mockResolvedValueOnce(weekendContext('pending')) + .mockResolvedValue(weekendContext('complete')) + + renderPage( + { + is_live: false, + data: null, + last_snapshot: { ...raceSnapshot, SessionStatus: 'Finished' }, + last_snapshot_at: '2026-07-05T16:02:00Z', + }, + undefined, + { setWeekendContext: false }, + ) + + const action = await screen.findByTestId('live-handoff-analysis') + expect(action).toHaveAttribute('data-ready', 'false') + expect(action).toHaveTextContent(/analysis will fill in as data ingests/i) + + await act(async () => { + await vi.advanceTimersByTimeAsync(WEEKEND_CONTEXT_POLL_MS + 500) }) - expect(await screen.findByTestId('live-empty')).toHaveTextContent('No live session active') + await waitFor(() => + expect(screen.getByTestId('live-handoff-analysis')).toHaveAttribute('data-ready', 'true'), + ) + expect(screen.getByTestId('live-handoff-analysis')).toHaveTextContent( + /full timing, strategy & story ready/i, + ) + }) + + it('retains the last snapshot with a disconnected warning (not settling) on a feed drop', async () => { + // is_live=false but the retained snapshot has a NON-terminal SessionStatus: + // the FIA feed dropped while the session was still active. + renderPage( + { + is_live: false, + data: null, + last_snapshot: { ...raceSnapshot, SessionStatus: 'Started' }, + last_snapshot_at: '2026-07-05T15:30:00Z', + }, + weekendContext('pending'), + ) + + expect(await screen.findByTestId('live-disconnected-strip')).toHaveTextContent( + /showing the last live data/i, + ) + expect(screen.getByTestId('live-page')).toHaveAttribute('data-phase', 'disconnected') + // The retained live tower stays visible; we never fell into settling/archive. + expect(screen.getByText('Timing Tower')).toBeInTheDocument() + expect(screen.queryByTestId('live-settling')).not.toBeInTheDocument() + expect(screen.queryByTestId('live-archive-strip')).not.toBeInTheDocument() + }) + + it('keeps the settled snapshot behind an explicit read-only archive action', async () => { + renderPage( + { + is_live: false, + data: null, + last_snapshot: { ...raceSnapshot, SessionStatus: 'Finished' }, + last_positions: { '1': { x: 10, y: 20, z: 0, status: 'OnTrack' } }, + last_snapshot_at: '2026-07-05T16:02:00Z', + }, + weekendContext('complete'), + ) + + // Settling first — the tower is hidden until the user opens the archive. + await screen.findByTestId('live-settling') expect(screen.queryByText('Timing Tower')).not.toBeInTheDocument() - fireEvent.click(screen.getByRole('button', { name: /view last session/i })) + fireEvent.click(screen.getByTestId('live-handoff-archive')) - await waitFor(() => { - expect(screen.getByTestId('live-archive-strip')).toHaveTextContent('Archived snapshot') - }) + await waitFor(() => + expect(screen.getByTestId('live-archive-strip')).toHaveTextContent(/read-only/i), + ) expect(screen.getByText('Timing Tower')).toBeInTheDocument() - expect(screen.getAllByText('VER').length).toBeGreaterThan(0) + // Archive presents its read-only, timestamped chrome — never LIVE. expect(screen.getByText('archive')).toBeInTheDocument() + expect(screen.queryByText('LIVE SESSION')).not.toBeInTheDocument() }) - it('does not show the archive action when no snapshot is retained', async () => { - renderPage({ is_live: false, data: null }) + it('shows the inactive weekend context when nothing is live or retained', async () => { + renderPage( + { is_live: false, data: null }, + { + temporal_state: 'between_weekends', + next_session: { + session: { + session_key: 21, + session_name: 'Practice 1', + session_type: 'Practice 1', + meeting_key: 2, + date_start: '2026-07-17T09:00:00Z', + date_end: '2026-07-17T10:00:00Z', + gmt_offset: '', + }, + availability: { + schedule: 'available', + live_transport: 'unknown', + live_session: 'inactive', + archive: 'unavailable', + local_analysis: 'not_applicable', + freshness: 'fresh', + limitations: [], + }, + }, + championship_round: 2, + total_championship_rounds: 24, + }, + ) - expect(await screen.findByTestId('live-empty')).toHaveTextContent('No live session active') - expect(screen.queryByRole('button', { name: /view last session/i })).not.toBeInTheDocument() - }) - - it('temporarily omits the track map while live GPS is unavailable', async () => { - renderPage({ - is_live: true, - data: { ...archivedSnapshot, SessionStatus: 'Started' }, - }) - - expect(await screen.findByText('Timing Tower')).toBeInTheDocument() - expect(screen.queryByText('Track Map')).not.toBeInTheDocument() - expect(mockFetchLiveTrackOutline).not.toHaveBeenCalled() + expect(await screen.findByTestId('live-inactive')).toBeInTheDocument() + expect(screen.getByTestId('live-page')).toHaveAttribute('data-phase', 'inactive') + await waitFor(() => + expect(screen.getByTestId('live-handoff-next')).toHaveTextContent('Practice 1'), + ) }) }) diff --git a/frontend/src/test/liveState.test.ts b/frontend/src/test/liveState.test.ts new file mode 100644 index 0000000..2ae27ae --- /dev/null +++ b/frontend/src/test/liveState.test.ts @@ -0,0 +1,169 @@ +import { describe, expect, it } from 'vitest' +import { + allowsLiveInterpretations, + deriveLivePhase, + isReadOnlyPhase, + rendersSnapshot, + terminalSessionStatus, + type LiveStateInputs, +} from '../lib/liveState' + +const base: LiveStateInputs = { + transport: 'connecting', + isLive: false, + hasActiveSnapshot: false, + hasArchive: false, + archiveMode: false, + sessionEndedCleanly: false, + wasLive: false, + stateLoaded: false, +} + +describe('terminalSessionStatus', () => { + it('recognizes genuine session-end statuses', () => { + for (const s of ['Finished', 'Finalised', 'Finalized', 'ENDED', 'Aborted']) { + expect(terminalSessionStatus(s)).toBe(true) + } + }) + + it('treats still-running / unknown statuses as non-terminal', () => { + for (const s of ['Started', 'Resumed', 'Inactive', '', undefined, null]) { + expect(terminalSessionStatus(s)).toBe(false) + } + }) +}) + +describe('deriveLivePhase transitions', () => { + it('connecting: cold start with the feed still opening', () => { + expect(deriveLivePhase({ ...base, transport: 'connecting' })).toBe('connecting') + }) + + it('connecting → live once a session snapshot arrives', () => { + expect( + deriveLivePhase({ + ...base, + transport: 'connected', + isLive: true, + hasActiveSnapshot: true, + }), + ).toBe('live') + }) + + it('live → disconnected when the SSE transport drops mid-session', () => { + expect( + deriveLivePhase({ + ...base, + transport: 'disconnected', + isLive: true, + hasActiveSnapshot: true, + wasLive: true, + }), + ).toBe('disconnected') + }) + + it('live → settling when the session ends with a terminal status', () => { + // Feed reports is_live=false, transport healthy, retained snapshot carries a + // terminal SessionStatus → the session genuinely finished. + expect( + deriveLivePhase({ + ...base, + transport: 'connected', + isLive: false, + hasArchive: true, + sessionEndedCleanly: true, + wasLive: true, + }), + ).toBe('settling') + }) + + it('live → disconnected (NOT settling) when the FIA feed drops but status is non-terminal', () => { + // This is the P0 case: server deactivate() moved a still-active snapshot to + // last_snapshot with is_live=false but a non-terminal SessionStatus. The + // browser transport is healthy. We must warn + retain, never settle/archive. + expect( + deriveLivePhase({ + ...base, + transport: 'connected', + isLive: false, + hasArchive: true, + sessionEndedCleanly: false, + wasLive: true, + }), + ).toBe('disconnected') + }) + + it('a retained non-terminal snapshot on cold load is disconnected, not settling', () => { + expect( + deriveLivePhase({ + ...base, + transport: 'connected', + isLive: false, + hasArchive: true, + sessionEndedCleanly: false, + wasLive: false, + }), + ).toBe('disconnected') + }) + + it('settling → archive when the user explicitly opens the read-only snapshot', () => { + expect( + deriveLivePhase({ + ...base, + transport: 'connected', + isLive: false, + hasArchive: true, + sessionEndedCleanly: true, + archiveMode: true, + }), + ).toBe('archive') + }) + + it('archive mode wins over an active session (user-chosen read-only view)', () => { + expect( + deriveLivePhase({ + ...base, + transport: 'connected', + isLive: true, + hasActiveSnapshot: true, + hasArchive: true, + archiveMode: true, + }), + ).toBe('archive') + }) + + it('inactive when there is no session and nothing retained', () => { + expect(deriveLivePhase({ ...base, transport: 'connected', stateLoaded: true })).toBe('inactive') + }) + + it('leaves connecting for inactive once the initial state resolves, even mid-handshake', () => { + // connecting → inactive: the SSE transport handshake is still pending + // (transport === "connecting") but the initial live-state query resolved as + // idle, so we must not spin on "connecting…" forever. + expect(deriveLivePhase({ ...base, transport: 'connecting', stateLoaded: true })).toBe('inactive') + }) +}) + +describe('phase capability helpers', () => { + it('renders the snapshot surface only for live/disconnected/archive', () => { + expect(rendersSnapshot('live')).toBe(true) + expect(rendersSnapshot('disconnected')).toBe(true) + expect(rendersSnapshot('archive')).toBe(true) + expect(rendersSnapshot('settling')).toBe(false) + expect(rendersSnapshot('inactive')).toBe(false) + expect(rendersSnapshot('connecting')).toBe(false) + }) + + it('allows live-only interpretations only while the session is moving', () => { + expect(allowsLiveInterpretations('live')).toBe(true) + expect(allowsLiveInterpretations('disconnected')).toBe(true) + // A frozen archive frame must never present live-only interpretations. + expect(allowsLiveInterpretations('archive')).toBe(false) + expect(allowsLiveInterpretations('settling')).toBe(false) + }) + + it('marks archive as the read-only phase', () => { + expect(isReadOnlyPhase('archive')).toBe(true) + expect(isReadOnlyPhase('live')).toBe(false) + expect(isReadOnlyPhase('disconnected')).toBe(false) + }) +}) diff --git a/tests/live-timing.spec.ts b/tests/live-timing.spec.ts index d392372..fb46235 100644 --- a/tests/live-timing.spec.ts +++ b/tests/live-timing.spec.ts @@ -93,6 +93,7 @@ const raceSnapshot = { SessionType: 'Race', SessionName: 'Race', }, + SessionStatus: 'Started', TrackStatus: '2', CurrentLap: 30, TotalLaps: 57, @@ -138,6 +139,7 @@ const sprintQualifyingSnapshot = { SessionType: 'Sprint Qualifying', SessionName: 'Sprint Qualifying', }, + SessionStatus: 'Started', TrackStatus: '1', CurrentLap: 0, TotalLaps: 0, @@ -164,6 +166,12 @@ test.describe('Live Timing (mocked snapshot)', () => { test('renders timing tower with drivers from the snapshot', async ({ page }) => { await expect(page.getByTestId('live-page')).toBeVisible() + // The hermetic SSE mock ends after a heartbeat, so transport may drop to + // disconnected while the session snapshot remains active — both phases keep + // the LIVE SESSION chrome and timing tower. + await expect(page.getByTestId('live-page')).toHaveAttribute('data-phase', /^(live|disconnected)$/) + await expect(page.getByTestId('live-session-flag')).toContainText('LIVE SESSION') + await expect(page.getByTestId('live-feed-health')).toBeVisible() const tower = page.locator('.live-tower') await expect(tower).toBeVisible() await expect(tower).toContainText('VER') @@ -233,45 +241,142 @@ test.describe('Live Timing (mocked Sprint Qualifying)', () => { }) }) +const weekendContext = (localAnalysis: string) => ({ + temporal_state: 'session_settling', + focus_meeting: { + meeting_key: 1, + meeting_name: 'Testonia Grand Prix', + meeting_official_name: 'Testonia Grand Prix', + location: 'Testring', + country_name: 'Testonia', + country_code: 'TS', + country_flag: '', + circuit_short_name: 'Testring', + date_start: '2026-07-03T09:00:00Z', + date_end: '2026-07-05T16:00:00Z', + year: 2026, + }, + default_analysis_session: { + session: { + session_key: 9472, + session_name: 'Race', + session_type: 'Race', + meeting_key: 1, + date_start: '2026-07-05T14:00:00Z', + date_end: '2026-07-05T16:00:00Z', + gmt_offset: '', + }, + availability: { + schedule: 'available', + live_transport: 'unknown', + live_session: 'inactive', + archive: 'available', + local_analysis: localAnalysis, + freshness: 'fresh', + limitations: [], + }, + }, + championship_round: 1, + total_championship_rounds: 1, +}) + +const heartbeatStream = (route: import('@playwright/test').Route) => + route.fulfill({ contentType: 'text/event-stream', body: 'event: heartbeat\ndata: {}\n\n' }) + test.describe('Live Timing (no session)', () => { - test('shows the empty state when the feed has no snapshot', async ({ page }) => { + test('shows the inactive weekend-context handoff when the feed has no snapshot', async ({ page }) => { + await page.route('**/api/v1/live/stream', heartbeatStream) await page.goto('/live') - await expect(page.getByTestId('live-empty')).toBeVisible() - await expect(page.getByTestId('live-page')).toContainText('No live session active') + // The e2e server (BOXBOX_DISABLE_LIVE=1) exposes a real /api/v1/weekend-context. + await expect(page.getByTestId('live-inactive')).toBeVisible() + await expect(page.getByTestId('live-page')).toHaveAttribute('data-phase', 'inactive') + await expect(page.getByText('NO LIVE SESSION')).toBeVisible() }) - test('renders an archived snapshot only after View Last Session', async ({ page }) => { + test('enters settling (not archive) when a finished session is retained', async ({ page }) => { await page.route('**/api/v1/live/state', (route) => route.fulfill({ contentType: 'application/json', body: JSON.stringify({ is_live: false, data: null, - last_snapshot: { - ...raceSnapshot.data, - SessionStatus: 'Finished', - }, - last_positions: { - '1': { x: 100, y: -50, z: 2, status: 'OnTrack' }, - }, + last_snapshot: { ...raceSnapshot.data, SessionStatus: 'Finished' }, + last_positions: { '1': { x: 100, y: -50, z: 2, status: 'OnTrack' } }, last_snapshot_at: '2026-07-04T14:00:00Z', }), }), ) - await page.route('**/api/v1/live/stream', (route) => - route.fulfill({ - contentType: 'text/event-stream', - body: 'event: heartbeat\ndata: {}\n\n', - }), + await page.route('**/api/v1/weekend-context', (route) => + route.fulfill({ contentType: 'application/json', body: JSON.stringify(weekendContext('complete')) }), ) + await page.route('**/api/v1/live/stream', heartbeatStream) await page.goto('/live') - await expect(page.getByTestId('live-empty')).toContainText('No live session active') + await expect(page.getByTestId('live-settling')).toBeVisible() + await expect(page.getByTestId('live-page')).toHaveAttribute('data-phase', 'settling') + await expect(page.getByText('SESSION SETTLING')).toBeVisible() await expect(page.getByText('Timing Tower')).toHaveCount(0) + // Canonical weekend-context drives the analysis target + readiness. + const analysis = page.getByTestId('live-handoff-analysis') + await expect(analysis).toHaveAttribute('href', '/race-hub?session_key=9472') + await expect(analysis).toHaveAttribute('data-ready', 'true') - await page.getByRole('button', { name: 'View Last Session' }).click() - await expect(page.getByTestId('live-archive-strip')).toContainText('Archived snapshot') + // Opening the read-only archive reveals the frozen tower, never LIVE chrome. + await page.getByTestId('live-handoff-archive').click() + await expect(page.getByTestId('live-archive-strip')).toContainText('read-only') await expect(page.getByText('Timing Tower')).toBeVisible() await expect(page.locator('.live-state')).toContainText('archive') + await expect(page.getByText('LIVE SESSION')).toHaveCount(0) + }) + + test('settling shows pending analysis until weekend-context reports complete', async ({ page }) => { + await page.route('**/api/v1/live/state', (route) => + route.fulfill({ + contentType: 'application/json', + body: JSON.stringify({ + is_live: false, + data: null, + last_snapshot: { ...raceSnapshot.data, SessionStatus: 'Finished' }, + last_snapshot_at: '2026-07-04T14:00:00Z', + }), + }), + ) + await page.route('**/api/v1/weekend-context', (route) => + route.fulfill({ contentType: 'application/json', body: JSON.stringify(weekendContext('pending')) }), + ) + await page.route('**/api/v1/live/stream', heartbeatStream) + + await page.goto('/live') + await expect(page.getByTestId('live-settling')).toBeVisible() + const analysis = page.getByTestId('live-handoff-analysis') + await expect(analysis).toHaveAttribute('data-ready', 'false') + await expect(analysis).toContainText(/analysis will fill in as data ingests/i) + }) + + test('retains the last live snapshot with a disconnected warning on a feed drop', async ({ page }) => { + // is_live=false but SessionStatus is still "Started": the FIA feed dropped + // mid-session. The page must warn + retain the live tower, never settle. + await page.route('**/api/v1/live/state', (route) => + route.fulfill({ + contentType: 'application/json', + body: JSON.stringify({ + is_live: false, + data: null, + last_snapshot: { ...raceSnapshot.data, SessionStatus: 'Started' }, + last_snapshot_at: '2026-07-04T13:30:00Z', + }), + }), + ) + await page.route('**/api/v1/weekend-context', (route) => + route.fulfill({ contentType: 'application/json', body: JSON.stringify(weekendContext('pending')) }), + ) + await page.route('**/api/v1/live/stream', heartbeatStream) + + await page.goto('/live') + await expect(page.getByTestId('live-page')).toHaveAttribute('data-phase', 'disconnected') + await expect(page.getByTestId('live-disconnected-strip')).toContainText('last live data') + await expect(page.getByText('Timing Tower')).toBeVisible() + await expect(page.getByTestId('live-settling')).toHaveCount(0) + await expect(page.getByTestId('live-archive-strip')).toHaveCount(0) }) }) diff --git a/tests/production-smoke.spec.ts b/tests/production-smoke.spec.ts index 731c2ac..bdfa9be 100644 --- a/tests/production-smoke.spec.ts +++ b/tests/production-smoke.spec.ts @@ -37,11 +37,11 @@ test.describe('Production serving (Go + built React)', () => { await expect(page.getByTestId('dl-meeting-1229')).toBeVisible() }) - test('serves live route with empty state when live is disabled', async ({ page }) => { + test('serves live route with the inactive handoff when live is disabled', async ({ page }) => { await page.goto('/live') - await expect(page.getByTestId('live-empty')).toBeVisible() - await expect(page.getByText('No live session active')).toBeVisible() + await expect(page.getByTestId('live-inactive')).toBeVisible() + await expect(page.getByText('NO LIVE SESSION')).toBeVisible() }) test('primary nav links and Admin utility work from built SPA', async ({ page }) => { diff --git a/tests/visual/__snapshots__/desktop/live.png b/tests/visual/__snapshots__/desktop/live.png index 50a353b919e9b895a866da0f5ae97d896c2c544e..abdc4441b17015919283c0910bfb24e4c0a4c6f5 100644 GIT binary patch literal 58386 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 J^|w0?{0qNwBeehk literal 12863 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 { await waitForScreenshotReady(page) } -export async function gotoLiveEmptyReady(page: Page): Promise { +export async function gotoLiveInactiveReady(page: Page): Promise { await page.goto('/live') await expect(page.locator('.loading-state')).toHaveCount(0) - await expect(page.getByTestId('live-empty')).toBeVisible() + // With BOXBOX_DISABLE_LIVE=1 the feed is silent, so the page settles into the + // inactive weekend-context handoff sourced from /api/v1/weekend-context. + await expect(page.getByTestId('live-inactive')).toBeVisible() await waitForScreenshotReady(page) } diff --git a/tests/visual/mvp-screens.spec.ts b/tests/visual/mvp-screens.spec.ts index e6f063a..0d30711 100644 --- a/tests/visual/mvp-screens.spec.ts +++ b/tests/visual/mvp-screens.spec.ts @@ -2,7 +2,7 @@ import { test } from '@playwright/test' import { gotoWeekendReady, gotoDataLibraryReady, - gotoLiveEmptyReady, + gotoLiveInactiveReady, gotoRaceHubFutureReady, gotoRaceHubReady, screenshotPage, @@ -32,8 +32,8 @@ test.describe('MVP visual regression', () => { await screenshotPage(page, 'data-library') }) - test('live-empty', async ({ page }) => { - await gotoLiveEmptyReady(page) + test('live-inactive', async ({ page }) => { + await gotoLiveInactiveReady(page) await screenshotPage(page, 'live') }) })