mirror of
https://github.com/AmanTahiliani/box-box.git
synced 2026-08-08 12:07:23 -04:00
91 lines
2.8 KiB
Go
91 lines
2.8 KiB
Go
|
|
package web
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/json"
|
||
|
|
"net/http"
|
||
|
|
"net/http/httptest"
|
||
|
|
"testing"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"github.com/AmanTahiliani/box-box/internal/live"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestSSEHubArchivesTerminalSessionSnapshot(t *testing.T) {
|
||
|
|
hub := newSSEHub()
|
||
|
|
now := time.Date(2026, 7, 4, 14, 0, 0, 0, time.UTC)
|
||
|
|
active := live.LiveStreamData{
|
||
|
|
SessionStatus: "Started",
|
||
|
|
Drivers: map[string]live.LiveDriverData{
|
||
|
|
"1": {RacingNumber: "1", Position: 1},
|
||
|
|
},
|
||
|
|
Positions: map[string]live.LivePositionData{
|
||
|
|
"1": {X: 100, Y: -50, Z: 2, Status: "OnTrack"},
|
||
|
|
},
|
||
|
|
PositionUpdated: true,
|
||
|
|
SnapshotUpdated: true,
|
||
|
|
}
|
||
|
|
if state := hub.applySnapshot(active, now); !state.IsLive || state.Data == nil {
|
||
|
|
t.Fatalf("active state = %+v, want live data", state)
|
||
|
|
}
|
||
|
|
|
||
|
|
terminal := active
|
||
|
|
terminal.SessionStatus = "Finished"
|
||
|
|
terminal.Positions = nil
|
||
|
|
terminal.PositionUpdated = false
|
||
|
|
state := hub.applySnapshot(terminal, now.Add(time.Minute))
|
||
|
|
|
||
|
|
if state.IsLive {
|
||
|
|
t.Fatal("terminal SessionStatus should not be live")
|
||
|
|
}
|
||
|
|
if state.Data != nil {
|
||
|
|
t.Fatalf("inactive state data = %+v, want nil", state.Data)
|
||
|
|
}
|
||
|
|
if state.LastSnapshot == nil || state.LastSnapshot.SessionStatus != "Finished" {
|
||
|
|
t.Fatalf("last snapshot = %+v, want terminal snapshot", state.LastSnapshot)
|
||
|
|
}
|
||
|
|
if got := state.LastPositions["1"]; got.X != 100 || got.Status != "OnTrack" {
|
||
|
|
t.Fatalf("last positions = %+v, want carried active positions", state.LastPositions)
|
||
|
|
}
|
||
|
|
if state.LastSnapshotAt == nil || !state.LastSnapshotAt.Equal(now.Add(time.Minute)) {
|
||
|
|
t.Fatalf("last snapshot time = %v, want %v", state.LastSnapshotAt, now.Add(time.Minute))
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestHandleLiveStateKeepsArchiveOutOfActiveData(t *testing.T) {
|
||
|
|
hub := newSSEHub()
|
||
|
|
now := time.Date(2026, 7, 4, 14, 0, 0, 0, time.UTC)
|
||
|
|
hub.applySnapshot(live.LiveStreamData{
|
||
|
|
SessionStatus: "Finished",
|
||
|
|
Session: live.LiveSessionMeta{MeetingName: "British Grand Prix", SessionName: "Race"},
|
||
|
|
Drivers: map[string]live.LiveDriverData{
|
||
|
|
"44": {RacingNumber: "44", Position: 1},
|
||
|
|
},
|
||
|
|
SnapshotUpdated: true,
|
||
|
|
}, now)
|
||
|
|
|
||
|
|
srv := &Server{hub: hub}
|
||
|
|
req := httptest.NewRequest(http.MethodGet, "/api/v1/live/state", nil)
|
||
|
|
rec := httptest.NewRecorder()
|
||
|
|
srv.handleLiveState(rec, req)
|
||
|
|
|
||
|
|
if rec.Code != http.StatusOK {
|
||
|
|
t.Fatalf("status = %d, want 200", rec.Code)
|
||
|
|
}
|
||
|
|
var resp liveStatePayload
|
||
|
|
if err := json.Unmarshal(rec.Body.Bytes(), &resp); err != nil {
|
||
|
|
t.Fatalf("decode response: %v", err)
|
||
|
|
}
|
||
|
|
if resp.IsLive {
|
||
|
|
t.Fatal("archived snapshot should report is_live=false")
|
||
|
|
}
|
||
|
|
if resp.Data != nil {
|
||
|
|
t.Fatalf("archived snapshot leaked into data: %+v", resp.Data)
|
||
|
|
}
|
||
|
|
if resp.LastSnapshot == nil || resp.LastSnapshot.Session.MeetingName != "British Grand Prix" {
|
||
|
|
t.Fatalf("last snapshot = %+v, want archived race", resp.LastSnapshot)
|
||
|
|
}
|
||
|
|
if resp.LastSnapshotAt == nil {
|
||
|
|
t.Fatal("last_snapshot_at should be present for archived snapshots")
|
||
|
|
}
|
||
|
|
}
|