92 lines
3.3 KiB
Swift
92 lines
3.3 KiB
Swift
//
|
|
// SettingViewModelTests.swift
|
|
// suixinkanTests
|
|
//
|
|
|
|
import XCTest
|
|
@testable import suixinkan
|
|
|
|
/// 设置中心 ViewModel 测试。
|
|
final class SettingViewModelTests: XCTestCase {
|
|
func testAppVersionUsesClientInfoFormatting() {
|
|
let viewModel = SettingViewModel(
|
|
infoDictionary: [
|
|
"CFBundleShortVersionString": "1.2",
|
|
"CFBundleVersion": "9",
|
|
],
|
|
environment: .testing
|
|
)
|
|
|
|
XCTAssertEqual(viewModel.appVersion, "1.2.9")
|
|
}
|
|
|
|
func testAppDownloadURLUsesEnvironmentBaseURL() {
|
|
let viewModel = SettingViewModel(infoDictionary: [:], environment: .testing)
|
|
|
|
XCTAssertEqual(viewModel.appDownloadURL.absoluteString, "https://api-test.zhifly.cn/h5/app/download")
|
|
}
|
|
|
|
func testVersionCodeComparison() {
|
|
XCTAssertTrue(SettingViewModel.isNewerVersionCode(11, than: 10))
|
|
XCTAssertFalse(SettingViewModel.isNewerVersionCode(10, than: 10))
|
|
XCTAssertFalse(SettingViewModel.isNewerVersionCode(9, than: 10))
|
|
XCTAssertFalse(SettingViewModel.isNewerVersionCode(11, than: nil))
|
|
}
|
|
|
|
func testAgreementDestinationsMapToAndroidPaths() {
|
|
let viewModel = SettingViewModel(infoDictionary: [:], environment: .testing)
|
|
|
|
let about = viewModel.agreementDestination(for: .aboutUs)
|
|
let userAgreement = viewModel.agreementDestination(for: .userAgreement)
|
|
let privacy = viewModel.agreementDestination(for: .privacyPolicy)
|
|
|
|
XCTAssertEqual(about.title, "关于我们")
|
|
XCTAssertEqual(about.url.absoluteString, "https://api-test.zhifly.cn/h5/app/about-us")
|
|
XCTAssertEqual(userAgreement.title, "用户协议")
|
|
XCTAssertEqual(userAgreement.url.absoluteString, "https://api-test.zhifly.cn/h5/app/user-agreement")
|
|
XCTAssertEqual(privacy.title, "隐私政策")
|
|
XCTAssertEqual(privacy.url.absoluteString, "https://api-test.zhifly.cn/h5/app/privacy-policy")
|
|
}
|
|
|
|
@MainActor
|
|
func testCheckLatestVersionMarksNewVersionWhenVersionCodeIsHigher() async throws {
|
|
let json = """
|
|
{
|
|
"code": 100000,
|
|
"msg": "success",
|
|
"data": {
|
|
"id": 1,
|
|
"type": 1,
|
|
"version": "1.0.1",
|
|
"operator": "admin",
|
|
"description": "update",
|
|
"status": 1,
|
|
"created_at": "2026-07-09 00:00:00",
|
|
"updated_at": "2026-07-09 00:00:00",
|
|
"deleted_at": null,
|
|
"version_code": 8,
|
|
"apk_url": "https://example.com/app.apk",
|
|
"is_force_update": 0,
|
|
"approve_notes": ""
|
|
}
|
|
}
|
|
""".data(using: .utf8)!
|
|
let session = MockURLSession(responses: [json])
|
|
let client = APIClient(environment: .testing, session: session)
|
|
let api = SettingAPI(client: client)
|
|
let viewModel = SettingViewModel(
|
|
infoDictionary: [
|
|
"CFBundleShortVersionString": "1.0.0",
|
|
"CFBundleVersion": "7",
|
|
],
|
|
environment: .testing
|
|
)
|
|
|
|
await viewModel.checkLatestVersion(api: api)
|
|
|
|
XCTAssertEqual(viewModel.latestVersion?.versionCode, 8)
|
|
XCTAssertTrue(viewModel.hasNewVersion)
|
|
XCTAssertEqual(session.requests.first?.url?.path, "/api/app/latest-version")
|
|
}
|
|
}
|