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>
128 lines
3.8 KiB
Swift
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: "🍽️"))
|
|
)
|
|
}
|
|
}
|