From 54be5cae3e713918cecc2e7ce3735a33ffd747a4 Mon Sep 17 00:00:00 2001 From: Trey t Date: Fri, 20 Feb 2026 00:30:48 -0600 Subject: [PATCH] Add F-030, F-031, F-032 UI tests for calendar date edge cases Co-Authored-By: Claude Opus 4.6 --- .../Tests/TripWizardFlowTests.swift | 77 +++++++++++++++++- docs/SportsTime_QA_Test_Plan.xlsx | Bin 34240 -> 34279 bytes 2 files changed, 75 insertions(+), 2 deletions(-) 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 f00f7bfbe632c3ca1e30370992fa8baf22909435..b18377356df302918c2cc4509b2c544ae289622a 100644 GIT binary patch delta 13205 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