Files
suixinkan_ios_new/suixinkanTests/CooperationOrderAPITests.swift
汉秋 1970572edd 迁移合作订单完整能力,并统一 AppRoleCode 角色权限与首页菜单展示。
新增 CooperationOrder 模块(双 Tab 列表、获客员绑定、主 Tab 扫码)、订单来源/带客单绑定及配套 API 测试;同步引入 roleCode 权限匹配与相关单元测试。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 13:33:00 +08:00

197 lines
9.2 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.

//
// CooperationOrderAPITests.swift
// suixinkanTests
//
// Created by Codex on 2026/6/29.
//
import XCTest
@testable import suixinkan
@MainActor
/// API
final class CooperationOrderAPITests: XCTestCase {
///
func testCooperativeSalersDecodesFixtureAndUsesExpectedQuery() async throws {
let session = CooperationRecordingURLSession(data: try TestFixture.data(named: "cooperative_salers_success"))
let api = CooperationOrderAPI(client: APIClient(session: session))
let response = try await api.cooperativeSalers(storeId: 66, page: 0, pageSize: 0)
XCTAssertEqual(response.total, 1)
XCTAssertEqual(response.page, 1)
XCTAssertEqual(response.pageSize, 50)
XCTAssertEqual(response.list.first?.displayId, 101)
XCTAssertEqual(response.list.first?.displayName, "管铜彬")
XCTAssertEqual(response.list.first?.displayPhone, "19281871413")
XCTAssertEqual(response.list.first?.bindingId, 5)
XCTAssertEqual(response.list.first?.shareCode, "INV-000101")
let request = try XCTUnwrap(session.requests.last)
XCTAssertEqual(request.httpMethod, "GET")
XCTAssertEqual(request.url?.path, "/api/yf-handset-app/photog/cooperative-salers")
let query = cooperationQueryItems(from: request)
XCTAssertEqual(query["store_id"], "66")
XCTAssertEqual(query["page"], "1")
XCTAssertEqual(query["page_size"], "1")
}
///
func testSaleUserInviteInfoDecodesFixture() async throws {
let session = CooperationRecordingURLSession(data: try TestFixture.data(named: "sale_user_invite_info_success"))
let api = CooperationOrderAPI(client: APIClient(session: session))
let info = try await api.saleUserInviteInfo(saleUserId: 101)
XCTAssertEqual(info.saleUserId, 101)
XCTAssertFalse(info.isBound)
XCTAssertEqual(info.photographerName, "陆久银")
XCTAssertEqual(info.photographerPhone, "18651857230")
XCTAssertEqual(info.salerName, "管铜彬")
XCTAssertEqual(info.salerPhone, "13222319413")
XCTAssertEqual(info.shareCode, "INV-000101")
XCTAssertEqual(info.subtitle, "确认与获客员绑定,可以绑定多个获客员")
XCTAssertEqual(info.title, "绑定获客员")
let request = try XCTUnwrap(session.requests.last)
XCTAssertEqual(request.url?.path, "/api/yf-handset-app/photog/sale-user/invite-info")
XCTAssertEqual(cooperationQueryItems(from: request)["sale_user_id"], "101")
}
/// 线
func testSaleUserReferralLeadsDecodesFixture() async throws {
let session = CooperationRecordingURLSession(data: try TestFixture.data(named: "sale_user_referral_leads_success"))
let api = CooperationOrderAPI(client: APIClient(session: session))
let response = try await api.saleUserReferralLeads(page: 2, pageSize: 20)
XCTAssertEqual(response.total, 1)
XCTAssertEqual(response.list.first?.displayId, "501")
XCTAssertEqual(response.list.first?.displayPhone, "13900000002")
XCTAssertEqual(response.list.first?.remark, "景区门口获客")
XCTAssertEqual(response.list.first?.displayImages.first, "https://example.com/lead.jpg")
let request = try XCTUnwrap(session.requests.last)
XCTAssertEqual(request.url?.path, "/api/yf-handset-app/photog/sale-user/referral-leads")
let query = cooperationQueryItems(from: request)
XCTAssertEqual(query["page"], "2")
XCTAssertEqual(query["page_size"], "20")
}
/// keyword
func testSaleUserAcquisitionOrdersDecodesFixtureWithKeyword() async throws {
let session = CooperationRecordingURLSession(data: try TestFixture.data(named: "sale_user_acquisition_orders_success"))
let api = CooperationOrderAPI(client: APIClient(session: session))
let response = try await api.saleUserAcquisitionOrders(keyword: "138", page: 1, pageSize: 10)
XCTAssertEqual(response.total, 1)
XCTAssertEqual(response.list.first?.orderNumber, "ACQ001")
XCTAssertEqual(response.list.first?.displayAmount, "299.00")
XCTAssertEqual(response.list.first?.displayCustomerPhone, "13700000003")
XCTAssertEqual(response.list.first?.displayPartner, "张三")
let request = try XCTUnwrap(session.requests.last)
XCTAssertEqual(request.url?.path, "/api/yf-handset-app/photog/sale-user/acquisition-orders")
let query = cooperationQueryItems(from: request)
XCTAssertEqual(query["keyword"], "138")
}
///
func testSaleUserReferralOrdersDecodesFixture() async throws {
let session = CooperationRecordingURLSession(data: try TestFixture.data(named: "sale_user_referral_orders_success"))
let api = CooperationOrderAPI(client: APIClient(session: session))
let response = try await api.saleUserReferralOrders(saleUserId: 101, page: 1, pageSize: 10)
XCTAssertEqual(response.total, 1)
XCTAssertEqual(response.page, 1)
XCTAssertEqual(response.pageSize, 50)
XCTAssertEqual(response.saler?.saleUserId, 101)
XCTAssertEqual(response.saler?.salerName, "管铜彬")
XCTAssertEqual(response.list.first?.id, 54)
XCTAssertEqual(response.list.first?.displayReferralOrderNo, "LD202606250009")
XCTAssertEqual(response.list.first?.userMobile, "13322222223")
XCTAssertEqual(response.list.first?.remark, "带客备注")
XCTAssertEqual(response.list.first?.statusLabel, "未完成")
XCTAssertEqual(response.list.first?.images.count, 1)
let request = try XCTUnwrap(session.requests.last)
XCTAssertEqual(request.url?.path, "/api/yf-handset-app/photog/sale-user/referral-orders")
let query = cooperationQueryItems(from: request)
XCTAssertEqual(query["sale_user_id"], "101")
}
///
func testSaleUserAcceptBindAndBindReferralOrderUsePostQuery() async throws {
let emptyData = try TestFixture.data(named: "empty_success")
let acceptSession = CooperationRecordingURLSession(data: emptyData)
let acceptAPI = CooperationOrderAPI(client: APIClient(session: acceptSession))
try await acceptAPI.saleUserAcceptBind(saleUserId: 101)
let acceptRequest = try XCTUnwrap(acceptSession.requests.last)
XCTAssertEqual(acceptRequest.httpMethod, "POST")
XCTAssertEqual(acceptRequest.url?.path, "/api/yf-handset-app/photog/sale-user/accept-bind")
XCTAssertEqual(cooperationQueryItems(from: acceptRequest)["sale_user_id"], "101")
XCTAssertNil(acceptRequest.httpBody)
let bindSession = CooperationRecordingURLSession(data: emptyData)
let bindAPI = CooperationOrderAPI(client: APIClient(session: bindSession))
try await bindAPI.saleUserBindReferralOrder(orderNumber: "ORD001", referralOrderNo: "REF001")
let bindRequest = try XCTUnwrap(bindSession.requests.last)
XCTAssertEqual(bindRequest.httpMethod, "POST")
XCTAssertEqual(bindRequest.url?.path, "/api/yf-handset-app/photog/sale-user/bind-referral-order")
let bindQuery = cooperationQueryItems(from: bindRequest)
XCTAssertEqual(bindQuery["order_number"], "ORD001")
XCTAssertEqual(bindQuery["referral_order_no"], "REF001")
XCTAssertNil(bindRequest.httpBody)
let statusSession = CooperationRecordingURLSession(data: emptyData)
let statusAPI = CooperationOrderAPI(client: APIClient(session: statusSession))
try await statusAPI.saleUserUpdateReferralOrderStatus(id: 15, status: 3)
let statusRequest = try XCTUnwrap(statusSession.requests.last)
XCTAssertEqual(statusRequest.httpMethod, "POST")
XCTAssertEqual(
statusRequest.url?.path,
"/api/yf-handset-app/photog/sale-user/referral-orders/15/status"
)
let statusBody = try XCTUnwrap(statusRequest.httpBody)
let statusJSON = try XCTUnwrap(JSONSerialization.jsonObject(with: statusBody) as? [String: Any])
XCTAssertEqual(statusJSON["status"] as? Int, 3)
}
}
/// URLSession API
private final class CooperationRecordingURLSession: URLSessionProtocol {
let data: Data
var statusCode: Int
private(set) var requests: [URLRequest] = []
init(data: Data, statusCode: Int = 200) {
self.data = data
self.statusCode = statusCode
}
/// HTTP
func data(for request: URLRequest) async throws -> (Data, URLResponse) {
requests.append(request)
return (
data,
HTTPURLResponse(url: request.url!, statusCode: statusCode, httpVersion: nil, headerFields: nil)!
)
}
}
private func cooperationQueryItems(from request: URLRequest) -> [String: String] {
guard let url = request.url,
let components = URLComponents(url: url, resolvingAgainstBaseURL: false) else {
return [:]
}
return Dictionary(uniqueKeysWithValues: (components.queryItems ?? []).compactMap { item in
item.value.map { (item.name, $0) }
})
}