// // 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: 1_200_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) { let resolvedTitle = resolveMenuTitle(title) guard let item = HomeMenuRouter.debugAllMenuItems().first(where: { $0.title == resolvedTitle }) else { return } appRouter.reset() 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.reset() appRouter.select(.profile) appRouter.router(for: .profile).navigate(to: .profile(route)) } /// 将 UI Test 用例菜单名映射为调试目录标题。 private static func resolveMenuTitle(_ title: String) -> String { switch title { case "系统设置": return "设置中心" default: return title } } } #endif