fix: 优化相册素材状态与删除保护

This commit is contained in:
2026-08-17 16:04:03 +08:00
parent b127495e52
commit c34c4e1923
6 changed files with 254 additions and 81 deletions
+49 -5
View File
@@ -279,14 +279,22 @@ final class TravelAlbumDetailViewModelTests: XCTestCase {
XCTAssertEqual(TravelAlbumDisplayFormatter.creationTimeText(""), "--")
}
func testOnlyUnpurchasedMaterialCanBeSelected() {
func testAllMaterialsCanBeSelectedAndPurchasedTabSupportsSelectionMode() async {
let api = TravelAlbumMockAPI()
api.materialListResponses = [TravelAlbumListResponse(total: 1, list: [])]
let viewModel = TravelAlbumDetailViewModel(albumId: 2)
await viewModel.selectTab(.purchased, api: api)
viewModel.toggleSelectionMode()
viewModel.toggleMaterialSelection(TravelAlbumMaterial(id: 1, status: 2))
XCTAssertTrue(viewModel.selectedMaterialIds.isEmpty)
viewModel.toggleMaterialSelection(TravelAlbumMaterial(id: 1, isPurchased: true))
viewModel.toggleMaterialSelection(TravelAlbumMaterial(id: 2, isPurchased: false))
viewModel.toggleMaterialSelection(TravelAlbumMaterial(id: 1, status: 1))
XCTAssertEqual(viewModel.selectedMaterialIds, [1])
XCTAssertTrue(viewModel.isSelectionMode)
XCTAssertEqual(viewModel.selectedMaterialIds, [1, 2])
XCTAssertEqual(viewModel.selectedPurchasedMaterialCount, 1)
XCTAssertEqual(
viewModel.deleteSelectedConfirmationMessage,
"已选择 2 张素材,其中 1 张已购买。不会删除已购买的项目,只会删除 1 张未购买的项目。"
)
}
func testCompletingAIRetouchClearsSelectionModeAndSelectedMaterials() {
@@ -405,6 +413,42 @@ final class TravelAlbumDetailViewModelTests: XCTestCase {
XCTAssertFalse(viewModel.isSelectionMode)
XCTAssertTrue(viewModel.selectedMaterialIds.isEmpty)
}
func testDeleteSelectedMaterialsFiltersPurchasedItemsFromBatchRequest() async {
let api = TravelAlbumMockAPI()
api.materialListResponses = [
TravelAlbumListResponse(total: 0, list: []),
TravelAlbumListResponse(total: 0, list: []),
TravelAlbumListResponse(total: 0, list: []),
]
let viewModel = TravelAlbumDetailViewModel(albumId: 5)
viewModel.toggleSelectionMode()
viewModel.toggleMaterialSelection(TravelAlbumMaterial(id: 10, isPurchased: true))
viewModel.toggleMaterialSelection(TravelAlbumMaterial(id: 11, isPurchased: false))
viewModel.toggleMaterialSelection(TravelAlbumMaterial(id: 12, isPurchased: true))
await viewModel.deleteSelectedMaterials(api: api)
XCTAssertEqual(api.deletedMaterialIDBatches, [[11]])
XCTAssertFalse(viewModel.isSelectionMode)
XCTAssertTrue(viewModel.selectedMaterialIds.isEmpty)
}
func testDeleteSelectedMaterialsDoesNotRequestAPIWhenAllSelectedItemsArePurchased() async {
let api = TravelAlbumMockAPI()
let viewModel = TravelAlbumDetailViewModel(albumId: 5)
var message = ""
viewModel.onShowMessage = { message = $0 }
viewModel.toggleSelectionMode()
viewModel.toggleMaterialSelection(TravelAlbumMaterial(id: 10, isPurchased: true))
await viewModel.deleteSelectedMaterials(api: api)
XCTAssertTrue(api.deletedMaterialIDBatches.isEmpty)
XCTAssertEqual(message, "选中的素材均已购买,未删除任何项目")
XCTAssertTrue(viewModel.isSelectionMode)
XCTAssertEqual(viewModel.selectedMaterialIds, [10])
}
}
/// 有线传输 ViewModel 测试。