新增 SplashView、SplashCoordinator 与 Launch Screen 资源,移除冷启动 Lottie;LoginView 加载 App 配置。同时将 token 存储迁移至 UserDefaults,并更新相关测试与文档。 Co-authored-by: Cursor <cursoragent@cursor.com>
84 lines
2.9 KiB
Swift
84 lines
2.9 KiB
Swift
//
|
||
// StorageTests.swift
|
||
// suixinkanTests
|
||
//
|
||
// Created by Codex on 2026/6/20.
|
||
//
|
||
|
||
import XCTest
|
||
@testable import suixinkan
|
||
|
||
/// 本地缓存 Store 测试,覆盖 UserDefaults 中的偏好和账号快照。
|
||
final class StorageTests: XCTestCase {
|
||
/// 测试 SessionTokenStore 使用 UserDefaults 保存、读取、修剪和清空正式 token。
|
||
func testSessionTokenStorePersistsTokenInUserDefaults() throws {
|
||
let defaults = makeIsolatedDefaults()
|
||
let store = SessionTokenStore(defaults: defaults, key: "session.token.test")
|
||
|
||
try store.save(" token-123 ")
|
||
XCTAssertEqual(store.load(), "token-123")
|
||
|
||
try store.clear()
|
||
XCTAssertNil(store.load())
|
||
}
|
||
|
||
/// 测试保存空 token 会清空本地正式 token。
|
||
func testSessionTokenStoreClearsWhenSavingBlankToken() throws {
|
||
let defaults = makeIsolatedDefaults()
|
||
let store = SessionTokenStore(defaults: defaults, key: "session.token.blank.test")
|
||
|
||
try store.save("token-123")
|
||
try store.save(" \n")
|
||
|
||
XCTAssertNil(store.load())
|
||
}
|
||
|
||
/// 测试 AppPreferencesStore 能保存并读取上次登录手机号和协议状态。
|
||
func testAppPreferencesStorePersistsLoginPreferences() {
|
||
let defaults = makeIsolatedDefaults()
|
||
let store = AppPreferencesStore(defaults: defaults)
|
||
|
||
store.saveLastLoginUsername(" 18651857230 ")
|
||
store.savePrivacyAgreementAccepted(true)
|
||
|
||
XCTAssertEqual(store.loadLastLoginUsername(), "18651857230")
|
||
XCTAssertTrue(store.loadPrivacyAgreementAccepted())
|
||
}
|
||
|
||
/// 测试账号快照能保存并恢复账号资料、业务作用域和当前选择。
|
||
func testAccountSnapshotStorePersistsAccountContextSnapshot() {
|
||
let defaults = makeIsolatedDefaults()
|
||
let store = AccountSnapshotStore(defaults: defaults)
|
||
let snapshot = AccountSnapshot(
|
||
profile: AccountProfile(
|
||
userId: "101",
|
||
displayName: "测试账号",
|
||
phone: "18651857230",
|
||
avatarURL: "https://cdn.example.com/avatar.jpg"
|
||
),
|
||
accountType: "store_user",
|
||
businessUserId: 101,
|
||
scenicScopes: [
|
||
BusinessScope(id: 88, name: "东门景区", kind: .scenic)
|
||
],
|
||
storeScopes: [
|
||
BusinessScope(id: 66, name: "东门门店", kind: .store)
|
||
],
|
||
currentScenicId: 88,
|
||
currentStoreId: 66
|
||
)
|
||
|
||
store.save(snapshot)
|
||
|
||
XCTAssertEqual(store.load(), snapshot)
|
||
}
|
||
|
||
/// 创建独立 UserDefaults,避免测试污染真实 App 偏好。
|
||
private func makeIsolatedDefaults() -> UserDefaults {
|
||
let suiteName = "suixinkan.tests.\(UUID().uuidString)"
|
||
let defaults = UserDefaults(suiteName: suiteName)!
|
||
defaults.removePersistentDomain(forName: suiteName)
|
||
return defaults
|
||
}
|
||
}
|