迁移合作订单完整能力,并统一 AppRoleCode 角色权限与首页菜单展示。

新增 CooperationOrder 模块(双 Tab 列表、获客员绑定、主 Tab 扫码)、订单来源/带客单绑定及配套 API 测试;同步引入 roleCode 权限匹配与相关单元测试。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-29 13:33:00 +08:00
parent d310d26293
commit 1970572edd
66 changed files with 4247 additions and 201 deletions

View File

@ -10,38 +10,117 @@ import XCTest
///
final class HomeCommonMenuStoreTests: XCTestCase {
///
func testLoadCreatesDefaultCommonMenusWhenBaselineIsMissing() {
///
func testLoadCreatesDefaultCommonMenusFromTopLevelPermissions() {
let defaults = makeIsolatedDefaults()
let store = HomeCommonMenuStore(defaults: defaults)
let menus = [
menu("registration_invitation"),
menu("location_report"),
menu("pm_manager")
menu("space_settings"),
menu("wallet"),
menu("cloud_management"),
menu("message_center")
]
let uris = store.load(menuItems: menus)
let uris = store.load(
menuItems: menus,
roleCode: "photographer",
topLevelPermissionURIs: ["space_settings", "wallet", "cloud_management", "message_center"]
)
XCTAssertEqual(uris, ["registration_invitation", "location_report", "pm_manager"])
XCTAssertTrue(defaults.bool(forKey: HomeCommonMenuStore.defaultBaselineKey))
XCTAssertEqual(uris, ["space_settings", "wallet", "cloud_management", "message_center"])
XCTAssertEqual(
defaults.stringArray(forKey: HomeCommonMenuStore.storageKeyPrefix + "photographer"),
["space_settings", "wallet", "cloud_management", "message_center"]
)
}
/// 4 4
func testDefaultCommonURIsTakeFirstFourWhenMoreThanFourPermissions() {
let availableURIs: Set<String> = [
"space_settings",
"wallet",
"cloud_management",
"message_center",
"task_management"
]
let uris = HomeCommonMenuStore.defaultCommonURIs(
orderedTopLevelURIs: [
"space_settings",
"wallet",
"cloud_management",
"message_center",
"task_management"
],
availableURIs: availableURIs
)
XCTAssertEqual(uris, ["space_settings", "wallet", "cloud_management", "message_center"])
}
/// URI
func testLoadCreatesDefaultsWithoutLegacyPreferredURIs() {
let defaults = makeIsolatedDefaults()
let store = HomeCommonMenuStore(defaults: defaults)
let menus = [
menu("space_settings"),
menu("wallet"),
menu("cloud_management")
]
let uris = store.load(
menuItems: menus,
roleCode: "editor",
topLevelPermissionURIs: ["space_settings", "wallet", "cloud_management"]
)
XCTAssertEqual(uris, ["space_settings", "wallet", "cloud_management"])
}
/// URI URI
func testLoadFiltersSavedUrisByCurrentPermissions() {
let defaults = makeIsolatedDefaults()
defaults.set(true, forKey: HomeCommonMenuStore.defaultBaselineKey)
defaults.set(["task_management", "unknown", "pm"], forKey: HomeCommonMenuStore.defaultStorageKey)
defaults.set(["task_management", "unknown", "pm"], forKey: HomeCommonMenuStore.storageKeyPrefix + "photographer")
let store = HomeCommonMenuStore(defaults: defaults)
let menus = [
menu("task_management_editor"),
menu("project_edit")
]
let uris = store.load(menuItems: menus)
let uris = store.load(
menuItems: menus,
roleCode: "photographer",
topLevelPermissionURIs: ["task_management_editor", "project_edit"]
)
XCTAssertEqual(uris, ["task_management_editor", "project_edit"])
}
/// 使 key
func testLoadUsesRoleScopedStorageKeys() {
let defaults = makeIsolatedDefaults()
defaults.set(["wallet"], forKey: HomeCommonMenuStore.storageKeyPrefix + "photographer")
defaults.set(["cloud_management"], forKey: HomeCommonMenuStore.storageKeyPrefix + "editor")
let store = HomeCommonMenuStore(defaults: defaults)
let menus = [
menu("wallet"),
menu("cloud_management")
]
let roleOne = store.load(
menuItems: menus,
roleCode: "photographer",
topLevelPermissionURIs: ["wallet", "cloud_management"]
)
let roleTwo = store.load(
menuItems: menus,
roleCode: "editor",
topLevelPermissionURIs: ["wallet", "cloud_management"]
)
XCTAssertEqual(roleOne, ["wallet"])
XCTAssertEqual(roleTwo, ["cloud_management"])
}
/// URI
func testAddDeduplicatesAliases() {
let defaults = makeIsolatedDefaults()
@ -50,7 +129,12 @@ final class HomeCommonMenuStoreTests: XCTestCase {
menu("task_management_editor")
]
let uris = store.add("task_management", current: ["task_management_editor"], menuItems: menus)
let uris = store.add(
"task_management",
current: ["task_management_editor"],
menuItems: menus,
roleCode: "photographer"
)
XCTAssertEqual(uris, ["task_management_editor"])
}
@ -60,11 +144,45 @@ final class HomeCommonMenuStoreTests: XCTestCase {
let defaults = makeIsolatedDefaults()
let store = HomeCommonMenuStore(defaults: defaults)
let uris = store.remove("pm", current: ["project_edit", "pm_manager", "location_report"])
let uris = store.remove("pm", current: ["project_edit", "pm_manager", "location_report"], roleCode: "photographer")
XCTAssertEqual(uris, ["pm_manager", "location_report"])
}
/// role_code
func testLoadReturnsEmptyWhenRoleCodeIsMissing() {
let defaults = makeIsolatedDefaults()
let store = HomeCommonMenuStore(defaults: defaults)
let uris = store.load(
menuItems: [menu("wallet")],
roleCode: nil,
topLevelPermissionURIs: ["wallet"]
)
XCTAssertTrue(uris.isEmpty)
XCTAssertNil(defaults.stringArray(forKey: HomeCommonMenuStore.storageKeyPrefix + "photographer"))
}
/// legacy role id key
func testLoadMigratesLegacyRoleIdStorageKey() {
let defaults = makeIsolatedDefaults()
defaults.set(["wallet", "cloud_management"], forKey: HomeCommonMenuStore.storageKeyPrefix + "46")
let store = HomeCommonMenuStore(defaults: defaults)
let menus = [menu("wallet"), menu("cloud_management")]
let uris = store.load(
menuItems: menus,
roleCode: "store_admin",
legacyRoleId: 46,
topLevelPermissionURIs: ["wallet", "cloud_management"]
)
XCTAssertEqual(uris, ["wallet", "cloud_management"])
XCTAssertEqual(defaults.stringArray(forKey: HomeCommonMenuStore.storageKeyPrefix + "store_admin"), ["wallet", "cloud_management"])
XCTAssertNil(defaults.stringArray(forKey: HomeCommonMenuStore.storageKeyPrefix + "46"))
}
///
private func menu(_ uri: String) -> HomeMenuItem {
HomeMenuItem(title: HomeMenuRouter.title(for: uri), uri: uri, iconSrc: nil)