feat(payment): 支持赛里木湖品牌收款页与独立缓存
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
//
|
||||
|
||||
import XCTest
|
||||
import UIKit
|
||||
@testable import suixinkan
|
||||
|
||||
/// 收款详情 ViewModel 测试。
|
||||
@@ -187,14 +188,14 @@ final class PaymentCollectionDetailsViewModelTests: XCTestCase {
|
||||
)
|
||||
}
|
||||
|
||||
func testNonNalatiDoesNotRequestPayPageConfig() async {
|
||||
func testUnbrandedScenicDoesNotRequestPayPageConfig() async {
|
||||
let session = MockURLSession(responses: [])
|
||||
let api = PaymentAPI(client: APIClient(environment: .testing, session: session))
|
||||
let viewModel = PaymentCollectionDetailsViewModel(appStore: appStore)
|
||||
|
||||
await viewModel.loadPayPageConfig(api: api)
|
||||
|
||||
XCTAssertFalse(viewModel.usesNalatiBranding)
|
||||
XCTAssertFalse(viewModel.usesBranding)
|
||||
XCTAssertEqual(session.requests.count, 0)
|
||||
}
|
||||
|
||||
@@ -209,4 +210,96 @@ final class PaymentCollectionDetailsViewModelTests: XCTestCase {
|
||||
XCTAssertEqual(production.config(scenicId: 128), .nalatiDefault)
|
||||
XCTAssertNil(testing.config(scenicId: 128))
|
||||
}
|
||||
|
||||
func testSailimuRefreshPersistsOnlyItsOwnConfigAndReusesBrandUI() async throws {
|
||||
let suite = "PaymentCollectionDetailsViewModelTests.Sailimu.\(UUID().uuidString)"
|
||||
let defaults = UserDefaults(suiteName: suite)!
|
||||
defer { defaults.removePersistentDomain(forName: suite) }
|
||||
let cache = PayPageConfigCache(defaults: defaults, environment: .testing)
|
||||
cache.save(.nalatiDefault, scenicId: 128)
|
||||
let cached = PayPageConfig(
|
||||
background: "https://cache.example.com/sailimu.png",
|
||||
logo: "https://cache.example.com/sailimu-logo.png",
|
||||
title: "缓存赛里木湖标题",
|
||||
subtitle: "赛里木湖景区"
|
||||
)
|
||||
cache.save(cached, scenicId: 125)
|
||||
appStore.session.currentScenicId = 125
|
||||
let viewModel = PaymentCollectionDetailsViewModel(appStore: appStore, payPageConfigCache: cache)
|
||||
XCTAssertTrue(viewModel.usesBranding)
|
||||
XCTAssertEqual(viewModel.payPageConfig, cached)
|
||||
|
||||
let response = """
|
||||
{"code":100000,"msg":"success","data":{
|
||||
"background":"https://new.example.com/sailimu.png",
|
||||
"logo":"", "title":"最新赛里木湖标题", "subtitle":""
|
||||
}}
|
||||
""".data(using: .utf8)!
|
||||
let session = MockURLSession(responses: [response])
|
||||
let api = PaymentAPI(client: APIClient(environment: .testing, session: session))
|
||||
await viewModel.loadPayPageConfig(api: api)
|
||||
|
||||
let url = try XCTUnwrap(session.requests.first?.url)
|
||||
XCTAssertEqual(url.path, "/api/yf-handset-app/photog/pay-page-config")
|
||||
XCTAssertEqual(URLComponents(url: url, resolvingAgainstBaseURL: false)?
|
||||
.queryItems?.first(where: { $0.name == "scenic_id" })?.value, "125")
|
||||
XCTAssertEqual(viewModel.payPageConfig.title, "最新赛里木湖标题")
|
||||
XCTAssertEqual(viewModel.payPageConfig.background, "https://new.example.com/sailimu.png")
|
||||
XCTAssertEqual(viewModel.payPageConfig.logo, cached.logo)
|
||||
XCTAssertEqual(viewModel.payPageConfig.subtitle, cached.subtitle)
|
||||
XCTAssertEqual(viewModel.brandingRefreshVersion, 1)
|
||||
XCTAssertEqual(cache.config(scenicId: 128), .nalatiDefault)
|
||||
XCTAssertEqual(cache.config(scenicId: 125), viewModel.payPageConfig)
|
||||
let reopened = PaymentCollectionDetailsViewModel(appStore: appStore, payPageConfigCache: cache)
|
||||
XCTAssertEqual(reopened.payPageConfig, viewModel.payPageConfig)
|
||||
|
||||
appStore.session.currentScenicId = 128
|
||||
viewModel.refreshLocalState()
|
||||
XCTAssertEqual(viewModel.payPageConfig, .nalatiDefault)
|
||||
appStore.session.currentScenicId = 125
|
||||
viewModel.refreshLocalState()
|
||||
XCTAssertEqual(viewModel.payPageConfig, reopened.payPageConfig)
|
||||
}
|
||||
|
||||
func testSailimuRequestFailurePreservesDefaultsOrItsOwnCache() async {
|
||||
let suite = "PaymentCollectionDetailsViewModelTests.SailimuFailure.\(UUID().uuidString)"
|
||||
let defaults = UserDefaults(suiteName: suite)!
|
||||
defer { defaults.removePersistentDomain(forName: suite) }
|
||||
let cache = PayPageConfigCache(defaults: defaults, environment: .testing)
|
||||
cache.save(.nalatiDefault, scenicId: 128)
|
||||
appStore.session.currentScenicId = 125
|
||||
let viewModel = PaymentCollectionDetailsViewModel(appStore: appStore, payPageConfigCache: cache)
|
||||
let session = MockURLSession(responses: [])
|
||||
let api = PaymentAPI(client: APIClient(environment: .testing, session: session))
|
||||
XCTAssertEqual(viewModel.payPageConfig, .sailimuDefault)
|
||||
await viewModel.loadPayPageConfig(api: api)
|
||||
XCTAssertEqual(viewModel.payPageConfig, .sailimuDefault)
|
||||
XCTAssertNil(cache.config(scenicId: 125))
|
||||
|
||||
let cached = PayPageConfig(background: "https://cache.example.com/lake.png",
|
||||
logo: "", title: "缓存标题", subtitle: "赛里木湖")
|
||||
cache.save(cached, scenicId: 125)
|
||||
viewModel.refreshLocalState()
|
||||
await viewModel.loadPayPageConfig(api: api)
|
||||
XCTAssertEqual(viewModel.payPageConfig, cached)
|
||||
XCTAssertEqual(cache.config(scenicId: 125), cached)
|
||||
XCTAssertEqual(cache.config(scenicId: 128), .nalatiDefault)
|
||||
XCTAssertEqual(viewModel.brandingRefreshVersion, 0)
|
||||
}
|
||||
|
||||
|
||||
func testBrandPresentationUsesMatchingBundledAssetsAndTitleLines() {
|
||||
let viewModel = PaymentCollectionDetailsViewModel(appStore: appStore)
|
||||
for (scenicId, prefix, lines) in [(125, "payment_sailimu", 2), (128, "payment_nalati", 1)] {
|
||||
appStore.session.currentScenicId = scenicId
|
||||
viewModel.refreshLocalState()
|
||||
XCTAssertTrue(viewModel.usesBranding)
|
||||
XCTAssertEqual(viewModel.brandBackgroundAssetName, "\(prefix)_background")
|
||||
XCTAssertEqual(viewModel.brandLogoAssetName, "\(prefix)_logo")
|
||||
XCTAssertEqual(viewModel.brandTitleNumberOfLines, lines)
|
||||
XCTAssertNotNil(UIImage(named: viewModel.brandBackgroundAssetName))
|
||||
XCTAssertNotNil(UIImage(named: viewModel.brandLogoAssetName))
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user