对齐 Android 实名认证流程与审核页、钱包提现/积分兑换界面,优化打卡点列表与详情交互,并补充相关资源、主题 token 与单元测试。 Co-authored-by: Cursor <cursoragent@cursor.com>
116 lines
3.6 KiB
Swift
116 lines
3.6 KiB
Swift
//
|
|
// ProfileModelsTests.swift
|
|
// suixinkanTests
|
|
//
|
|
|
|
import XCTest
|
|
@testable import suixinkan
|
|
|
|
/// Profile 模型解码测试。
|
|
final class ProfileModelsTests: XCTestCase {
|
|
func testUserInfoResponseDecodesSnakeCaseFields() throws {
|
|
let json = """
|
|
{
|
|
"avatar": "https://cdn.example.com/a.jpg",
|
|
"real_name": "张三",
|
|
"phone": "13800138000",
|
|
"nickname": "小张",
|
|
"role_name": "摄影师",
|
|
"status": 1,
|
|
"status_name": "正常"
|
|
}
|
|
""".data(using: .utf8)!
|
|
|
|
let info = try JSONDecoder().decode(UserInfoResponse.self, from: json)
|
|
|
|
XCTAssertEqual(info.realName, "张三")
|
|
XCTAssertEqual(info.nickname, "小张")
|
|
XCTAssertEqual(info.roleName, "摄影师")
|
|
XCTAssertEqual(info.statusName, "正常")
|
|
}
|
|
|
|
func testBankCardInfoDecodesAuditStatusAsString() throws {
|
|
let json = """
|
|
{
|
|
"real_name": "张三",
|
|
"bank_name": "中国银行",
|
|
"branch_name": "南京支行",
|
|
"card_number": "6222021234567890",
|
|
"audit_status": "2",
|
|
"audit_status_label": "审核通过",
|
|
"reject_reason": ""
|
|
}
|
|
""".data(using: .utf8)!
|
|
|
|
let info = try JSONDecoder().decode(BankCardInfo.self, from: json)
|
|
|
|
XCTAssertEqual(info.auditStatus, 2)
|
|
XCTAssertEqual(info.bankName, "中国银行")
|
|
}
|
|
|
|
func testRealNameInfoVerifiedWhenAuditStatusIsTwo() throws {
|
|
let json = """
|
|
{
|
|
"real_name": "张三",
|
|
"id_card_no": "320102199001011234",
|
|
"audit_status": 2,
|
|
"is_long_valid": 1
|
|
}
|
|
""".data(using: .utf8)!
|
|
|
|
let info = try JSONDecoder().decode(RealNameInfo.self, from: json)
|
|
|
|
XCTAssertTrue(info.verified)
|
|
}
|
|
|
|
func testRealNameInfoDecodesCompleteAuditDetails() throws {
|
|
let json = """
|
|
{
|
|
"real_name": "张三",
|
|
"id_card_no": "11010519491231002X",
|
|
"audit_status": "3",
|
|
"audit_status_text": "审核驳回",
|
|
"reject_reason": "国徽面照片模糊",
|
|
"start_date": "2020-01-01",
|
|
"end_date": "2030-01-01",
|
|
"is_long_valid": "0",
|
|
"front_url": "https://cdn.example.com/front.jpg",
|
|
"back_url": "https://cdn.example.com/back.jpg",
|
|
"auditor_id": "8",
|
|
"auditor": { "id": "8", "name": "审核员" },
|
|
"audit_at": "2026-07-13 12:00:00"
|
|
}
|
|
""".data(using: .utf8)!
|
|
|
|
let info = try JSONDecoder().decode(RealNameInfo.self, from: json)
|
|
|
|
XCTAssertEqual(info.auditStatus, 3)
|
|
XCTAssertEqual(info.rejectReason, "国徽面照片模糊")
|
|
XCTAssertEqual(info.frontUrl, "https://cdn.example.com/front.jpg")
|
|
XCTAssertEqual(info.backUrl, "https://cdn.example.com/back.jpg")
|
|
XCTAssertEqual(info.auditorId, 8)
|
|
XCTAssertEqual(info.auditor?.name, "审核员")
|
|
XCTAssertEqual(info.auditAt, "2026-07-13 12:00:00")
|
|
}
|
|
|
|
func testRealNameInfoRemainsCompatibleWhenOptionalAuditFieldsAreMissing() throws {
|
|
let json = """
|
|
{
|
|
"real_name": "李四",
|
|
"id_card_no": "11010519491231002X",
|
|
"audit_status": 1,
|
|
"is_long_valid": 1
|
|
}
|
|
""".data(using: .utf8)!
|
|
|
|
let info = try JSONDecoder().decode(RealNameInfo.self, from: json)
|
|
|
|
XCTAssertEqual(info.auditStatus, 1)
|
|
XCTAssertTrue(info.isLongValid)
|
|
XCTAssertNil(info.rejectReason)
|
|
XCTAssertNil(info.frontUrl)
|
|
XCTAssertNil(info.auditor)
|
|
XCTAssertNil(info.auditAt)
|
|
}
|
|
}
|