Complete rename across all bundle IDs, App Groups, CloudKit containers, StoreKit product IDs, data store filenames, URL schemes, logger subsystems, Swift identifiers, user-facing strings (7 languages), file names, directory names, Xcode project, schemes, assets, and documentation. 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.
|
|
// 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"
|
|
)
|
|
}
|
|
}
|