重构相册详情为信息卡片、Tab 筛选、排序、批量删除与底部上传栏;修复网格重叠、禁用按钮蒙层,并支持点击预览大图。同步扩展素材列表 API 与 ViewModel 分页逻辑,并优化有线传图缩略图与传输性能。 Co-authored-by: Cursor <cursoragent@cursor.com>
81 lines
3.0 KiB
Swift
81 lines
3.0 KiB
Swift
//
|
||
// WiredTransferPhotoGroupingTests.swift
|
||
// suixinkanTests
|
||
//
|
||
|
||
import XCTest
|
||
@testable import suixinkan
|
||
|
||
/// 有线传图照片分组逻辑测试。
|
||
final class WiredTransferPhotoGroupingTests: XCTestCase {
|
||
/// 测试 30 分钟时间段分组与侧栏构建。
|
||
func testBuildPhotoSectionsAndSidebarGroups() {
|
||
let photos = [
|
||
makePhoto(id: "1", capturedAt: "2026-05-20 12:05:18", status: .uploaded),
|
||
makePhoto(id: "2", capturedAt: "2026-05-20 12:18:06", status: .pending),
|
||
makePhoto(id: "3", capturedAt: "2026-05-20 11:55:51", status: .failed),
|
||
]
|
||
|
||
let sections = photos.buildPhotoSections()
|
||
XCTAssertEqual(sections.count, 2)
|
||
XCTAssertEqual(sections[0].photos.count, 2)
|
||
XCTAssertEqual(sections[0].photos[0].id, "2")
|
||
XCTAssertTrue(sections[0].headerTitle.contains("12:00 - 12:30"))
|
||
|
||
let sidebar = photos.buildSidebarGroups()
|
||
XCTAssertEqual(sidebar.count, 1)
|
||
XCTAssertEqual(sidebar[0].slots.count, 2)
|
||
XCTAssertEqual(sidebar[0].slots[0].photoCount, 2)
|
||
}
|
||
|
||
/// 测试今日拍摄筛选。
|
||
func testIsCapturedTodayUsesLocalCalendar() {
|
||
let formatter = DateFormatter()
|
||
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
|
||
formatter.locale = Locale(identifier: "zh_CN")
|
||
let today = formatter.string(from: Date())
|
||
|
||
let photo = makePhoto(id: "today", capturedAt: today, status: .pending)
|
||
XCTAssertTrue(photo.isCapturedToday())
|
||
XCTAssertFalse(makePhoto(id: "old", capturedAt: "2020-01-01 10:00:00", status: .pending).isCapturedToday())
|
||
}
|
||
|
||
/// 测试按拍摄时间倒序排列,最新照片在最前。
|
||
func testSortedByCaptureTimeDescending() {
|
||
let photos = [
|
||
makePhoto(id: "1", capturedAt: "2026-05-20 12:05:18", status: .uploaded),
|
||
makePhoto(id: "2", capturedAt: "2026-05-20 12:18:06", status: .pending),
|
||
makePhoto(id: "3", capturedAt: "2026-05-20 11:55:51", status: .failed),
|
||
]
|
||
|
||
XCTAssertEqual(photos.sortedByCaptureTimeDescending().map(\.id), ["2", "1", "3"])
|
||
}
|
||
|
||
/// 测试 Tab 计数与 pending 可选集合。
|
||
func testTransferTabCountsAndSelectablePendingIDs() {
|
||
let photos = [
|
||
makePhoto(id: "1", capturedAt: "2026-05-20 12:05:18", status: .uploaded),
|
||
makePhoto(id: "2", capturedAt: "2026-05-20 12:18:06", status: .pending),
|
||
makePhoto(id: "3", capturedAt: "2026-05-20 12:35:44", status: .failed),
|
||
]
|
||
XCTAssertEqual(photos.transferTabCounts, [3, 1, 1])
|
||
XCTAssertEqual(photos.selectablePendingPhotoIDs, ["2"])
|
||
}
|
||
|
||
private func makePhoto(
|
||
id: String,
|
||
capturedAt: String,
|
||
status: WiredTransferUploadStatus
|
||
) -> WiredTransferPhotoItem {
|
||
WiredTransferPhotoItem(
|
||
id: id,
|
||
fileName: "\(id).JPG",
|
||
thumbnailURL: "",
|
||
capturedAt: capturedAt,
|
||
fileSizeText: "1.00 MB",
|
||
resolutionText: "4032x3024",
|
||
status: status
|
||
)
|
||
}
|
||
}
|