Files
Sportstime/SportsTimeTests/Features/Progress/GamesHistoryViewModelTests.swift
Trey t 89167c01d7 feat(progress): add progress tracking enhancements
- Enable zoom/pan on progress map with reset button
- Add visit count badges to stadium chips
- Create GamesHistoryView with year grouping and sport filters
- Create StadiumVisitHistoryView for viewing all visits to a stadium
- Add VisitListCard and GamesHistoryRow components
- Add "See All" navigation from Recent Visits to Games History
- Add tests for map interactions, visit lists, and games history

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-12 21:34:33 -06:00

111 lines
3.7 KiB
Swift

import XCTest
import SwiftData
@testable import SportsTime
@MainActor
final class GamesHistoryViewModelTests: XCTestCase {
var modelContainer: ModelContainer!
var modelContext: ModelContext!
override func setUp() async throws {
let config = ModelConfiguration(isStoredInMemoryOnly: true)
modelContainer = try ModelContainer(
for: StadiumVisit.self, Achievement.self, UserPreferences.self,
configurations: config
)
modelContext = modelContainer.mainContext
}
override func tearDown() async throws {
modelContainer = nil
modelContext = nil
}
func test_GamesHistoryViewModel_GroupsVisitsByYear() async throws {
// Given: Visits in different years
let visit2026 = StadiumVisit(
stadiumId: "stadium-1",
stadiumNameAtVisit: "Stadium 2026",
visitDate: Calendar.current.date(from: DateComponents(year: 2026, month: 6, day: 15))!,
visitType: .game,
dataSource: .manual
)
let visit2025 = StadiumVisit(
stadiumId: "stadium-2",
stadiumNameAtVisit: "Stadium 2025",
visitDate: Calendar.current.date(from: DateComponents(year: 2025, month: 6, day: 15))!,
visitType: .game,
dataSource: .manual
)
modelContext.insert(visit2026)
modelContext.insert(visit2025)
try modelContext.save()
// When: Loading games history
let viewModel = GamesHistoryViewModel(modelContext: modelContext)
await viewModel.loadGames()
// Then: Visits are grouped by year
XCTAssertEqual(viewModel.visitsByYear.keys.count, 2, "Should have 2 years")
XCTAssertTrue(viewModel.visitsByYear.keys.contains(2026))
XCTAssertTrue(viewModel.visitsByYear.keys.contains(2025))
}
func test_GamesHistoryViewModel_FiltersBySport() async throws {
// Given: Visits to different sport stadiums
// Note: This requires stadiums in AppDataProvider to map stadiumId sport
let mlbVisit = StadiumVisit(
stadiumId: "yankee-stadium",
stadiumNameAtVisit: "Yankee Stadium",
visitDate: Date(),
visitType: .game,
dataSource: .manual
)
modelContext.insert(mlbVisit)
try modelContext.save()
// When: Filtering by MLB
let viewModel = GamesHistoryViewModel(modelContext: modelContext)
await viewModel.loadGames()
viewModel.selectedSports = [.mlb]
// Then: Only MLB visits shown
let filteredCount = viewModel.filteredVisits.count
XCTAssertGreaterThanOrEqual(filteredCount, 0, "Filter should work without crashing")
}
func test_GamesHistoryViewModel_SortsMostRecentFirst() async throws {
// Given: Visits on different dates
let oldVisit = StadiumVisit(
stadiumId: "stadium-1",
stadiumNameAtVisit: "Old Stadium",
visitDate: Date().addingTimeInterval(-86400 * 30), // 30 days ago
visitType: .game,
dataSource: .manual
)
let newVisit = StadiumVisit(
stadiumId: "stadium-2",
stadiumNameAtVisit: "New Stadium",
visitDate: Date(),
visitType: .game,
dataSource: .manual
)
modelContext.insert(oldVisit)
modelContext.insert(newVisit)
try modelContext.save()
// When: Loading games
let viewModel = GamesHistoryViewModel(modelContext: modelContext)
await viewModel.loadGames()
// Then: Most recent first within year
let visits = viewModel.allVisits
XCTAssertEqual(visits.first?.stadiumNameAtVisit, "New Stadium", "Most recent should be first")
}
}