Files
suixinkan_uikit/suixinkanTests/PermissionApplyStatusViewModelTests.swift
汉秋 efb3925257 完善首页权限申请流程与队列播报体验。
对齐 Android 无权限强制弹窗、角色下拉与申请页交互,补充 UIButton configuration 适配,并增强景区排队 TTS 与相关单元测试。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-14 13:46:45 +08:00

83 lines
3.7 KiB
Swift

//
// PermissionApplyStatusViewModelTests.swift
// suixinkanTests
//
import XCTest
@testable import suixinkan
@MainActor
/// ViewModel
final class PermissionApplyStatusViewModelTests: XCTestCase {
func testLoadPendingDataMatchesApplyCode() async throws {
let json = """
{"code":100000,"msg":"success","data":[{"code":"AP001","role_id":1,"role_name":"","scenic_list":[{"id":1,"name":"A"}],"status":1,"status_label":"","created_at":"2026-01-01","audit_note":"","audited_at":null,"audited_by":null}]}
""".data(using: .utf8)!
let api = HomeAPI(client: APIClient(environment: .testing, session: MockURLSession(responses: [json])))
let viewModel = PermissionApplyStatusViewModel(applyCode: "AP001")
await viewModel.loadPendingData(api: api)
XCTAssertEqual(viewModel.pendingData?.code, "AP001")
XCTAssertEqual(viewModel.pendingData?.status, 1)
XCTAssertFalse(viewModel.isLoading)
}
func testNavigateToEditWhenRejected() async throws {
let json = """
{"code":100000,"msg":"success","data":[{"code":"AP002","role_id":2,"role_name":"","scenic_list":[],"status":3,"status_label":"","created_at":"","audit_note":"","audited_at":null,"audited_by":null}]}
""".data(using: .utf8)!
let api = HomeAPI(client: APIClient(environment: .testing, session: MockURLSession(responses: [json])))
let viewModel = PermissionApplyStatusViewModel(applyCode: "AP002")
await viewModel.loadPendingData(api: api)
var edited: RoleApplyPendingResponse?
viewModel.onNavigateToEdit = { edited = $0 }
viewModel.navigateToEditIfRejected()
XCTAssertEqual(edited?.status, 3)
}
func testNavigateToEditIgnoredWhenReviewing() async throws {
let json = """
{"code":100000,"msg":"success","data":[{"code":"AP003","role_id":1,"role_name":"","scenic_list":[],"status":1,"status_label":"","created_at":"","audit_note":"","audited_at":null,"audited_by":null}]}
""".data(using: .utf8)!
let api = HomeAPI(client: APIClient(environment: .testing, session: MockURLSession(responses: [json])))
let viewModel = PermissionApplyStatusViewModel(applyCode: "AP003")
await viewModel.loadPendingData(api: api)
var edited: RoleApplyPendingResponse?
viewModel.onNavigateToEdit = { edited = $0 }
viewModel.navigateToEditIfRejected()
XCTAssertNil(edited)
}
func testCompletedApplicationIsNotDisplayedAsPending() async throws {
let json = """
{"code":100000,"msg":"success","data":[{"code":"AP004","role_id":1,"role_name":"","scenic_list":[],"status":2,"status_label":"","created_at":"","audit_note":"","audited_at":null,"audited_by":null}]}
""".data(using: .utf8)!
let api = HomeAPI(client: APIClient(environment: .testing, session: MockURLSession(responses: [json])))
let viewModel = PermissionApplyStatusViewModel(applyCode: "AP004")
await viewModel.loadPendingData(api: api)
XCTAssertNil(viewModel.pendingData)
XCTAssertFalse(viewModel.isLoading)
}
func testScenicListDialogState() {
let viewModel = PermissionApplyStatusViewModel(applyCode: "AP005")
let scenic = ScenicInfo(id: 12, name: "西湖景区", status: 1)
viewModel.showScenicList(roleName: "摄影师", scenics: [scenic])
XCTAssertTrue(viewModel.showScenicListDialog)
XCTAssertEqual(viewModel.dialogRoleName, "摄影师")
XCTAssertEqual(viewModel.dialogScenicList, [scenic])
viewModel.hideScenicList()
XCTAssertFalse(viewModel.showScenicListDialog)
}
}