// // LoginSmokeUITests.swift // suixinkanUITests // import XCTest final class LoginSmokeUITests: XCTestCase { override class func setUp() { super.setUp() UITestSession.invalidate() } override class func tearDown() { UITestSession.invalidate() super.tearDown() } override func setUp() { super.setUp() continueAfterFailure = false } /// 测试冷启动会展示登录页关键控件。 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) } /// 测试未勾选协议时无法直接登录。 func testLoginRequiresPrivacyAgreement() throws { let app = SuixinkanApp(resetState: true).launch(waitForLoading: false) 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) 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) } }