Files
suixinkan_ios_new/suixinkanTests/WildPhotographerReport/WildPhotographerReportTests.swift

142 lines
5.4 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// WildPhotographerReportTests.swift
// suixinkanTests
//
// Created by Codex on 2026/7/1.
//
import XCTest
@testable import suixinkan
/// Mock
@MainActor
final class WildPhotographerReportHomeViewModelTests: XCTestCase {
///
func testSeedDataLoadsReportsAndRiskPoints() {
let viewModel = WildPhotographerReportHomeViewModel()
XCTAssertFalse(viewModel.reports.isEmpty)
XCTAssertFalse(viewModel.riskPoints.isEmpty)
XCTAssertEqual(viewModel.reports.count, WildPhotographerReportMockStore.seedReports.count)
}
/// JB
func testSubmitReportGeneratesDynamicID() {
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.reportType, .suspectedWild)
XCTAssertEqual(record.phoneNumber, "13800138000")
}
}
@MainActor
final class WildPhotographerReportSubmitViewModelTests: XCTestCase {
///
func testSubmitFailsWithoutEvidence() {
let homeViewModel = WildPhotographerReportHomeViewModel()
let viewModel = WildPhotographerReportSubmitViewModel(homeViewModel: homeViewModel)
viewModel.images = []
viewModel.videos = []
viewModel.description = "有说明"
viewModel.reportLocation = "测试位置"
viewModel.locationConfirmed = true
viewModel.submitReport()
XCTAssertEqual(viewModel.validationMessage, "请至少上传一项现场证据。")
XCTAssertNil(viewModel.submitResult)
}
///
func testSubmitFailsWithoutDescription() {
let homeViewModel = WildPhotographerReportHomeViewModel()
let viewModel = WildPhotographerReportSubmitViewModel(homeViewModel: homeViewModel)
viewModel.description = " "
viewModel.reportLocation = "测试位置"
viewModel.locationConfirmed = true
viewModel.submitReport()
XCTAssertEqual(viewModel.validationMessage, "请填写举报说明。")
XCTAssertNil(viewModel.submitResult)
}
///
func testSubmitFailsWithoutConfirmedLocation() {
let homeViewModel = WildPhotographerReportHomeViewModel()
let viewModel = WildPhotographerReportSubmitViewModel(homeViewModel: homeViewModel)
viewModel.description = "测试说明"
viewModel.locationConfirmed = false
viewModel.submitReport()
XCTAssertEqual(viewModel.validationMessage, "请先更新举报位置后再提交举报。")
XCTAssertNil(viewModel.submitResult)
}
///
func testSubmitFailsWhileUpdatingLocation() {
let homeViewModel = WildPhotographerReportHomeViewModel()
let viewModel = WildPhotographerReportSubmitViewModel(homeViewModel: homeViewModel)
viewModel.description = "测试说明"
viewModel.isUpdatingLocation = true
viewModel.locationConfirmed = true
viewModel.reportLocation = "测试位置"
viewModel.submitReport()
XCTAssertEqual(viewModel.validationMessage, "正在获取定位,请稍后再提交。")
XCTAssertNil(viewModel.submitResult)
}
/// Mock
func testSubmitSuccessCreatesRecord() {
let homeViewModel = WildPhotographerReportHomeViewModel()
let viewModel = WildPhotographerReportSubmitViewModel(homeViewModel: homeViewModel)
viewModel.description = "测试说明"
viewModel.reportLocation = "测试景区 · 测试点"
viewModel.locationConfirmed = true
viewModel.submitReport()
XCTAssertNil(viewModel.validationMessage)
XCTAssertNotNil(viewModel.submitResult)
XCTAssertEqual(homeViewModel.reports.first?.id, viewModel.submitResult?.record.id)
}
}
@MainActor
final class WildPhotographerReportListViewModelTests: XCTestCase {
///
func testFilterReturnsMatchingStatus() {
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)
}
}