移除 ScenicPromotion 宣传页模块,并隐藏首页 promotion_page 入口。

删除 Mock 模块、图片资源与路由;从常用菜单白名单剔除该权限,后端仍下发时客户端静默忽略。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-03 20:48:37 +08:00
parent 49e997ddba
commit 9df4c4f6e8
56 changed files with 43 additions and 3583 deletions

View File

@ -272,6 +272,8 @@ final class HomeCommonMenuStoreTests: XCTestCase {
/// report_photographer Android menuList
func testPhotographerReportIsWhitelistedAndCanBeAddedToCommon() {
XCTAssertTrue(HomeCommonMenuStore.androidHomeMenuURIs.contains("report_photographer"))
XCTAssertFalse(HomeCommonMenuStore.androidHomeMenuURIs.contains("promotion_page"))
XCTAssertTrue(HomeCommonMenuStore.hiddenHomeMenuURIs.contains("promotion_page"))
let store = HomeCommonMenuStore(defaults: makeIsolatedDefaults())
let uris = store.add(
@ -285,6 +287,30 @@ final class HomeCommonMenuStoreTests: XCTestCase {
XCTAssertEqual(uris, ["location_report", "report_photographer"])
}
/// promotion_page
func testPromotionPageIsHiddenFromCommonMenu() {
let defaults = makeIsolatedDefaults()
defaults.set(
["wallet", "promotion_page", "message_center"],
forKey: HomeCommonMenuStore.storageKey(roleCode: "photographer", accountScope: "scenic_user_promotion")
)
let store = HomeCommonMenuStore(defaults: defaults)
let menus = [
menu("wallet"),
menu("promotion_page"),
menu("message_center")
]
let uris = store.load(
menuItems: menus,
roleCode: "photographer",
accountScope: "scenic_user_promotion",
topLevelPermissionURIs: menus.map(\.uri)
)
XCTAssertEqual(uris, ["wallet", "message_center"])
}
/// 4
func testDefaultCommonDoesNotBackfillAfterNonCatalogSlots() {
let uris = HomeCommonMenuStore.defaultCommonURIs(

View File

@ -48,7 +48,6 @@ final class HomeMenuRouterTests: XCTestCase {
("location_report", .destination(.locationReport)),
("location_report_history", .destination(.locationReportHistory)),
("report_photographer", .destination(.photographerReport)),
("promotion_page", .destination(.scenicPromotion)),
("pm", .destination(.projectManagement)),
("project_edit", .destination(.projectManagement)),
("pm_manager", .destination(.pmProjectManagement)),

View File

@ -1,183 +0,0 @@
//
// ScenicPromotionTests.swift
// suixinkanTests
//
// Created by Codex on 2026/7/2.
//
import XCTest
@testable import suixinkan
/// ViewModel
@MainActor
final class ScenicPromotionViewModelTests: XCTestCase {
/// normal
func testApplyNormalScenarioLoadsBoardAndSelection() {
let viewModel = ScenicPromotionViewModel()
viewModel.applyScenario(.normal)
XCTAssertEqual(viewModel.pageState, .normal)
XCTAssertNotNil(viewModel.board)
XCTAssertEqual(viewModel.board?.scenicName, "那拉提景区")
XCTAssertNotNil(viewModel.selectedSpot)
XCTAssertNotNil(viewModel.selectedMedia)
XCTAssertFalse(viewModel.mediaItems.isEmpty)
}
/// empty
func testApplyEmptyScenarioClearsBoard() {
let viewModel = ScenicPromotionViewModel()
viewModel.applyScenario(.normal)
viewModel.applyScenario(.empty)
XCTAssertEqual(viewModel.pageState, .empty)
XCTAssertNil(viewModel.board)
}
/// error
func testApplyErrorScenarioSetsErrorState() {
let viewModel = ScenicPromotionViewModel()
viewModel.applyScenario(.error)
if case .error = viewModel.pageState {
XCTAssertTrue(true)
} else {
XCTFail("Expected error page state")
}
}
///
func testNoMediaScenarioHidesMediaItems() {
let viewModel = ScenicPromotionViewModel()
viewModel.applyScenario(.normal)
viewModel.applyScenario(.noMedia)
XCTAssertTrue(viewModel.mediaItems.isEmpty)
XCTAssertNil(viewModel.selectedMedia)
}
///
func testNoQueueScenarioHidesQueueInfo() {
let viewModel = ScenicPromotionViewModel()
viewModel.applyScenario(.normal)
viewModel.applyScenario(.noQueue)
XCTAssertNil(viewModel.queue)
XCTAssertFalse(viewModel.hasQueueData)
}
///
func testSelectSpotAndModeUpdatesSelectedMedia() {
let viewModel = ScenicPromotionViewModel()
viewModel.applyScenario(.normal)
guard let board = viewModel.board, board.spots.count > 1 else {
XCTFail("Expected multiple spots in mock board")
return
}
let secondSpot = board.spots[1]
viewModel.selectSpot(secondSpot)
XCTAssertEqual(viewModel.selectedSpot?.id, secondSpot.id)
viewModel.selectMode(.photo)
XCTAssertEqual(viewModel.selectedMode, .photo)
XCTAssertEqual(viewModel.selectedMedia?.mode, .photo)
}
///
func testMoveMediaCyclesSelection() {
let viewModel = ScenicPromotionViewModel()
viewModel.applyScenario(.normal)
guard viewModel.mediaItems.count > 1 else {
XCTFail("Expected multiple media items")
return
}
let firstID = viewModel.selectedMedia?.id
viewModel.moveMedia(1)
XCTAssertNotEqual(viewModel.selectedMedia?.id, firstID)
viewModel.moveMedia(-1)
XCTAssertEqual(viewModel.selectedMedia?.id, firstID)
}
}
/// ViewModel
@MainActor
final class ScenicPromotionSettingsViewModelTests: XCTestCase {
/// Mock
func testApplyNormalScenarioLoadsSettingsData() {
let viewModel = ScenicPromotionSettingsViewModel()
viewModel.applyScenario(.normal)
XCTAssertEqual(viewModel.pageState, .normal)
XCTAssertFalse(viewModel.queuePoints.isEmpty)
XCTAssertFalse(viewModel.materialPoints.isEmpty)
XCTAssertFalse(viewModel.selectedQueuePointIDs.isEmpty)
}
///
func testAddMaterialFailsWithoutMaterialPoint() {
let viewModel = ScenicPromotionSettingsViewModel()
viewModel.applyScenario(.normal)
viewModel.selectedMaterialPointID = nil
XCTAssertFalse(viewModel.addMaterial(kind: .video))
}
/// Mock
func testAddMaterialSucceedsWithMaterialPoint() {
let viewModel = ScenicPromotionSettingsViewModel()
viewModel.applyScenario(.normal)
guard let point = viewModel.materialPoints.first else {
XCTFail("Expected material points")
return
}
viewModel.selectMaterialPoint(point)
let beforeCount = viewModel.materials(for: .video).count
XCTAssertTrue(viewModel.addMaterial(kind: .video))
XCTAssertEqual(viewModel.materials(for: .video).count, beforeCount + 1)
}
///
func testDeleteMaterialRemovesItem() {
let viewModel = ScenicPromotionSettingsViewModel()
viewModel.applyScenario(.normal)
guard let point = viewModel.materialPoints.first else {
XCTFail("Expected material points")
return
}
viewModel.selectMaterialPoint(point)
guard viewModel.addMaterial(kind: .image),
let material = viewModel.materials(for: .image).last else {
XCTFail("Expected uploaded material")
return
}
viewModel.deleteMaterial(material)
XCTAssertFalse(viewModel.materials(for: .image).contains(where: { $0.id == material.id }))
}
///
func testSubmitFailsWithoutQueuePoints() {
let viewModel = ScenicPromotionSettingsViewModel()
viewModel.applyScenario(.normal)
viewModel.selectedQueuePointIDs = []
XCTAssertFalse(viewModel.submit())
}
///
func testSubmitSucceedsWithQueuePoints() {
let viewModel = ScenicPromotionSettingsViewModel()
viewModel.applyScenario(.normal)
XCTAssertTrue(viewModel.submit())
}
}