添加景区入驻申请流程并对齐 Android

This commit is contained in:
2026-07-07 11:09:27 +08:00
parent c4057537d2
commit 187ba990d4
22 changed files with 2202 additions and 216 deletions

View File

@ -54,7 +54,7 @@ final class PermissionApplyViewModelTests: XCTestCase {
viewModel.onShowMessage = { message = $0 }
await viewModel.submit(api: api)
XCTAssertEqual(message, "选择角色")
XCTAssertEqual(message, "请选择角色")
viewModel.selectRole(RoleOption(id: 10, name: "摄影师", description: "", isSelected: true))
await viewModel.submit(api: api)

View File

@ -0,0 +1,107 @@
//
// ScenicApplicationViewModelTests.swift
// suixinkanTests
//
import XCTest
@testable import suixinkan
@MainActor
/// ViewModel
final class ScenicApplicationViewModelTests: XCTestCase {
func testCanSubmitRequiresRequiredFields() {
let viewModel = ScenicApplicationViewModel()
XCTAssertFalse(viewModel.canSubmit)
viewModel.onProvinceSelected("浙江省")
viewModel.onCitySelected("杭州市")
viewModel.onRemarksChange("合作备注")
XCTAssertFalse(viewModel.canSubmit)
viewModel.toggleAgreement()
XCTAssertTrue(viewModel.canSubmit)
}
func testRemarksMaxLengthShowsMessage() {
let viewModel = ScenicApplicationViewModel()
var message: String?
viewModel.onShowMessage = { message = $0 }
let longText = String(repeating: "a", count: 51)
viewModel.onRemarksChange(longText)
XCTAssertEqual(viewModel.remarks.count, 0)
XCTAssertEqual(message, "备注信息最多50字")
}
func testProvinceSelectionClearsCity() {
let viewModel = ScenicApplicationViewModel()
viewModel.onProvinceSelected("浙江省")
viewModel.onCitySelected("杭州市")
XCTAssertEqual(viewModel.selectedCity, "杭州市")
viewModel.onProvinceSelected("江苏省")
XCTAssertEqual(viewModel.selectedProvince, "江苏省")
XCTAssertEqual(viewModel.selectedCity, "")
}
func testInitWithPendingApplicationStatus1() async throws {
let pendingJSON = """
{"code":100000,"msg":"success","data":{"items":[{"id":1,"scenic_name":"","scenic_images":"https://a.com/1.jpg,https://a.com/2.jpg","scenic_province":"","scenic_city":"","coop_type":2,"remark":"","status":1}]}}
""".data(using: .utf8)!
let areasJSON = """
{"code":100000,"msg":"success","data":[{"id":1,"name":"浙江省","children":[{"id":2,"name":"杭州市"}]}]}
""".data(using: .utf8)!
let homeAPI = HomeAPI(client: APIClient(environment: .testing, session: MockURLSession(responses: [pendingJSON])))
let profileAPI = ProfileAPI(client: APIClient(environment: .testing, session: MockURLSession(responses: [areasJSON])))
let viewModel = ScenicApplicationViewModel()
await viewModel.loadAreas(profileAPI: profileAPI)
await viewModel.loadPendingApplication(homeAPI: homeAPI)
XCTAssertEqual(viewModel.scenicName, "")
XCTAssertEqual(viewModel.selectedProvince, "")
XCTAssertEqual(viewModel.selectedCity, "")
XCTAssertEqual(viewModel.selectedCooperationType, .resourceProvider)
XCTAssertEqual(viewModel.remarks, "")
XCTAssertEqual(viewModel.selectedImages.count, 2)
XCTAssertTrue(viewModel.isReadOnly)
XCTAssertTrue(viewModel.shouldShowAuditCard)
}
func testSubmitValidationShowsIncompleteMessage() async {
let api = HomeAPI(client: APIClient(environment: .testing, session: MockURLSession(responses: [])))
let viewModel = ScenicApplicationViewModel()
var message: String?
viewModel.onShowMessage = { message = $0 }
await viewModel.submit(homeAPI: api)
XCTAssertEqual(message, "")
}
func testSubmitSuccessCallsCallback() async throws {
let submitJSON = """
{"code":100000,"msg":"success","data":{}}
""".data(using: .utf8)!
let pendingJSON = """
{"code":100000,"msg":"success","data":{"items":[]}}
""".data(using: .utf8)!
let api = HomeAPI(client: APIClient(environment: .testing, session: MockURLSession(responses: [submitJSON, pendingJSON])))
let viewModel = ScenicApplicationViewModel()
viewModel.onProvinceSelected("")
viewModel.onCitySelected("")
viewModel.onRemarksChange("")
viewModel.toggleAgreement()
var didSubmit = false
viewModel.onSubmitSuccess = { didSubmit = true }
var messages: [String] = []
viewModel.onShowMessage = { messages.append($0) }
await viewModel.submit(homeAPI: api)
XCTAssertTrue(didSubmit)
XCTAssertEqual(messages.first, "")
}
}