Files
suixinkan_ios_new/suixinkanTests/MainTabBadgeViewModelTests.swift
汉秋 5541a0b106 新增自定义主 TabBar 与全局扫码核销流程
引入可配置的自定义 TabBar(含订单角标)、中央扫码入口跳转核销订单页,并更新迁移清单中最近完成的模块。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-23 10:52:45 +08:00

107 lines
3.8 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.

//
// MainTabBadgeViewModelTests.swift
// suixinkanTests
//
// Created by Codex on 2026/6/23.
//
import XCTest
@testable import suixinkan
@MainActor
/// Tab
final class MainTabBadgeViewModelTests: XCTestCase {
///
func testMissingScenicClearsBadgeWithoutRequestingAPI() async {
let api = MockMainTabOrderService()
let viewModel = MainTabBadgeViewModel()
await viewModel.refreshPendingWriteOffCount(api: api, scenicId: nil, storeId: 66)
XCTAssertNil(viewModel.pendingWriteOffCount)
XCTAssertTrue(api.writeOffListCalls.isEmpty)
}
///
func testSuccessfulRefreshStoresPendingWriteOffCount() async {
let api = MockMainTabOrderService()
api.writeOffResponse = ListPayload<WriteOffOrderItem>(total: 8, list: [])
let viewModel = MainTabBadgeViewModel()
await viewModel.refreshPendingWriteOffCount(api: api, scenicId: 88, storeId: 66)
XCTAssertEqual(viewModel.pendingWriteOffCount, 8)
XCTAssertEqual(api.writeOffListCalls, [.init(scenicId: 88, storeId: 66, page: 1, pageSize: 1)])
}
/// 99
func testSuccessfulRefreshCapsPendingWriteOffCountAtNinetyNine() async {
let api = MockMainTabOrderService()
api.writeOffResponse = ListPayload<WriteOffOrderItem>(total: 120, list: [])
let viewModel = MainTabBadgeViewModel()
await viewModel.refreshPendingWriteOffCount(api: api, scenicId: 88, storeId: nil)
XCTAssertEqual(viewModel.pendingWriteOffCount, 99)
}
///
func testRefreshFailureClearsBadge() async {
let api = MockMainTabOrderService()
api.writeOffError = APIError.httpStatus(500, "server error")
let viewModel = MainTabBadgeViewModel()
await viewModel.refreshPendingWriteOffCount(api: api, scenicId: 88, storeId: 66)
XCTAssertNil(viewModel.pendingWriteOffCount)
XCTAssertEqual(api.writeOffListCalls.count, 1)
}
}
@MainActor
/// Tab
private final class MockMainTabOrderService: OrderServing {
struct WriteOffListCall: Equatable {
let scenicId: Int
let storeId: Int?
let page: Int
let pageSize: Int
}
var writeOffResponse = ListPayload<WriteOffOrderItem>(total: 0, list: [])
var writeOffError: Error?
private(set) var writeOffListCalls: [WriteOffListCall] = []
/// 使
func orderList(
scenicId: Int,
page: Int,
pageSize: Int,
orderStatus: Int?,
userPhone: String?,
startTime: String?,
endTime: String?,
isRefined: Int?,
isScenicAdmin: Bool
) async throws -> ListPayload<OrderEntity> {
ListPayload(total: 0, list: [])
}
///
func writeOffList(scenicId: Int, storeId: Int?, page: Int, pageSize: Int) async throws -> ListPayload<WriteOffOrderItem> {
writeOffListCalls.append(.init(scenicId: scenicId, storeId: storeId, page: page, pageSize: pageSize))
if let writeOffError {
throw writeOffError
}
return writeOffResponse
}
///
func writeOff(orderNumber: String) async throws {}
///
func storeOrderDetail(storeId: Int, orderNumber: String) async throws -> StoreOrderDetailResponse {
try TestFixture.payload(StoreOrderDetailResponse.self, named: "store_order_detail_success")
}
}