// // ZLoginSmokeUITests.swift // suixinkanUITests // // 命名以 Z 开头,确保在全套件末尾执行,避免清空 Keychain 影响其它用例。 // 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) } }