107 lines
3.3 KiB
Swift
107 lines
3.3 KiB
Swift
//
|
|
// AccountSwitchViewModelTests.swift
|
|
// suixinkanTests
|
|
//
|
|
|
|
import XCTest
|
|
@testable import suixinkan
|
|
|
|
@MainActor
|
|
/// 账号切换 ViewModel 测试。
|
|
final class AccountSwitchViewModelTests: XCTestCase {
|
|
func testLoadFiltersInvalidAccounts() async throws {
|
|
let json = """
|
|
{
|
|
"code": 100000,
|
|
"msg": "success",
|
|
"data": {
|
|
"token": "token",
|
|
"scenic_users": [
|
|
{
|
|
"account_type": "scenic_user",
|
|
"id": 1,
|
|
"user_id": 1,
|
|
"scenic_user_id": 1,
|
|
"ss_user_id": 9001,
|
|
"username": "u1",
|
|
"real_name": "张三",
|
|
"nickname": "张三",
|
|
"phone": "13800138000",
|
|
"scenic_id": 10,
|
|
"scenic_name": "景区A",
|
|
"is_current": true
|
|
}
|
|
],
|
|
"store_users": []
|
|
}
|
|
}
|
|
""".data(using: .utf8)!
|
|
|
|
let session = MockURLSession(responses: [json])
|
|
let api = ProfileAPI(client: APIClient(environment: .testing, session: session))
|
|
let viewModel = AccountSwitchViewModel()
|
|
|
|
try await viewModel.load(api: api, force: true)
|
|
|
|
XCTAssertEqual(viewModel.accounts.count, 1)
|
|
XCTAssertEqual(viewModel.selectedAccount?.businessUserId, 9001)
|
|
}
|
|
|
|
func testSwitchableAccountsPreserveCoolingOffStoreStatus() async throws {
|
|
let json = """
|
|
{
|
|
"code": 100000,
|
|
"msg": "success",
|
|
"data": {
|
|
"store_users": [
|
|
{
|
|
"account_type": "store_user",
|
|
"store_user_id": 2001,
|
|
"store_name": "冷静期门店",
|
|
"status": 2
|
|
}
|
|
]
|
|
}
|
|
}
|
|
""".data(using: .utf8)!
|
|
|
|
let session = MockURLSession(responses: [json])
|
|
let api = ProfileAPI(client: APIClient(environment: .testing, session: session))
|
|
let viewModel = AccountSwitchViewModel()
|
|
|
|
try await viewModel.load(api: api, force: true)
|
|
|
|
XCTAssertEqual(viewModel.accounts.first?.status, 2)
|
|
XCTAssertTrue(viewModel.accounts.first?.requiresDeregistrationConfirmation == true)
|
|
}
|
|
|
|
func testSwitchAccountThrowsWhenBusinessUserIdInvalid() async {
|
|
let viewModel = AccountSwitchViewModel()
|
|
let account = AccountSwitchAccount(
|
|
accountType: V9ScenicUser.accountTypeValue,
|
|
businessUserId: 0,
|
|
title: "景区A",
|
|
subtitle: "角色A",
|
|
phone: "13800138000",
|
|
realName: "张三",
|
|
avatar: "",
|
|
scenicName: "景区A",
|
|
storeId: nil,
|
|
storeName: "",
|
|
scenicId: 10,
|
|
isCurrent: false
|
|
)
|
|
let authAPI = AuthAPI(client: APIClient(environment: .testing, session: MockURLSession(responses: [])))
|
|
|
|
do {
|
|
_ = try await viewModel.switchAccount(account, api: authAPI)
|
|
XCTFail("无效账号应失败")
|
|
} catch {
|
|
guard let switchError = error as? AccountSwitchError else {
|
|
return XCTFail("期望 AccountSwitchError,实际为 \(error)")
|
|
}
|
|
XCTAssertEqual(switchError, .invalidAccount)
|
|
}
|
|
}
|
|
}
|