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:
146
Shared/AccessibilityIdentifiers.swift
Normal file
146
Shared/AccessibilityIdentifiers.swift
Normal file
@@ -0,0 +1,146 @@
|
||||
//
|
||||
// AccessibilityIdentifiers.swift
|
||||
// Feels (iOS)
|
||||
//
|
||||
// Centralized accessibility identifiers for XCUITest targeting.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
enum AccessibilityID {
|
||||
// MARK: - Tabs
|
||||
enum Tab {
|
||||
static let day = "tab_day"
|
||||
static let month = "tab_month"
|
||||
static let year = "tab_year"
|
||||
static let insights = "tab_insights"
|
||||
static let settings = "tab_settings"
|
||||
}
|
||||
|
||||
// MARK: - Mood Buttons (voting header)
|
||||
enum MoodButton {
|
||||
static let great = "mood_button_great"
|
||||
static let good = "mood_button_good"
|
||||
static let average = "mood_button_average"
|
||||
static let bad = "mood_button_bad"
|
||||
static let horrible = "mood_button_horrible"
|
||||
|
||||
static func id(for moodStrValue: String) -> String {
|
||||
"mood_button_\(moodStrValue.lowercased())"
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Day View
|
||||
enum DayView {
|
||||
static let moodHeader = "mood_header"
|
||||
static let entryList = "entry_list"
|
||||
static let emptyState = "empty_state"
|
||||
static let emptyStateNoData = "empty_state_no_data"
|
||||
static func entryRow(dateString: String) -> String {
|
||||
"entry_row_\(dateString)"
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Entry Detail
|
||||
enum EntryDetail {
|
||||
static let sheet = "entry_detail_sheet"
|
||||
static let doneButton = "entry_detail_done"
|
||||
static let deleteButton = "entry_detail_delete"
|
||||
static let noteButton = "entry_detail_note_button"
|
||||
static let noteArea = "entry_detail_note_area"
|
||||
static let moodGrid = "entry_detail_mood_grid"
|
||||
}
|
||||
|
||||
// MARK: - Note Editor
|
||||
enum NoteEditor {
|
||||
static let textEditor = "note_editor_text"
|
||||
static let saveButton = "note_editor_save"
|
||||
static let cancelButton = "note_editor_cancel"
|
||||
}
|
||||
|
||||
// MARK: - Settings
|
||||
enum Settings {
|
||||
static let header = "settings_header"
|
||||
static let customizeTab = "settings_tab_customize"
|
||||
static let settingsTab = "settings_tab_settings"
|
||||
static let upgradeBanner = "upgrade_banner"
|
||||
static let subscribeButton = "subscribe_button"
|
||||
static let whyUpgradeButton = "why_upgrade_button"
|
||||
static let clearDataButton = "settings_clear_data"
|
||||
static let analyticsToggle = "settings_analytics_toggle"
|
||||
static let showOnboardingButton = "settings_show_onboarding"
|
||||
}
|
||||
|
||||
// MARK: - Customize
|
||||
enum Customize {
|
||||
static let themeSection = "customize_theme_section"
|
||||
static let browseThemesButton = "browse_themes_button"
|
||||
static func themeButton(_ name: String) -> String {
|
||||
"customize_theme_\(name.lowercased())"
|
||||
}
|
||||
static func votingLayoutButton(_ name: String) -> String {
|
||||
"customize_voting_\(name.lowercased())"
|
||||
}
|
||||
static func dayViewStyleButton(_ name: String) -> String {
|
||||
"customize_daystyle_\(name.lowercased())"
|
||||
}
|
||||
static func iconPackButton(_ name: String) -> String {
|
||||
"customize_iconpack_\(name.lowercased())"
|
||||
}
|
||||
static func appThemeCard(_ name: String) -> String {
|
||||
"apptheme_card_\(name.lowercased())"
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Paywall
|
||||
enum Paywall {
|
||||
static let monthOverlay = "paywall_month_overlay"
|
||||
static let yearOverlay = "paywall_year_overlay"
|
||||
static let insightsOverlay = "paywall_insights_overlay"
|
||||
}
|
||||
|
||||
// MARK: - Day View Section Headers
|
||||
enum DaySection {
|
||||
static func header(month: Int, year: Int) -> String {
|
||||
"day_section_\(month)_\(year)"
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Insights
|
||||
enum Insights {
|
||||
static let header = "insights_header"
|
||||
static let monthSection = "insights_month_section"
|
||||
static let yearSection = "insights_year_section"
|
||||
static let allTimeSection = "insights_all_time_section"
|
||||
}
|
||||
|
||||
// MARK: - Month View
|
||||
enum MonthView {
|
||||
static let grid = "month_grid"
|
||||
}
|
||||
|
||||
// MARK: - Year View
|
||||
enum YearView {
|
||||
static let heatmap = "year_heatmap"
|
||||
}
|
||||
|
||||
// MARK: - Onboarding
|
||||
enum Onboarding {
|
||||
static let container = "onboarding_container"
|
||||
static let welcomeScreen = "onboarding_welcome"
|
||||
static let timeScreen = "onboarding_time"
|
||||
static let dayScreen = "onboarding_day"
|
||||
static let dayToday = "onboarding_day_today"
|
||||
static let dayYesterday = "onboarding_day_yesterday"
|
||||
static let styleScreen = "onboarding_style"
|
||||
static let subscriptionScreen = "onboarding_subscription"
|
||||
static let subscribeButton = "onboarding_subscribe_button"
|
||||
static let skipButton = "onboarding_skip_button"
|
||||
}
|
||||
|
||||
// MARK: - Common
|
||||
enum Common {
|
||||
static let lockScreen = "lock_screen"
|
||||
static let onboarding = "onboarding_sheet"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user