feat: add wild photographer report mock flow

This commit is contained in:
2026-07-08 12:06:13 +08:00
parent 87fba3d5d6
commit 8a65d3c104
14 changed files with 3542 additions and 0 deletions

View File

@ -120,4 +120,27 @@ final class AllFunctionsViewModelTests: XCTestCase {
XCTAssertEqual(viewModel.moreMenus.map(\.uri), ["wallet"])
XCTAssertTrue(viewModel.didCustomize)
}
func testPhotographerReportMenuVisibleAndCanBeAddedToCommon() {
appStore.savePermissionItems([
HomePermissionItem(id: "1", name: "位置上报", uri: "location_report"),
HomePermissionItem(id: "2", name: "举报摄影师", uri: "report_photographer"),
])
menuStore.saveCommonURIs(
["location_report"],
accountScope: appStore.accountCachePrefix,
roleCode: appStore.roleCode
)
let viewModel = AllFunctionsViewModel(appStore: appStore, commonMenuStore: menuStore)
viewModel.loadFunctions()
XCTAssertEqual(HomeMenuCatalog.item(for: "report_photographer")?.title, "举报摄影师")
XCTAssertEqual(viewModel.moreMenus.map(\.uri), ["report_photographer"])
let menu = viewModel.moreMenus[0]
viewModel.addToCommon(menu)
XCTAssertEqual(viewModel.commonMenus.map(\.uri), ["location_report", "report_photographer"])
}
}

View File

@ -58,4 +58,11 @@ final class HomeCommonMenuStoreTests: XCTestCase {
XCTAssertEqual(split.common.map(\.uri), ["wallet", "task_management"])
XCTAssertEqual(split.more.map(\.uri), ["cloud_management"])
}
func testPhotographerReportCatalogItemExists() {
let item = HomeMenuCatalog.item(for: "report_photographer")
XCTAssertEqual(item?.title, "举报摄影师")
XCTAssertEqual(item?.iconName, "exclamationmark.shield")
}
}

View File

@ -0,0 +1,122 @@
//
// WildPhotographerReportTests.swift
// suixinkanTests
//
import XCTest
@testable import suixinkan
/// Mock
final class WildPhotographerReportTests: XCTestCase {
func testSeedDataLoadsReportsAndRiskPoints() {
let viewModel = WildPhotographerReportHomeViewModel()
XCTAssertFalse(viewModel.reports.isEmpty)
XCTAssertFalse(viewModel.riskPoints.isEmpty)
XCTAssertEqual(viewModel.reports.count, WildPhotographerReportMockStore.seedReports.count)
}
func testSubmitReportGeneratesDynamicIDAndInsertsFirst() {
let viewModel = WildPhotographerReportHomeViewModel()
let beforeCount = viewModel.reports.count
let record = viewModel.submitReport(
reportType: .suspectedWild,
description: "测试举报说明",
location: "测试景区 · 测试点位",
contact: "13800138000",
imageCount: 1,
videoCount: 0
)
XCTAssertEqual(viewModel.reports.count, beforeCount + 1)
XCTAssertEqual(viewModel.reports.first?.id, record.id)
XCTAssertTrue(record.id.hasPrefix("JB"))
XCTAssertEqual(record.status, .pending)
XCTAssertEqual(record.phoneNumber, "13800138000")
}
func testSubmitFailsWithoutEvidence() {
let homeViewModel = WildPhotographerReportHomeViewModel()
let viewModel = WildPhotographerReportSubmitViewModel(homeViewModel: homeViewModel)
viewModel.removeAttachment(viewModel.images[0])
viewModel.removeAttachment(viewModel.videos[0])
viewModel.updateDescription("有说明")
viewModel.applyResolvedLocation("测试位置")
viewModel.submitReport()
XCTAssertEqual(viewModel.validationMessage, "请至少上传一项现场证据。")
XCTAssertNil(viewModel.submitResult)
}
func testSubmitFailsWithoutDescription() {
let homeViewModel = WildPhotographerReportHomeViewModel()
let viewModel = WildPhotographerReportSubmitViewModel(homeViewModel: homeViewModel)
viewModel.updateDescription(" ")
viewModel.applyResolvedLocation("测试位置")
viewModel.submitReport()
XCTAssertEqual(viewModel.validationMessage, "请填写举报说明。")
XCTAssertNil(viewModel.submitResult)
}
func testSubmitFailsWithoutConfirmedLocation() {
let homeViewModel = WildPhotographerReportHomeViewModel()
let viewModel = WildPhotographerReportSubmitViewModel(homeViewModel: homeViewModel)
viewModel.updateDescription("测试说明")
viewModel.submitReport()
XCTAssertEqual(viewModel.validationMessage, "请先更新举报位置后再提交举报。")
XCTAssertNil(viewModel.submitResult)
}
func testSubmitSuccessCreatesRecord() {
let homeViewModel = WildPhotographerReportHomeViewModel()
let viewModel = WildPhotographerReportSubmitViewModel(homeViewModel: homeViewModel)
viewModel.updateDescription("测试说明")
viewModel.applyResolvedLocation("测试景区 · 测试点")
viewModel.submitReport()
XCTAssertNil(viewModel.validationMessage)
XCTAssertNotNil(viewModel.submitResult)
XCTAssertEqual(homeViewModel.reports.first?.id, viewModel.submitResult?.record.id)
}
func testListFilterReturnsMatchingStatus() {
let homeViewModel = WildPhotographerReportHomeViewModel()
let viewModel = WildPhotographerReportListViewModel(homeViewModel: homeViewModel)
viewModel.selectFilter(.pending)
XCTAssertTrue(viewModel.filteredReports.allSatisfy { $0.status == .pending })
viewModel.selectFilter(.processing)
XCTAssertTrue(viewModel.filteredReports.allSatisfy { $0.status == .processing })
viewModel.selectFilter(.processed)
XCTAssertTrue(viewModel.filteredReports.allSatisfy { $0.status == .processed })
viewModel.selectFilter(.all)
XCTAssertEqual(viewModel.filteredReports.count, homeViewModel.reports.count)
}
func testSupplementEvidenceValidationAndSuccess() {
let homeViewModel = WildPhotographerReportHomeViewModel()
let reportID = homeViewModel.reports[0].id
let viewModel = WildReportSupplementEvidenceViewModel(reportID: reportID, homeViewModel: homeViewModel)
viewModel.submit()
XCTAssertEqual(viewModel.validationMessage, "请至少填写补充说明或上传一项证据。")
viewModel.updateText("补充说明")
viewModel.addImage()
viewModel.submit()
XCTAssertTrue(viewModel.didSubmit)
XCTAssertEqual(homeViewModel.supplementaryEvidences(for: reportID).first?.text, "补充说明")
XCTAssertEqual(homeViewModel.supplementaryEvidences(for: reportID).first?.imageCount, 1)
}
}