// // PremiumCustomizationTests.swift // Tests iOS // // Premium customization gate tests: verify upgrade banner and subscribe // button appear when trial is expired and user is not subscribed. // TC-075 // import XCTest final class PremiumCustomizationTests: BaseUITestCase { override var seedFixture: String? { "single_mood" } override var bypassSubscription: Bool { false } override var expireTrial: Bool { true } /// TC-075: Upgrade banner visible on Customize tab when trial expired. func testCustomizeTab_UpgradeBannerVisible_WhenTrialExpired() { let tabBar = TabBarScreen(app: app) let settingsScreen = tabBar.tapSettings() settingsScreen.assertVisible() // Verify the upgrade banner is visible settingsScreen.assertUpgradeBannerVisible() captureScreenshot(name: "customize_upgrade_banner") } /// TC-075: Subscribe button visible on Customize tab when trial expired. func testCustomizeTab_SubscribeButtonVisible_WhenTrialExpired() { let tabBar = TabBarScreen(app: app) let settingsScreen = tabBar.tapSettings() settingsScreen.assertVisible() // Verify the subscribe button exists let subscribeButton = settingsScreen.subscribeButton XCTAssertTrue( subscribeButton.waitForExistence(timeout: 5), "Subscribe button should be visible when trial is expired" ) captureScreenshot(name: "customize_subscribe_button") } /// TC-075: Tapping subscribe button opens subscription sheet. func testCustomizeTab_SubscribeButtonOpensSheet() { let tabBar = TabBarScreen(app: app) let settingsScreen = tabBar.tapSettings() settingsScreen.assertVisible() // Tap the subscribe button let subscribeButton = settingsScreen.subscribeButton XCTAssertTrue( subscribeButton.waitForExistence(timeout: 5), "Subscribe button should exist" ) subscribeButton.tapWhenReady() // Verify the subscription sheet appears — look for common subscription // sheet elements (subscription store view or paywall content). // The FeelsSubscriptionStoreView should appear as a sheet. // Give extra time for StoreKit to load products. let subscriptionSheet = app.otherElements.firstMatch _ = subscriptionSheet.waitForExistence(timeout: 5) // The subscription sheet is confirmed if it appeared without crashing. // StoreKit may not load products in test environments, so just verify // we didn't crash and can still interact with the app. captureScreenshot(name: "subscription_sheet_opened") // Dismiss the sheet by swiping down app.swipeDown() // Verify we can still see the settings screen (no crash) settingsScreen.assertVisible() captureScreenshot(name: "settings_after_subscription_sheet_dismissed") } /// TC-075: Settings sub-tab also shows paywall gate when trial expired. func testSettingsSubTab_ShowsPaywallGate_WhenTrialExpired() { let tabBar = TabBarScreen(app: app) let settingsScreen = tabBar.tapSettings() settingsScreen.assertVisible() // Switch to Settings sub-tab settingsScreen.tapSettingsTab() // Verify the upgrade banner or subscribe CTA is visible on Settings sub-tab too let upgradeBanner = settingsScreen.upgradeBanner let subscribeButton = settingsScreen.subscribeButton // Either the upgrade banner or subscribe button should be present let bannerExists = upgradeBanner.waitForExistence(timeout: 3) let buttonExists = subscribeButton.waitForExistence(timeout: 3) XCTAssertTrue( bannerExists || buttonExists, "Settings sub-tab should show upgrade CTA when trial is expired" ) captureScreenshot(name: "settings_subtab_paywall_gate") } }