// // AppUITestRouteDriver.swift // suixinkan // // Created by Codex on 2026/6/26. // #if DEBUG import SwiftUI /// UI Test 专用路由直达器,通过启动参数打开目标页,绕开自定义 TabBar 下 XCUITest 难以触发的 push。 @MainActor enum AppUITestRouteDriver { private static var didApply = false /// 根据启动参数跳转到指定首页菜单或个人中心页面。 static func applyIfNeeded(appRouter: AppRouter) async { guard AppUITestLaunchState.isRunningUITests, !didApply else { return } guard AppUITestLaunchState.pendingMenuTitle != nil || AppUITestLaunchState.pendingProfileRouteRawValue != nil else { return } didApply = true try? await Task.sleep(nanoseconds: 600_000_000) if let menuTitle = AppUITestLaunchState.pendingMenuTitle { openHomeMenu(title: menuTitle, appRouter: appRouter) return } if let rawValue = AppUITestLaunchState.pendingProfileRouteRawValue { openProfileRoute(rawValue: rawValue, appRouter: appRouter) } } /// 打开首页调试目录中的指定菜单。 private static func openHomeMenu(title: String, appRouter: AppRouter) { guard let item = HomeMenuRouter.debugAllMenuItems().first(where: { $0.title == title }) else { return } let resolved = HomeMenuRouter.resolve(uri: item.uri, title: item.title) switch resolved { case .tab(let tab): appRouter.select(tab) case .orders(let entry): appRouter.selectOrders(entry: entry) case .destination(let homeRoute): appRouter.select(.home) appRouter.router(for: .home).navigate(to: .home(homeRoute)) case .unsupported(let uri, let title, _): appRouter.select(.home) appRouter.router(for: .home).navigate(to: .home(.modulePlaceholder(uri: uri, title: title))) case .placeholder(let uri, let title): appRouter.select(.home) appRouter.router(for: .home).navigate(to: .home(.modulePlaceholder(uri: uri, title: title))) } } /// 打开个人中心二级页面。 private static func openProfileRoute(rawValue: String, appRouter: AppRouter) { let route: ProfileRoute? switch rawValue { case "settings": route = .settings case "realNameAuth": route = .realNameAuth case "accountSwitch": route = .accountSwitch case "debugHomeMenus": route = .debugHomeMenus case "agreement.about": route = .agreement(.about) case "agreement.userAgreement": route = .agreement(.userAgreement) case "agreement.privacyPolicy": route = .agreement(.privacyPolicy) default: route = nil } guard let route else { return } appRouter.select(.profile) appRouter.router(for: .profile).navigate(to: .profile(route)) } } #endif