Files
Reflect/docs/XCUITest-Authoring.md
Trey t 0442eab1f8 Rebrand entire project from Feels to Reflect
Complete rename across all bundle IDs, App Groups, CloudKit containers,
StoreKit product IDs, data store filenames, URL schemes, logger subsystems,
Swift identifiers, user-facing strings (7 languages), file names, directory
names, Xcode project, schemes, assets, and documentation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:47:16 -06:00

86 lines
2.7 KiB
Markdown

# XCUITest Authoring Guide
This document defines the required pattern for writing or modifying UI tests in this repository.
If a prompt says "create a UI test that does X", follow this guide exactly.
## Foundation Map
- Base class: `/Users/treyt/Desktop/code/Feels/Tests iOS/Helpers/BaseUITestCase.swift`
- Wait + ID helpers: `/Users/treyt/Desktop/code/Feels/Tests iOS/Helpers/WaitHelpers.swift`
- Screen objects: `/Users/treyt/Desktop/code/Feels/Tests iOS/Screens/`
- Accessibility IDs source: `/Users/treyt/Desktop/code/Feels/Shared/AccessibilityIdentifiers.swift`
- Test-mode launch and fixtures: `/Users/treyt/Desktop/code/Feels/Shared/UITestMode.swift`
## Non-Negotiable Rules
- Use `BaseUITestCase` for UI test suites.
- Use `UITestID` / accessibility identifiers as primary selectors.
- Use screen objects for navigation/actions/assertions.
- Use wait helpers (`waitForExistence`, `waitForDisappearance`, `tapWhenReady`).
- Do not use `sleep(...)`.
- Do not rely on localized labels as the only selector.
## Deterministic Setup
Pick the right fixture by overriding `seedFixture` in the test class:
- `"empty"`: no entries
- `"single_mood"`: one current-day mood
- `"week_of_moods"`: seven days of entries
Override launch behavior when needed:
- `skipOnboarding` (default `true`)
- `bypassSubscription` (default `true`)
- `expireTrial` (default `false`)
## Authoring Workflow
1. Define or confirm accessibility IDs in app code.
2. Mirror IDs in `UITestID` if needed.
3. Add/extend a screen object in `Tests iOS/Screens/`.
4. Create a suite in `Tests iOS/{Feature}Tests.swift` inheriting `BaseUITestCase`.
5. Keep tests focused on one behavior per test method.
6. Add screenshots at meaningful checkpoints for triage.
7. Run targeted suite first, then broader run if needed.
## Command Pattern
Targeted suite:
```bash
xcodebuild -project Reflect.xcodeproj \
-scheme "Reflect (iOS)" \
-destination 'platform=iOS Simulator,name=iPhone 16 Pro' \
-only-testing:"Tests iOS/<SuiteName>" \
test
```
Full iOS UI suite:
```bash
xcodebuild -project Reflect.xcodeproj \
-scheme "Reflect (iOS)" \
-destination 'platform=iOS Simulator,name=iPhone 16 Pro' \
-only-testing:"Tests iOS" \
test
```
## Definition Of Done For New UI Tests
- New test compiles and passes in targeted run.
- Selectors are identifier-first (not string-literal labels).
- No `sleep(...)` usage.
- Screen object methods are reused where applicable.
- Any new test-only IDs are added in app code + test helper enums.
## Prompt Contract (For Agents)
When asked to "create a UI test that does X", the implementation should include:
- Test suite + test method(s) in `Tests iOS/`
- Any required accessibility ID additions in app code
- Any required screen object additions
- Targeted test execution output summary