Add XCUITest suite with 27 test files covering unmapped P1 test cases

- 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>
This commit is contained in:
Trey t
2026-02-17 09:37:54 -06:00
parent 1f860aafd1
commit 277e277750
47 changed files with 2386 additions and 50 deletions

View File

@@ -73,7 +73,8 @@ struct OnboardingDay: View {
example: "e.g. Tue reminder → Rate Tue",
icon: "sun.max.fill",
isSelected: onboardingData.inputDay == .Today,
action: { onboardingData.inputDay = .Today }
action: { onboardingData.inputDay = .Today },
testID: AccessibilityID.Onboarding.dayToday
)
DayOptionCard(
@@ -82,7 +83,8 @@ struct OnboardingDay: View {
example: "e.g. Tue reminder → Rate Mon",
icon: "moon.fill",
isSelected: onboardingData.inputDay == .Previous,
action: { onboardingData.inputDay = .Previous }
action: { onboardingData.inputDay = .Previous },
testID: AccessibilityID.Onboarding.dayYesterday
)
}
.padding(.horizontal, 20)
@@ -103,6 +105,7 @@ struct OnboardingDay: View {
.padding(.bottom, 80)
}
}
.accessibilityIdentifier(AccessibilityID.Onboarding.dayScreen)
}
}
@@ -113,6 +116,7 @@ struct DayOptionCard: View {
let icon: String
let isSelected: Bool
let action: () -> Void
var testID: String? = nil
var body: some View {
Button(action: action) {
@@ -168,6 +172,7 @@ struct DayOptionCard: View {
.accessibilityLabel("\(title), \(subtitle)")
.accessibilityHint(example)
.accessibilityAddTraits(isSelected ? [.isSelected] : [])
.accessibilityIdentifier(testID ?? "")
}
}

View File

@@ -117,6 +117,7 @@ struct OnboardingSubscription: View {
}
.accessibilityLabel(String(localized: "Get Personal Insights"))
.accessibilityHint(String(localized: "Opens subscription options"))
.accessibilityIdentifier(AccessibilityID.Onboarding.subscribeButton)
// Skip button
Button(action: {
@@ -130,12 +131,14 @@ struct OnboardingSubscription: View {
}
.accessibilityLabel(String(localized: "Maybe Later"))
.accessibilityHint(String(localized: "Skip subscription and complete setup"))
.accessibilityIdentifier(AccessibilityID.Onboarding.skipButton)
.padding(.top, 4)
}
.padding(.horizontal, 24)
.padding(.bottom, 50)
}
}
.accessibilityIdentifier(AccessibilityID.Onboarding.subscriptionScreen)
.sheet(isPresented: $showSubscriptionStore, onDismiss: {
// After subscription store closes, complete onboarding
AnalyticsManager.shared.track(.onboardingCompleted(dayId: nil))

View File

@@ -75,6 +75,7 @@ struct OnboardingWelcome: View {
.accessibilityHint(String(localized: "Swipe to the next onboarding step"))
}
}
.accessibilityIdentifier(AccessibilityID.Onboarding.welcomeScreen)
}
}