新增 SplashView、SplashCoordinator 与 Launch Screen 资源,移除冷启动 Lottie;LoginView 加载 App 配置。同时将 token 存储迁移至 UserDefaults,并更新相关测试与文档。 Co-authored-by: Cursor <cursoragent@cursor.com>
72 lines
2.6 KiB
Swift
72 lines
2.6 KiB
Swift
//
|
||
// ZLoginSmokeUITests.swift
|
||
// suixinkanUITests
|
||
//
|
||
// 命名以 Z 开头,确保在全套件末尾执行,避免清空 UserDefaults 登录态影响其它用例。
|
||
//
|
||
|
||
import XCTest
|
||
|
||
final class ZLoginSmokeUITests: XCTestCase {
|
||
override func setUp() {
|
||
super.setUp()
|
||
continueAfterFailure = false
|
||
UITestSession.invalidate()
|
||
}
|
||
|
||
override func tearDown() {
|
||
UITestSession.invalidate()
|
||
super.tearDown()
|
||
}
|
||
|
||
/// 测试冷启动会展示登录页关键控件。
|
||
func testFreshLaunchShowsLoginScreen() {
|
||
let app = SuixinkanApp(resetState: true).launch(waitForLoading: false)
|
||
|
||
XCTAssertTrue(app.application.staticTexts["login.title"].waitForExistence(timeout: 8))
|
||
XCTAssertTrue(app.application.textFields["login.username"].exists)
|
||
XCTAssertTrue(
|
||
app.application.secureTextFields["login.password"].exists
|
||
|| app.application.textFields["login.password"].exists
|
||
)
|
||
XCTAssertTrue(app.application.buttons["login.submit"].exists)
|
||
XCTAssertTrue(app.application.buttons["login.userAgreement"].exists)
|
||
XCTAssertTrue(app.application.buttons["login.privacyPolicy"].exists)
|
||
app.application.terminate()
|
||
}
|
||
|
||
/// 测试未勾选协议时无法直接登录。
|
||
func testLoginRequiresPrivacyAgreement() throws {
|
||
let app = SuixinkanApp(resetState: true).launch(waitForLoading: false)
|
||
defer { app.application.terminate() }
|
||
guard UITestLaunchConfiguration.credentials != nil else {
|
||
throw XCTSkip("缺少 UI Test 账号。")
|
||
}
|
||
|
||
let usernameField = app.application.textFields["login.username"]
|
||
XCTAssertTrue(usernameField.waitForExistence(timeout: 8))
|
||
XCTAssertFalse(app.application.buttons["login.submit"].isEnabled)
|
||
}
|
||
|
||
/// 测试空密码不会离开登录页。
|
||
func testEmptyPasswordDoesNotLeaveLoginScreen() throws {
|
||
let app = SuixinkanApp(resetState: true).launch(waitForLoading: false)
|
||
defer { app.application.terminate() }
|
||
let credentials = try UITestLaunchConfiguration.requireCredentials()
|
||
|
||
let usernameField = app.application.textFields["login.username"]
|
||
XCTAssertTrue(usernameField.waitForExistence(timeout: 8))
|
||
usernameField.tap()
|
||
usernameField.typeText(credentials.phone)
|
||
|
||
let privacyToggle = app.application.buttons["login.privacy"]
|
||
if privacyToggle.exists {
|
||
privacyToggle.tap()
|
||
}
|
||
|
||
app.application.buttons["login.submit"].tap()
|
||
app.waitForGlobalLoadingToDisappear(timeout: 5)
|
||
XCTAssertTrue(app.isOnLoginScreen)
|
||
}
|
||
}
|