Files
suixinkan_uikit/suixinkanTests/ProfileViewModelTests.swift
T

105 lines
3.7 KiB
Swift

//
// ProfileViewModelTests.swift
// suixinkanTests
//
import XCTest
@testable import suixinkan
@MainActor
/// 个人信息页 ViewModel 测试。
final class ProfileViewModelTests: XCTestCase {
override func setUp() {
super.setUp()
AppStore.shared.logout()
AppStore.shared.session.configureTestAccount(userId: "profile-user")
}
override func tearDown() {
AppStore.shared.logout()
super.tearDown()
}
func testDisplayNicknameUsesFallbackWhenEmpty() {
let viewModel = ProfileViewModel()
XCTAssertEqual(viewModel.displayNickname, "未设置昵称")
}
func testColdStartBasicInfoUsesPersistedSessionCache() {
AppStore.shared.session.userName = "缓存昵称"
AppStore.shared.session.realName = "缓存真实姓名"
AppStore.shared.session.phone = "186****7230"
AppStore.shared.session.avatar = "https://cdn.example.com/cached-avatar.jpg"
let viewModel = ProfileViewModel()
XCTAssertTrue(viewModel.hasCachedBasicInfo)
XCTAssertEqual(viewModel.displayNickname, "缓存昵称")
XCTAssertEqual(viewModel.displayRealName, "缓存真实姓名")
XCTAssertEqual(viewModel.displayPhone, "186****7230")
XCTAssertEqual(viewModel.displayAvatarURL, "https://cdn.example.com/cached-avatar.jpg")
XCTAssertEqual(viewModel.displayUID, "profile-user")
}
func testShowPhotographerFieldsWhenRoleCodeIsPhotographer() {
AppStore.shared.session.roleCode = AppRoleCode.photographer.rawValue
let viewModel = ProfileViewModel()
XCTAssertTrue(viewModel.showPhotographerFields)
AppStore.shared.session.roleCode = ""
}
func testMaskCardNumberShowsLastFourDigits() {
XCTAssertEqual(
ProfileViewModel.maskCardNumber("6222021234567890"),
"**** **** **** 7890"
)
}
func testUpdatePasswordRejectsShortPassword() async {
let session = MockURLSession(responses: [])
let api = ProfileAPI(client: APIClient(environment: .testing, session: session))
let viewModel = ProfileViewModel()
do {
try await viewModel.updatePassword("12345", api: api)
XCTFail("短密码应抛出校验错误")
} catch {
guard let validationError = error as? ProfileValidationError else {
return XCTFail("期望 ProfileValidationError,实际为 \(error)")
}
XCTAssertEqual(validationError, .shortPassword)
}
}
func testAccountTypeLabelForStoreAccount() {
AppStore.shared.session.accountType = .storeUser
let viewModel = ProfileViewModel()
XCTAssertEqual(viewModel.accountTypeLabel, "门店账号")
XCTAssertTrue(viewModel.isStoreAccount)
AppStore.shared.session.accountType = .unknown("")
}
func testAccountTypeLabelForScenicAccount() {
AppStore.shared.session.accountType = .scenicUser
let viewModel = ProfileViewModel()
XCTAssertEqual(viewModel.accountTypeLabel, "景区账号")
XCTAssertFalse(viewModel.isStoreAccount)
AppStore.shared.session.accountType = .unknown("")
}
func testApplyLocalProfileUpdateSyncsNicknameAndAvatar() {
AppStore.shared.session.userName = "全局昵称"
AppStore.shared.session.avatar = "https://cdn.example.com/new.jpg"
let viewModel = ProfileViewModel()
viewModel.applyLocalProfileUpdate()
XCTAssertEqual(viewModel.displayNickname, "全局昵称")
XCTAssertEqual(viewModel.displayAvatarURL, "https://cdn.example.com/new.jpg")
AppStore.shared.session.userName = ""
AppStore.shared.session.avatar = ""
}
}