136 lines
4.5 KiB
Swift
136 lines
4.5 KiB
Swift
//
|
|
// PaymentModelsTests.swift
|
|
// suixinkanTests
|
|
//
|
|
|
|
import XCTest
|
|
@testable import suixinkan
|
|
|
|
/// 收款模型解码测试。
|
|
final class PaymentModelsTests: XCTestCase {
|
|
func testPayPageConfigResponseDecodesBrandFields() throws {
|
|
let json = """
|
|
{
|
|
"background": "https://example.com/background.png",
|
|
"logo": "https://example.com/logo.png",
|
|
"title": "那拉提旅拍管理收费平台",
|
|
"subtitle": "那拉提景区"
|
|
}
|
|
""".data(using: .utf8)!
|
|
|
|
let response = try JSONDecoder().decode(PayPageConfigResponse.self, from: json)
|
|
|
|
XCTAssertEqual(response.background, "https://example.com/background.png")
|
|
XCTAssertEqual(response.logo, "https://example.com/logo.png")
|
|
XCTAssertEqual(response.title, "那拉提旅拍管理收费平台")
|
|
XCTAssertEqual(response.subtitle, "那拉提景区")
|
|
}
|
|
|
|
func testPayPageConfigMergesOnlyUsableRemoteFields() {
|
|
let cached = PayPageConfig(
|
|
background: "https://cache.example.com/background.png",
|
|
logo: "https://cache.example.com/logo.png",
|
|
title: "缓存标题",
|
|
subtitle: "缓存副标题"
|
|
)
|
|
|
|
let merged = cached.merging(
|
|
PayPageConfigResponse(
|
|
background: "",
|
|
logo: "http://unsafe.example.com/logo.png",
|
|
title: " 最新标题 ",
|
|
subtitle: ""
|
|
)
|
|
)
|
|
|
|
XCTAssertEqual(merged.background, cached.background)
|
|
XCTAssertEqual(merged.logo, cached.logo)
|
|
XCTAssertEqual(merged.title, "最新标题")
|
|
XCTAssertEqual(merged.subtitle, cached.subtitle)
|
|
}
|
|
|
|
func testPayPageBrandingOnlyEnablesNalatiScenicId() {
|
|
XCTAssertTrue(PayPageBrandingPolicy.isNalati(scenicId: 128))
|
|
XCTAssertFalse(PayPageBrandingPolicy.isNalati(scenicId: 127))
|
|
XCTAssertFalse(PayPageBrandingPolicy.isNalati(scenicId: 0))
|
|
}
|
|
|
|
func testPaymentAccountDisplayFormatterUsesCurrentPhotographerAndAllUniqueStores() {
|
|
XCTAssertEqual(
|
|
PaymentAccountDisplayFormatter.photographerName(userName: " 当前摄影师 ", realName: "实名"),
|
|
"当前摄影师"
|
|
)
|
|
XCTAssertEqual(
|
|
PaymentAccountDisplayFormatter.storeNames(["一号店", " 二号店 ", "一号店", ""]),
|
|
"一号店、二号店"
|
|
)
|
|
XCTAssertEqual(PaymentAccountDisplayFormatter.storeNames([]), "-")
|
|
}
|
|
|
|
func testRolePermissionResponseDecodesAllAccountStores() throws {
|
|
let json = """
|
|
{
|
|
"role": {
|
|
"id": 41,
|
|
"name": "摄影师",
|
|
"role_code": "photographer",
|
|
"notes": null,
|
|
"permission": []
|
|
},
|
|
"scenic": [],
|
|
"store": [
|
|
{"id": 37, "name": "随心旅拍", "status": 1},
|
|
{"id": 38, "name": "空中草原店", "status": 1}
|
|
]
|
|
}
|
|
""".data(using: .utf8)!
|
|
|
|
let response = try JSONDecoder().decode(RolePermissionResponse.self, from: json)
|
|
|
|
XCTAssertEqual(response.store.map(\.name), ["随心旅拍", "空中草原店"])
|
|
}
|
|
|
|
func testPayCodeResponseDecodesSnakeCaseFields() throws {
|
|
let json = """
|
|
{
|
|
"static_pay_url": "https://pay.example.com/static",
|
|
"dynamic_pay_url": "https://pay.example.com/dynamic"
|
|
}
|
|
""".data(using: .utf8)!
|
|
|
|
let response = try JSONDecoder().decode(PayCodeResponse.self, from: json)
|
|
|
|
XCTAssertEqual(response.staticPayURL, "https://pay.example.com/static")
|
|
XCTAssertEqual(response.dynamicPayURL, "https://pay.example.com/dynamic")
|
|
}
|
|
|
|
func testRepaymentCollectionRecordResponseDecodesGroupedFields() throws {
|
|
let json = """
|
|
{
|
|
"analyse": [
|
|
{
|
|
"date": "2024-01-15",
|
|
"order_count": 2,
|
|
"order_amount_sum": "100.00"
|
|
}
|
|
],
|
|
"list": [
|
|
{
|
|
"order_number": "NO001",
|
|
"user_phone": "13800138000",
|
|
"order_amount": "50.00",
|
|
"create_date": "2024-01-15",
|
|
"create_time": "10:00:00"
|
|
}
|
|
]
|
|
}
|
|
""".data(using: .utf8)!
|
|
|
|
let response = try JSONDecoder().decode(RepaymentCollectionRecordResponse.self, from: json)
|
|
|
|
XCTAssertEqual(response.analyse.count, 1)
|
|
XCTAssertEqual(response.analyse[0].orderCount, 2)
|
|
XCTAssertEqual(response.list[0].orderNumber, "NO001")
|
|
}
|
|
}
|