diff --git a/SportsTimeUITests/Tests/TripWizardFlowTests.swift b/SportsTimeUITests/Tests/TripWizardFlowTests.swift index e819b25..aef3de5 100644 --- a/SportsTimeUITests/Tests/TripWizardFlowTests.swift +++ b/SportsTimeUITests/Tests/TripWizardFlowTests.swift @@ -4,7 +4,7 @@ // // Tests the trip planning wizard: planning modes, calendar navigation, // sport/region selection, and planning engine results. -// QA Sheet: F-018 through F-042, F-047 +// QA Sheet: F-018 through F-042, F-047; also F-030, F-031, F-032 // import XCTest @@ -151,7 +151,80 @@ final class TripWizardFlowTests: BaseUITestCase { captureScreenshot(named: "F026-DateRangeSelected") } - // MARK: - Sport Selection (F-030, F-031) + // MARK: - Date Edge Cases (F-030, F-031, F-032) + + /// F-030: Tapping end date before start date — selection auto-corrects. + @MainActor + func testF030_DateRangeEndBeforeStart() { + let (_, wizard) = openWizard() + wizard.selectDateRangeMode() + + // Navigate to a future month + wizard.selectDateRange( + targetMonth: "July", + targetYear: "2026", + startDay: "2026-07-15", + endDay: "2026-07-10" + ) + + // The picker auto-corrects: if second tap is before first, + // it swaps them so start <= end. No crash or error. + captureScreenshot(named: "F030-EndBeforeStart") + } + + /// F-031: Tapping the same date twice selects a single-day trip. + @MainActor + func testF031_DateRangeSameDay() { + let (_, wizard) = openWizard() + wizard.selectDateRangeMode() + + // Navigate to July 2026 and tap the same day twice + wizard.monthLabel.scrollIntoView(in: app.scrollViews.firstMatch) + let targetMonthYear = "July 2026" + var attempts = 0 + while attempts < 24 && !wizard.monthLabel.label.contains(targetMonthYear) { + wizard.nextMonthButton.scrollIntoView(in: app.scrollViews.firstMatch) + wizard.nextMonthButton.waitUntilHittable(timeout: BaseUITestCase.defaultTimeout).tap() + attempts += 1 + } + + let dayBtn = wizard.dayButton("2026-07-20") + dayBtn.scrollIntoView(in: app.scrollViews.firstMatch) + if dayBtn.exists && dayBtn.isHittable { + dayBtn.tap() + dayBtn.tap() + } + + // Single-day selection - no crash + captureScreenshot(named: "F031-SameDay") + } + + /// F-032: Past dates are disabled and not tappable. + @MainActor + func testF032_PastDatesDisabled() { + let (_, wizard) = openWizard() + wizard.selectDateRangeMode() + + // Navigate to the current month + wizard.monthLabel.scrollIntoView(in: app.scrollViews.firstMatch) + + // Find yesterday's date + let calendar = Calendar.current + let yesterday = calendar.date(byAdding: .day, value: -1, to: Date())! + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd" + let yesterdayId = "wizard.dates.day.\(formatter.string(from: yesterday))" + + let yesterdayBtn = app.buttons[yesterdayId] + if yesterdayBtn.exists { + XCTAssertFalse(yesterdayBtn.isEnabled, + "Yesterday's date should be disabled") + } + + captureScreenshot(named: "F032-PastDatesDisabled") + } + + // MARK: - Sport Selection (F-033, F-034) /// F-030: Single sport selection — MLB highlights. @MainActor diff --git a/docs/SportsTime_QA_Test_Plan.xlsx b/docs/SportsTime_QA_Test_Plan.xlsx index f00f7bf..b183773 100644 Binary files a/docs/SportsTime_QA_Test_Plan.xlsx and b/docs/SportsTime_QA_Test_Plan.xlsx differ