Files
Sportstime/SportsTimeTests/Features/Trip/ItineraryTestHelpers.swift
Trey T a6f538dfed Audit and fix 52 test correctness issues across 22 files
Systematic audit of 1,191 tests found tests written to pass rather than
verify correctness. Key fixes:

Infrastructure:
- TestClock: fixed timezone from .current to America/New_York (deterministic)
- TestFixtures: added 1.3x road routing factor to match production
- ItineraryTestHelpers: real per-city coordinates instead of hardcoded (40,-80)

Planning tests:
- Added missing Scenario E factory dispatch tests
- Tightened 12 loose assertions (>= 1 → == 8.0, > 0 → range checks)
- Fixed 4 no-op tests that accepted both success and failure
- Fixed wrong repeat-city invariant (was checking same-day, not different-day)
- Fixed tautological assertion in missing-stadium edge case

Services/Domain/Export tests:
- Replaced 4 placeholder tests (#expect(true)) with real assertions
- Fixed tautological assertions in POISearchServiceTests
- Fixed Chicago coordinate in RegionMapSelectorTests (-89 → -87.6553)
- Added sort order verification to ItineraryRowFlatteningTests

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 23:00:46 -05:00

128 lines
3.8 KiB
Swift

//
// ItineraryTestHelpers.swift
// SportsTimeTests
//
// Shared test fixtures and helpers for Itinerary tests.
//
import CoreLocation
import Foundation
@testable import SportsTime
/// Shared test fixtures for itinerary tests
enum ItineraryTestHelpers {
static let testTripId = UUID()
static let testDate = TestClock.now
// MARK: - Day Helpers
static func makeDays(count: Int, from baseDate: Date = testDate) -> [ItineraryDayData] {
return (0..<count).map { i in
ItineraryDayData(
id: i + 1,
dayNumber: i + 1,
date: TestClock.calendar.date(byAdding: .day, value: i, to: baseDate)!,
games: [],
items: [],
travelBefore: nil
)
}
}
static func dayAfter(_ date: Date) -> Date {
TestClock.calendar.date(byAdding: .day, value: 1, to: date)!
}
// MARK: - Travel Helpers
static func makeTravelSegment(from: String, to: String) -> TravelSegment {
TravelSegment(
fromLocation: LocationInput(name: from, coordinate: nil),
toLocation: LocationInput(name: to, coordinate: nil),
travelMode: .drive,
distanceMeters: 500_000,
durationSeconds: 18000
)
}
static func makeTravelItem(from: String, to: String, day: Int, sortOrder: Double) -> ItineraryItem {
ItineraryItem(
tripId: testTripId,
day: day,
sortOrder: sortOrder,
kind: .travel(TravelInfo(fromCity: from, toCity: to))
)
}
// MARK: - Game Helpers
static func makeRichGame(city: String, hour: Int, baseDate: Date = testDate) -> RichGame {
var dateComponents = TestClock.calendar.dateComponents([.year, .month, .day], from: baseDate)
dateComponents.hour = hour
let gameTime = TestClock.calendar.date(from: dateComponents)!
let game = Game(
id: "game-\(city)-\(UUID().uuidString.prefix(4))",
homeTeamId: "team-\(city)",
awayTeamId: "team-visitor",
stadiumId: "stadium-\(city)",
dateTime: gameTime,
sport: .mlb,
season: "2026",
isPlayoff: false
)
let coord = TestFixtures.coordinates[city] ?? CLLocationCoordinate2D(latitude: 40.0, longitude: -80.0)
let stadium = Stadium(
id: "stadium-\(city)",
name: "\(city) Stadium",
city: city,
state: "XX",
latitude: coord.latitude,
longitude: coord.longitude,
capacity: 40000,
sport: .mlb
)
let homeTeam = Team(
id: "team-\(city)",
name: "\(city) Team",
abbreviation: String(city.prefix(3)).uppercased(),
sport: .mlb,
city: city,
stadiumId: "stadium-\(city)"
)
let awayTeam = Team(
id: "team-visitor",
name: "Visitor Team",
abbreviation: "VIS",
sport: .mlb,
city: "Visiting",
stadiumId: "stadium-visitor"
)
return RichGame(game: game, homeTeam: homeTeam, awayTeam: awayTeam, stadium: stadium)
}
static func makeGameItem(city: String, day: Int, sortOrder: Double = 100) -> ItineraryItem {
ItineraryItem(
tripId: testTripId,
day: day,
sortOrder: sortOrder,
kind: .game(gameId: "game-\(city)-\(UUID().uuidString.prefix(4))", city: city)
)
}
// MARK: - Custom Item Helpers
static func makeCustomItem(day: Int, sortOrder: Double, title: String) -> ItineraryItem {
ItineraryItem(
tripId: testTripId,
day: day,
sortOrder: sortOrder,
kind: .custom(CustomInfo(title: title, icon: "🍽️"))
)
}
}