优化 UI Test 路由直达与会话复用,提升自定义 TabBar 下的稳定性。

新增启动参数直达首页与个人中心页面,引入 AppUITestRouteDriver 与 UITestSession 共享登录,并重构各模块用例的导航断言逻辑。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-26 11:25:36 +08:00
parent 0c01ee26c3
commit aac8458b04
31 changed files with 587 additions and 166 deletions

View File

@ -0,0 +1,86 @@
//
// 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