Add scenic selection and cooperation order flows aligned with Android.

Upgrade scenic picker with search, location sorting, permission apply/status, and blocking home dialog; add cooperation order module and order source picker improvements with unit tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-07 10:48:43 +08:00
parent 3c4ca7eefb
commit 2bea05b1d9
50 changed files with 5603 additions and 191 deletions

View File

@ -0,0 +1,63 @@
//
// CooperationOrderListViewModelTests.swift
// suixinkanTests
//
import XCTest
@testable import suixinkan
@MainActor
final class CooperationOrderListViewModelTests: XCTestCase {
func testRefreshLeadsLoadsFirstPage() async throws {
let json = """
{"code":100000,"msg":"success","data":{"total":1,"list":[{"id":1,"user_phone":"13800138000","created_at":"2026-01-01"}]}}
""".data(using: .utf8)!
let api = OrderAPI(client: APIClient(environment: .testing, session: MockURLSession(responses: [json])))
let viewModel = CooperationOrderListViewModel()
await viewModel.refreshLeads(api: api)
XCTAssertEqual(viewModel.leads.count, 1)
XCTAssertFalse(viewModel.canLoadMore)
XCTAssertFalse(viewModel.isRefreshing)
}
func testSearchUsesKeywordQuery() async throws {
let json = """
{"code":100000,"msg":"success","data":{"total":0,"list":[]}}
""".data(using: .utf8)!
let session = MockURLSession(responses: [json])
let api = OrderAPI(client: APIClient(environment: .testing, session: session))
let viewModel = CooperationOrderListViewModel()
viewModel.onTabSelected(1)
viewModel.onSearchTextChange("张三")
await viewModel.refreshAcquisitionOrders(api: api)
let url = try XCTUnwrap(session.requests.first?.url?.absoluteString)
XCTAssertTrue(url.contains("acquisition-orders"))
XCTAssertTrue(url.contains("keyword="))
}
func testLoadMoreAppendsLeads() async throws {
let page1 = """
{"code":100000,"msg":"success","data":{"total":2,"list":[{"id":1,"user_phone":"13800138000"}]}}
""".data(using: .utf8)!
let page2 = """
{"code":100000,"msg":"success","data":{"total":2,"list":[{"id":2,"user_phone":"13800138001"}]}}
""".data(using: .utf8)!
let api = OrderAPI(client: APIClient(environment: .testing, session: MockURLSession(responses: [page1, page2])))
let viewModel = CooperationOrderListViewModel()
await viewModel.refreshLeads(api: api)
await viewModel.loadMore(api: api)
XCTAssertEqual(viewModel.leads.count, 2)
}
func testShouldLoadMoreNearEnd() {
let viewModel = CooperationOrderListViewModel()
XCTAssertFalse(viewModel.shouldLoadMore(at: 0))
}
}