// // DeepLinkTests.swift // Tests iOS // // TC-125, TC-126: Deep link handling. // import XCTest final class DeepLinkTests: BaseUITestCase { override var seedFixture: String? { "empty" } override var bypassSubscription: Bool { false } override var expireTrial: Bool { true } /// TC-126: Opening a malformed deep link does not crash the app. func testDeepLink_MalformedURL_NoCrash() { // Verify app launched and is on Day tab let tabBar = TabBarScreen(app: app) XCTAssertTrue( tabBar.dayTab.waitForExistence(timeout: 5), "App should launch to Day tab" ) // Send a malformed deep link let malformedURL = URL(string: "reflect://invalidpath")! app.open(malformedURL) // App should still be running and responsive — verify Day tab still exists XCTAssertTrue( tabBar.dayTab.waitForExistence(timeout: 5), "App should remain functional after malformed deep link" ) // Navigate to another tab to verify full responsiveness tabBar.tapYear() XCTAssertTrue( tabBar.yearTab.waitForExistence(timeout: 3), "App should be fully navigable after malformed deep link" ) captureScreenshot(name: "deeplink_malformed_no_crash") } /// TC-125: reflect://subscribe opens subscription view. func testDeepLink_Subscribe_OpensPaywall() { // Verify app launched let tabBar = TabBarScreen(app: app) XCTAssertTrue( tabBar.dayTab.waitForExistence(timeout: 5), "App should launch to Day tab" ) captureScreenshot(name: "deeplink_before_subscribe") // Send subscribe deep link let subscribeURL = URL(string: "reflect://subscribe")! app.open(subscribeURL) // Subscription view should appear as a sheet. // Look for common subscription UI elements. let subscribeText = app.staticTexts.matching( NSPredicate(format: "label CONTAINS[c] 'subscribe' OR label CONTAINS[c] 'premium' OR label CONTAINS[c] 'upgrade' OR label CONTAINS[c] 'Reflect+'") ).firstMatch let found = subscribeText.waitForExistence(timeout: 8) captureScreenshot(name: "deeplink_subscribe_result") XCTAssertTrue(found, "Subscription view should appear after reflect://subscribe deep link" ) } }