- AppLaunchTests/StabilityTests: Increase assertTabSelected timeout to 8s for iOS 26 Liquid Glass delayed isSelected state updates - DeepLinkTests: Detect SubscriptionStoreView container instead of text labels, since Apple's native view shows "Subscription Unavailable" in test storefront - SettingsActionTests: Check for empty state after clearing data, bump Settings header timeout to 8s Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
74 lines
2.4 KiB
Swift
74 lines
2.4 KiB
Swift
//
|
|
// 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.
|
|
// Detect the SubscriptionStoreView container (works even when products are unavailable in test).
|
|
let storeContainer = app.descendants(matching: .any)
|
|
.matching(identifier: "Subscription Store View Container")
|
|
.firstMatch
|
|
|
|
let found = storeContainer.waitForExistence(timeout: 8)
|
|
|
|
captureScreenshot(name: "deeplink_subscribe_result")
|
|
|
|
XCTAssertTrue(found,
|
|
"Subscription view should appear after reflect://subscribe deep link"
|
|
)
|
|
}
|
|
}
|