feat: add XCUITest suite with 10 critical flow tests and QA test plan

Add comprehensive UI test infrastructure with Page Object pattern,
accessibility identifiers, UI test mode (--ui-testing, --reset-state,
--disable-animations), and 10 passing tests covering app launch, tab
navigation, trip wizard, trip saving, settings, schedule, and
accessibility at XXXL Dynamic Type. Also adds a 229-case QA test plan
Excel workbook for manual QA handoff.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-02-16 16:23:59 -06:00
parent 787a0f795e
commit d53f222489
16 changed files with 1528 additions and 25 deletions

View File

@@ -52,6 +52,7 @@ struct HomeView: View {
Label("Home", systemImage: "house.fill")
}
.tag(0)
.accessibilityIdentifier("tab.home")
// Schedule Tab
NavigationStack {
@@ -61,6 +62,7 @@ struct HomeView: View {
Label("Schedule", systemImage: "calendar")
}
.tag(1)
.accessibilityIdentifier("tab.schedule")
// My Trips Tab
NavigationStack {
@@ -70,6 +72,7 @@ struct HomeView: View {
Label("My Trips", systemImage: "suitcase.fill")
}
.tag(2)
.accessibilityIdentifier("tab.myTrips")
// Progress Tab
NavigationStack {
@@ -85,6 +88,7 @@ struct HomeView: View {
Label("Progress", systemImage: "chart.bar.fill")
}
.tag(3)
.accessibilityIdentifier("tab.progress")
// Settings Tab
NavigationStack {
@@ -94,6 +98,7 @@ struct HomeView: View {
Label("Settings", systemImage: "gear")
}
.tag(4)
.accessibilityIdentifier("tab.settings")
}
.tint(Theme.warmOrange)
.onChange(of: selectedTab) { oldTab, newTab in
@@ -633,6 +638,7 @@ struct SavedTripsListView: View {
.padding(Theme.Spacing.xl)
.background(Theme.cardBackground(colorScheme))
.clipShape(RoundedRectangle(cornerRadius: Theme.CornerRadius.large))
.accessibilityIdentifier("myTrips.emptyState")
} else {
ForEach(Array(sortedTrips.enumerated()), id: \.element.id) { index, savedTrip in
if let trip = savedTrip.trip {

View File

@@ -82,6 +82,7 @@ struct HomeContent_ClassicAnimated: View {
}
.pressableStyle()
.glowEffect(color: Theme.warmOrange, radius: 12)
.accessibilityIdentifier("home.startPlanningButton")
}
.padding(Theme.Spacing.lg)
.background(Theme.cardBackground(colorScheme))

View File

@@ -317,6 +317,7 @@ struct SettingsView: View {
.accessibilityHidden(true)
}
}
.accessibilityIdentifier("settings.analyticsToggle")
} header: {
Text("Privacy")
} footer: {
@@ -334,6 +335,7 @@ struct SettingsView: View {
Spacer()
Text("\(viewModel.appVersion) (\(viewModel.buildNumber))")
.foregroundStyle(.secondary)
.accessibilityIdentifier("settings.versionLabel")
}
Link(destination: URL(string: "https://sportstime.88oakapps.com/privacy.html")!) {