Total rebrand across KMM project: - Kotlin package: com.example.casera -> com.tt.honeyDue (dirs + declarations) - Gradle: rootProject.name, namespace, applicationId - Android: manifest, strings.xml (all languages), widget resources - iOS: pbxproj bundle IDs, Info.plist, entitlements, xcconfig - iOS directories: Casera/ -> HoneyDue/, CaseraTests/ -> HoneyDueTests/, etc. - Swift source: all class/struct/enum renames - Deep links: casera:// -> honeydue://, .casera -> .honeydue - App icons replaced with honeyDue honeycomb icon - Domains: casera.treytartt.com -> honeyDue.treytartt.com - Bundle IDs: com.tt.casera -> com.tt.honeyDue - Database table names preserved Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
199 lines
7.3 KiB
Markdown
199 lines
7.3 KiB
Markdown
# XCUITest Debugging Guide
|
|
|
|
## Current Status
|
|
|
|
✅ **Completed:**
|
|
- Created comprehensive XCUITest infrastructure (34 tests)
|
|
- Added `AccessibilityIdentifiers.swift` with centralized identifiers
|
|
- Added accessibility identifiers to critical views (LoginView, RegisterView, MainTabView, Residence views, ProfileView)
|
|
- Updated `TestHelpers.swift` to use accessibility identifiers
|
|
- Project builds successfully for testing
|
|
|
|
❌ **Issue:**
|
|
- ALL tests are failing within ~0.5 seconds
|
|
- Tests fail during `setUp()` when trying to login
|
|
- The login helper cannot find UI elements by their accessibility identifiers
|
|
|
|
## Root Cause Analysis
|
|
|
|
The tests fail at this line in `TestHelpers.swift:44`:
|
|
```swift
|
|
let usernameField = app.textFields[AccessibilityIdentifiers.Authentication.usernameField]
|
|
XCTAssertTrue(usernameField.waitForExistence(timeout: 5), "Username field should exist")
|
|
// ❌ This assertion fails - field not found
|
|
```
|
|
|
|
**Possible Causes:**
|
|
1. **Accessibility identifiers not set at runtime** - The `.accessibilityIdentifier()` modifiers might not be working
|
|
2. **App not rendering properly in test mode** - The app might be crashing or showing a different screen
|
|
3. **Timing issue** - The login screen might not be fully loaded when the test runs
|
|
4. **Kotlin initialization blocking** - The TokenStorage/Kotlin framework might be blocking UI rendering
|
|
|
|
## Recommended Next Steps
|
|
|
|
### Option 1: Debug in Xcode (RECOMMENDED)
|
|
|
|
This is the fastest way to diagnose the issue:
|
|
|
|
1. **Open the project in Xcode:**
|
|
```bash
|
|
cd /Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp
|
|
open iosApp.xcodeproj
|
|
```
|
|
|
|
2. **Select the Test target and a simulator:**
|
|
- Select "iPhone 17 Pro" simulator from the device dropdown
|
|
- Select the `HoneyDueTests` scheme
|
|
|
|
3. **Use UI Recording to see what elements exist:**
|
|
- Open `DebugLoginTest.swift`
|
|
- Place your cursor in `testAppLaunches()` method
|
|
- Click the **red record button** at the bottom of the editor
|
|
- The app will launch in the simulator
|
|
- **Tap on UI elements** - Xcode will generate code showing the actual identifiers
|
|
- Stop recording and examine the generated code
|
|
|
|
4. **Check console output:**
|
|
- Run `testAppLaunches()` test (Cmd+U or click diamond icon in gutter)
|
|
- View console output (Cmd+Shift+Y) to see the `XCTContext` activity logs
|
|
- This will show actual counts of UI elements found
|
|
|
|
5. **Use Accessibility Inspector:**
|
|
- Open Accessibility Inspector (Xcode → Open Developer Tool → Accessibility Inspector)
|
|
- Run the app normally (not in test mode)
|
|
- Inspect the login fields to verify accessibility identifiers are set
|
|
|
|
### Option 2: Add Debug Output to App
|
|
|
|
Modify `LoginView.swift` to print when it renders:
|
|
|
|
```swift
|
|
var body: some View {
|
|
// ... existing code ...
|
|
.onAppear {
|
|
print("🟢 LoginView appeared")
|
|
print("🔍 Username field identifier: \(AccessibilityIdentifiers.Authentication.usernameField)")
|
|
}
|
|
}
|
|
```
|
|
|
|
Then run tests and check if "LoginView appeared" prints in console.
|
|
|
|
### Option 3: Simplify the Test
|
|
|
|
The `DebugLoginTest.swift` is already simplified. Try running it:
|
|
|
|
```bash
|
|
cd /Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp
|
|
xcodebuild test \
|
|
-project iosApp.xcodeproj \
|
|
-scheme iosApp \
|
|
-destination 'platform=iOS Simulator,name=iPhone 17 Pro' \
|
|
-only-testing:HoneyDueTests/DebugLoginTest/testAppLaunches
|
|
```
|
|
|
|
Check if it passes (meaning the app launches and has SOME UI elements).
|
|
|
|
## Known Issues to Check
|
|
|
|
### 1. AccessibilityIdentifiers Not in Test Target
|
|
|
|
Verify that `AccessibilityIdentifiers.swift` is included in the **iosApp target** (not HoneyDueTests):
|
|
- In Xcode, select `Helpers/AccessibilityIdentifiers.swift`
|
|
- In File Inspector (right panel), check "Target Membership"
|
|
- ✅ `iosApp` should be checked
|
|
- ❌ `HoneyDueTests` should NOT be checked
|
|
|
|
### 2. LoginView Not Using Correct Identifiers
|
|
|
|
Double-check `Login/LoginView.swift`:
|
|
```bash
|
|
grep "accessibilityIdentifier" /Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Login/LoginView.swift
|
|
```
|
|
|
|
Should output:
|
|
```
|
|
.accessibilityIdentifier(AccessibilityIdentifiers.Authentication.usernameField)
|
|
.accessibilityIdentifier(AccessibilityIdentifiers.Authentication.passwordField)
|
|
.accessibilityIdentifier(AccessibilityIdentifiers.Authentication.loginButton)
|
|
```
|
|
|
|
### 3. App Showing Different Screen in Test Mode
|
|
|
|
The app might be checking for existing auth token and bypassing login. Check if `TokenStorage` has a stored token from previous runs:
|
|
|
|
```swift
|
|
// In iOSApp.swift init(), add for testing:
|
|
#if DEBUG
|
|
if ProcessInfo.processInfo.arguments.contains("--uitesting") {
|
|
TokenStorage.shared.clearToken() // Force logout for tests
|
|
}
|
|
#endif
|
|
```
|
|
|
|
### 4. Kotlin Framework Initialization Blocking
|
|
|
|
The app initializes `TokenStorage` in `iOSApp.init()`. This might be blocking:
|
|
|
|
```swift
|
|
init() {
|
|
// This could be blocking UI rendering:
|
|
TokenStorage.shared.initialize(manager: TokenManager())
|
|
}
|
|
```
|
|
|
|
Try moving initialization to background thread or making it async.
|
|
|
|
## Quick Verification Commands
|
|
|
|
```bash
|
|
# Check if identifiers are in LoginView
|
|
grep -c "accessibilityIdentifier" /Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Login/LoginView.swift
|
|
# Should output: 6
|
|
|
|
# Check if AccessibilityIdentifiers exists
|
|
ls -la /Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Helpers/AccessibilityIdentifiers.swift
|
|
# Should show the file
|
|
|
|
# Run simplified debug test
|
|
cd /Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp
|
|
xcodebuild test -project iosApp.xcodeproj -scheme iosApp \
|
|
-destination 'platform=iOS Simulator,name=iPhone 17 Pro' \
|
|
-only-testing:HoneyDueTests/DebugLoginTest/testAppLaunches 2>&1 | grep "Test Case"
|
|
```
|
|
|
|
## Expected Output When Working
|
|
|
|
When tests work properly, you should see:
|
|
```
|
|
Test Case '-[HoneyDueTests.DebugLoginTest testAppLaunches]' started.
|
|
Activity 'Found 1 text fields' started
|
|
Activity 'Found 1 secure fields' started
|
|
Activity 'Found 5 buttons' started
|
|
Activity 'Email field exists: true' started
|
|
Activity 'Password field exists: true' started
|
|
Test Case '-[HoneyDueTests.DebugLoginTest testAppLaunches]' passed (5.234 seconds).
|
|
```
|
|
|
|
Currently seeing:
|
|
```
|
|
Test Case '-[HoneyDueTests.DebugLoginTest testAppLaunches]' failed (0.540 seconds)
|
|
```
|
|
|
|
The ~0.5 second failure suggests the app isn't even launching or is crashing immediately.
|
|
|
|
## Files Modified
|
|
|
|
- ✅ `/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Helpers/AccessibilityIdentifiers.swift` - Created
|
|
- ✅ `/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Login/LoginView.swift` - Added 6 identifiers
|
|
- ✅ `/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Login/RegisterView.swift` - Added 6 identifiers
|
|
- ✅ `/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/MainTabView.swift` - Added 5 tab identifiers
|
|
- ✅ `/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Residence/*` - Added 15+ identifiers
|
|
- ✅ `/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Profile/ProfileTabView.swift` - Added logout identifier
|
|
- ✅ `/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/HoneyDueTests/TestHelpers.swift` - Updated to use identifiers
|
|
- ✅ `/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/HoneyDueTests/DebugLoginTest.swift` - Simplified debug test
|
|
|
|
## Next Action
|
|
|
|
**Open the project in Xcode** and use the UI Recording feature. This will immediately show you what identifiers are actually available and why the tests can't find them.
|