Each test class now gets a unique session ID (UUID) passed to the app via UI_TEST_SESSION_ID environment variable. The app uses this to: - Route GroupUserDefaults to a session-specific UserDefaults suite, preventing tests from clobbering each other's AppStorage state - Create an in-memory SwiftData container instead of the shared on-disk App Group store, eliminating SQLite contention Refactored 8 test classes that bypassed BaseUITestCase.setUp() with custom launch args — they now use overridable `localeArguments` and `extraLaunchArguments` properties, keeping session ID injection centralized. Added `relaunchApp(resetState:bypassSubscription:)` to BaseUITestCase for tests that need mid-test relaunch with different subscription state. Includes a ParallelUITests.xctestplan with class-level parallelism enabled and random execution ordering. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tests iOS README
Purpose
Tests iOS/ contains XCTest-based UI tests for the iOS app.
Start Here Before Adding Tests
- Read
/Users/treyt/Desktop/code/Feels/docs/XCUITest-Authoring.md. - Reuse
BaseUITestCaseand helpers inHelpers/. - Reuse screen objects in
Screens/before writing inline query logic.
Required Pattern
- Test class inherits
BaseUITestCase. - Selectors use
UITestID/ accessibility identifiers first. - Waiting/tapping uses helper methods (
tapWhenReady,waitForDisappearance, etc). - New app interactions get IDs in
/Users/treyt/Desktop/code/Feels/Shared/AccessibilityIdentifiers.swift.
Anti-Patterns
sleep(...)- Selector logic based only on localized labels
- Duplicating navigation logic instead of using
Screens/*
Useful Paths
/Users/treyt/Desktop/code/Feels/Tests iOS/Helpers/BaseUITestCase.swift/Users/treyt/Desktop/code/Feels/Tests iOS/Helpers/WaitHelpers.swift/Users/treyt/Desktop/code/Feels/docs/templates/XCUITestSuiteTemplate.swift