添加网络层并接入 v9 登录流程及单元测试
This commit is contained in:
129
suixinkanTests/AuthModelsTests.swift
Normal file
129
suixinkanTests/AuthModelsTests.swift
Normal file
@ -0,0 +1,129 @@
|
||||
//
|
||||
// AuthModelsTests.swift
|
||||
// suixinkanTests
|
||||
//
|
||||
|
||||
import XCTest
|
||||
@testable import suixinkan
|
||||
|
||||
/// Auth 模块模型测试,覆盖 v9 登录响应解码和账号转换规则。
|
||||
final class AuthModelsTests: XCTestCase {
|
||||
func testV9AuthResponseDecodesMultiAccountJSON() throws {
|
||||
let json = """
|
||||
{
|
||||
"code": 100000,
|
||||
"msg": "success",
|
||||
"data": {
|
||||
"token": "person-temp-token",
|
||||
"scenic_users": [
|
||||
{
|
||||
"account_type": "scenic_user",
|
||||
"id": 101,
|
||||
"user_id": 101,
|
||||
"scenic_user_id": 101,
|
||||
"ss_user_id": 101,
|
||||
"username": "scenic_admin",
|
||||
"real_name": "张三",
|
||||
"nickname": "张三",
|
||||
"phone": "13800138000",
|
||||
"scenic_id": 10,
|
||||
"scenic_name": "示例景区",
|
||||
"is_current": false
|
||||
}
|
||||
],
|
||||
"store_users": [
|
||||
{
|
||||
"account_type": "store_user",
|
||||
"id": 201,
|
||||
"user_id": 201,
|
||||
"store_user_id": 201,
|
||||
"username": "store_admin",
|
||||
"user_name": "store_admin",
|
||||
"real_name": "李四",
|
||||
"phone": "13900139000",
|
||||
"avatar": "",
|
||||
"scenic_id": 10,
|
||||
"scenic_name": "示例景区",
|
||||
"store_id": 20,
|
||||
"store_name": "示例门店",
|
||||
"is_current": false
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
""".data(using: .utf8)!
|
||||
|
||||
let envelope = try JSONDecoder().decode(APIEnvelope<V9AuthResponse>.self, from: json)
|
||||
let response = try XCTUnwrap(envelope.data)
|
||||
|
||||
XCTAssertEqual(response.token, "person-temp-token")
|
||||
XCTAssertEqual(response.accounts.map(\.businessUserId), [101, 201])
|
||||
}
|
||||
|
||||
func testV9AuthResponseDecodesMissingAccountListsAsEmpty() throws {
|
||||
let json = """
|
||||
{
|
||||
"code": 100000,
|
||||
"msg": "success",
|
||||
"data": {
|
||||
"token": "only-token"
|
||||
}
|
||||
}
|
||||
""".data(using: .utf8)!
|
||||
|
||||
let envelope = try JSONDecoder().decode(APIEnvelope<V9AuthResponse>.self, from: json)
|
||||
let response = try XCTUnwrap(envelope.data)
|
||||
|
||||
XCTAssertEqual(response.token, "only-token")
|
||||
XCTAssertTrue(response.scenicUsers.isEmpty)
|
||||
XCTAssertTrue(response.storeUsers.isEmpty)
|
||||
}
|
||||
|
||||
func testV9ScenicUserBusinessUserIdPrefersSsUserId() throws {
|
||||
let json = """
|
||||
{
|
||||
"account_type": "scenic_user",
|
||||
"id": "1",
|
||||
"user_id": 2,
|
||||
"scenic_user_id": 3,
|
||||
"ss_user_id": 101,
|
||||
"username": "scenic_admin",
|
||||
"real_name": "张三",
|
||||
"nickname": "张三",
|
||||
"phone": "13800138000",
|
||||
"scenic_id": 10,
|
||||
"scenic_name": "示例景区",
|
||||
"is_current": false
|
||||
}
|
||||
""".data(using: .utf8)!
|
||||
let user = try JSONDecoder().decode(V9ScenicUser.self, from: json)
|
||||
|
||||
XCTAssertEqual(user.businessUserId, 101)
|
||||
XCTAssertEqual(user.toAccountSwitchAccount().toSetUserRequest(), SetUserRequest(ssUserId: 101))
|
||||
}
|
||||
|
||||
func testV9StoreUserBusinessUserIdPrefersStoreUserId() throws {
|
||||
let json = """
|
||||
{
|
||||
"account_type": "store_user",
|
||||
"id": 1,
|
||||
"user_id": 2,
|
||||
"store_user_id": 201,
|
||||
"username": "store_admin",
|
||||
"user_name": "store_admin",
|
||||
"real_name": "张三",
|
||||
"phone": "13800138000",
|
||||
"avatar": "",
|
||||
"scenic_id": 10,
|
||||
"scenic_name": "示例景区",
|
||||
"store_id": 20,
|
||||
"store_name": "示例门店",
|
||||
"is_current": false
|
||||
}
|
||||
""".data(using: .utf8)!
|
||||
let user = try JSONDecoder().decode(V9StoreUser.self, from: json)
|
||||
|
||||
XCTAssertEqual(user.businessUserId, 201)
|
||||
XCTAssertEqual(user.toAccountSwitchAccount().toSetUserRequest(), SetUserRequest(storeUserId: 201))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user