- Added month_grid accessibility ID to MonthView ScrollView
- Added year_heatmap accessibility ID to YearView ScrollView
- Fixed DayScreen.assertVisible() to accept entry rows OR mood header
- Fixed DataPersistenceTests for in-memory storage (fixture re-seeds)
- Fixed AppLaunchTests to use week_of_moods fixture (empty has no grid)
- Fixed SettingsScreen segmented control tap with multi-strategy fallback
- Improved settings scroll with coordinate-based swipe for deep elements
- OnboardingScreen swipeToNext uses slow velocity for paged TabView
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rewrote 60+ test files to follow honeydue-style test guidelines:
- defaultTimeout=2s, navigationTimeout=5s — fail fast, no long waits
- No coordinate taps (except onboarding paged TabView swipes)
- No sleep(), no retry loops
- No guard...else { return } silent passes — XCTFail everywhere
- All elements by accessibility ID via UITestID constants
- Screen objects for all navigation/actions/assertions
- One logical assertion per test method
Added missing accessibility identifiers to app views:
- MonthView.swift: added AccessibilityID.MonthView.grid to ScrollView
- YearView.swift: added AccessibilityID.YearView.heatmap to ScrollView
Framework rewrites:
- BaseUITestCase: added session ID, localeArguments, extraLaunchArguments
- WaitHelpers: waitForExistenceOrFail, waitUntilHittableOrFail,
waitForNonExistence, scrollIntoView, forceTap
- All 7 screen objects rewritten with fail-fast semantics
- TEST_RULES.md added with non-negotiable rules
Known remaining issues:
- OnboardingTests: paged TabView swipes unreliable on iOS 26 simulator
- SettingsLegalLinksTests: EULA/Privacy buttons too deep in DEBUG scroll
- Customization horizontal picker scrolling needs further tuning
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 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>
- IconPackTests: Use swipeUp instead of swipeLeft since icon packs
are in a VStack (vertical layout), not horizontal scroll
- AppThemeTests: Verify sheet dismissal, accept mood header as
alternative to entry row after theme change
- SettingsActionTests: Add wait for SwiftData propagation after
clearing data, increase timeouts for view refresh
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace removePersistentDomain with key-by-key removal in resetAppState
(removePersistentDomain is unreliable on app group UserDefaults suites)
- Add explicit cache clearing in IAPManager.resetForTesting() to prevent
stale cachedSubscriptionExpiration from restoring .subscribed state
- Use descendants(matching: .any) for upgrade_banner and subscribe_button
queries (VStack may not match otherElements in SwiftUI)
- Add multiple swipe attempts for icon pack horizontal scroll
- Use coordinate-based drag for onboarding paged TabView advancement
- Add longer wait for Day view refresh after theme change
- Add multiple scroll attempts to find clear data button in Settings
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- IAPManager: add resetForTesting() to discard stale cached subscription state
- UITestMode: call resetForTesting() after clearing defaults (fixes 5 banner tests)
- StabilityTests: use NSPredicate wait for isSelected (iOS 26 Liquid Glass)
- SettingsActionTests: use coordinate tap for clear data and analytics toggle
- IconPackTests: add horizontal scroll fallback for off-screen icon packs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add 8 new test files: HeaderMoodLogging (TC-002), DayViewGrouping (TC-019),
AllDayViewStyles (TC-021), MonthViewInteraction (TC-030), PaywallGate
(TC-032/039/048), AppTheme (TC-070), IconPack (TC-072),
PremiumCustomization (TC-075)
- Add accessibility IDs for paywall overlays, icon packs, app theme cards,
and day view section headers
- Add --expire-trial launch argument to UITestMode for paywall gate testing
- Update QA test plan spreadsheet with XCUITest names for 14 test cases
- Include existing test infrastructure: screen objects, helpers, base class,
and 19 previously written test files
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>