Files
Reflect/Tests iOS/StabilityTests.swift
Trey t 16c5c34942 Fix 4 flaky UI tests for iOS 26 compatibility
- AppLaunchTests/StabilityTests: Increase assertTabSelected timeout to
  8s for iOS 26 Liquid Glass delayed isSelected state updates
- DeepLinkTests: Detect SubscriptionStoreView container instead of text
  labels, since Apple's native view shows "Subscription Unavailable" in
  test storefront
- SettingsActionTests: Check for empty state after clearing data, bump
  Settings header timeout to 8s

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 18:59:22 -06:00

77 lines
2.7 KiB
Swift

//
// StabilityTests.swift
// Tests iOS
//
// Full navigation stability tests visit every screen without crash.
//
import XCTest
final class StabilityTests: BaseUITestCase {
override var seedFixture: String? { "week_of_moods" }
/// TC-152: Navigate to every screen and feature without crashing.
func testFullNavigation_NoCrash() {
let tabBar = TabBarScreen(app: app)
// 1. Day tab (default) - verify loaded
assertTabSelected(tabBar.dayTab, name: "Day (initial)")
captureScreenshot(name: "stability_day")
// 2. Open entry detail
let firstEntry = app.firstEntryRow
if firstEntry.waitForExistence(timeout: 5) {
firstEntry.tapWhenReady()
let detailScreen = EntryDetailScreen(app: app)
if detailScreen.sheet.waitForExistence(timeout: 3) {
captureScreenshot(name: "stability_entry_detail")
detailScreen.dismiss()
detailScreen.assertDismissed()
}
}
// 3. Month tab
tabBar.tapMonth()
assertTabSelected(tabBar.monthTab, name: "Month")
captureScreenshot(name: "stability_month")
// 4. Year tab
tabBar.tapYear()
assertTabSelected(tabBar.yearTab, name: "Year")
captureScreenshot(name: "stability_year")
// 5. Insights tab
tabBar.tapInsights()
assertTabSelected(tabBar.insightsTab, name: "Insights")
captureScreenshot(name: "stability_insights")
// 6. Settings tab - Customize sub-tab
tabBar.tapSettings()
assertTabSelected(tabBar.settingsTab, name: "Settings")
captureScreenshot(name: "stability_settings_customize")
// 7. Settings tab - Settings sub-tab
let settingsScreen = SettingsScreen(app: app)
settingsScreen.tapSettingsTab()
captureScreenshot(name: "stability_settings_settings")
// 8. Back to Customize sub-tab
settingsScreen.tapCustomizeTab()
captureScreenshot(name: "stability_settings_customize_return")
// 9. Back to Day
tabBar.tapDay()
assertTabSelected(tabBar.dayTab, name: "Day")
captureScreenshot(name: "stability_full_navigation_complete")
}
/// Wait for a tab to become selected (iOS 26 Liquid Glass may delay state updates).
private func assertTabSelected(_ tab: XCUIElement, name: String, timeout: TimeInterval = 8) {
let predicate = NSPredicate(format: "isSelected == true")
let expectation = XCTNSPredicateExpectation(predicate: predicate, object: tab)
let result = XCTWaiter.wait(for: [expectation], timeout: timeout)
XCTAssertEqual(result, .completed, "\(name) tab should be selected")
}
}