Initial commit

This commit is contained in:
2026-06-22 11:28:01 +08:00
commit ace9c94359
84 changed files with 8899 additions and 0 deletions

View File

@ -0,0 +1,133 @@
//
// AccountContextTests.swift
// suixinkanTests
//
// Created by Codex on 2026/6/20.
//
import XCTest
@testable import suixinkan
@MainActor
///
final class AccountContextTests: XCTestCase {
/// replaceScopes ID
func testReplaceScopesRestoresCurrentSelectionsById() {
let context = AccountContext()
let scenicScopes = [
BusinessScope(id: 1, name: "默认景区", kind: .scenic),
BusinessScope(id: 2, name: "缓存景区", kind: .scenic)
]
let storeScopes = [
BusinessScope(id: 10, name: "默认门店", kind: .store),
BusinessScope(id: 20, name: "缓存门店", kind: .store)
]
context.replaceScopes(
scenic: scenicScopes,
stores: storeScopes,
currentScenicId: 2,
currentStoreId: 20
)
XCTAssertEqual(context.currentScenic?.id, 2)
XCTAssertEqual(context.currentStore?.id, 20)
}
/// ID 退
func testReplaceScopesFallsBackToFirstScopeWhenCachedIdIsMissing() {
let context = AccountContext()
context.replaceScopes(
scenic: [BusinessScope(id: 1, name: "默认景区", kind: .scenic)],
stores: [BusinessScope(id: 10, name: "默认门店", kind: .store)],
currentScenicId: 999,
currentStoreId: 999
)
XCTAssertEqual(context.currentScenic?.id, 1)
XCTAssertEqual(context.currentStore?.id, 10)
}
///
func testSelectScenicResolvesStoreWithinSelectedScenic() {
let context = AccountContext()
context.replaceScopes(
scenic: [
BusinessScope(id: 1, name: "西湖景区", kind: .scenic),
BusinessScope(id: 2, name: "东湖景区", kind: .scenic)
],
stores: [
BusinessScope(id: 10, name: "西湖门店", kind: .store, parentScenicId: 1),
BusinessScope(id: 20, name: "东湖门店", kind: .store, parentScenicId: 2)
],
currentScenicId: 1,
currentStoreId: 10
)
context.selectScenic(id: 2)
XCTAssertEqual(context.currentScenic?.id, 2)
XCTAssertEqual(context.currentStore?.id, 20)
}
///
func testSelectRoleUpdatesScenicScopesAndStoreSelection() {
let accountContext = AccountContext()
let permissionContext = PermissionContext()
accountContext.replaceScopes(
scenic: [BusinessScope(id: 1, name: "旧景区", kind: .scenic)],
stores: [
BusinessScope(id: 10, name: "旧门店", kind: .store, parentScenicId: 1),
BusinessScope(id: 20, name: "新门店", kind: .store, parentScenicId: 2)
],
currentScenicId: 1,
currentStoreId: 10
)
permissionContext.replaceRolePermissions([
RolePermissionResponse(
role: RoleInfo(id: 1, name: "旧角色"),
scenic: [ScenicInfo(id: 1, name: "旧景区")]
),
RolePermissionResponse(
role: RoleInfo(id: 2, name: "新角色"),
scenic: [ScenicInfo(id: 2, name: "新景区")]
)
])
permissionContext.selectRole(id: 2, accountContext: accountContext)
XCTAssertEqual(permissionContext.currentRole?.id, 2)
XCTAssertEqual(accountContext.scenicScopes.map(\.id), [2])
XCTAssertEqual(accountContext.currentScenic?.id, 2)
XCTAssertEqual(accountContext.currentStore?.id, 20)
}
/// URI
func testPermissionContextFlattensPermissionURIs() {
let permissionContext = PermissionContext()
permissionContext.replaceRolePermissions([
RolePermissionResponse(
role: RoleInfo(
id: 1,
name: "运营",
permission: [
PermissionItem(
id: 1,
name: "首页",
uri: "/home",
children: [
PermissionItem(id: 2, name: "订单", uri: "/orders")
]
)
]
),
scenic: []
)
])
XCTAssertTrue(permissionContext.canAccess("/home"))
XCTAssertTrue(permissionContext.canAccess("/orders"))
XCTAssertFalse(permissionContext.canAccess("/settings"))
}
}