53 lines
1.7 KiB
Swift
53 lines
1.7 KiB
Swift
//
|
||
// LoginViewModelTests.swift
|
||
// suixinkanTests
|
||
//
|
||
// Created by Codex on 2026/6/20.
|
||
//
|
||
|
||
import XCTest
|
||
@testable import suixinkan
|
||
|
||
@MainActor
|
||
/// 登录页 ViewModel 测试,覆盖手机号规范化、表单校验和偏好恢复。
|
||
final class LoginViewModelTests: XCTestCase {
|
||
/// 测试 +86 手机号会被规范化为 11 位国内手机号。
|
||
func testNormalizeUsernameCountryCodeRemovesChinaPrefix() {
|
||
let viewModel = LoginViewModel()
|
||
viewModel.username = "+86 186 5185 7230"
|
||
|
||
viewModel.normalizeUsernameCountryCodeIfNeeded()
|
||
|
||
XCTAssertEqual(viewModel.username, "18651857230")
|
||
XCTAssertEqual(viewModel.normalizedUsername, "18651857230")
|
||
XCTAssertTrue(viewModel.isValidPhone)
|
||
}
|
||
|
||
/// 测试未勾选协议时登录校验返回隐私协议错误。
|
||
func testValidateForLoginRequiresPrivacyAgreement() {
|
||
let viewModel = LoginViewModel()
|
||
viewModel.username = "18651857230"
|
||
viewModel.password = "secret123"
|
||
viewModel.privacyChecked = false
|
||
|
||
XCTAssertEqual(viewModel.validateForLogin(), .privacyUnchecked)
|
||
}
|
||
|
||
/// 测试登录偏好只恢复手机号和协议状态,不恢复密码。
|
||
func testApplyPreferencesRestoresUsernameAndPrivacyOnly() {
|
||
let viewModel = LoginViewModel()
|
||
viewModel.password = "manual-password"
|
||
|
||
viewModel.applyPreferences(
|
||
LoginPreferences(
|
||
lastUsername: "18651857230",
|
||
privacyAgreementAccepted: true
|
||
)
|
||
)
|
||
|
||
XCTAssertEqual(viewModel.username, "18651857230")
|
||
XCTAssertTrue(viewModel.privacyChecked)
|
||
XCTAssertEqual(viewModel.password, "manual-password")
|
||
}
|
||
}
|